| 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/spdy_proxy_client_socket.h" | 5 #include "net/spdy/spdy_proxy_client_socket.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "net/base/address_list.h" | 10 #include "net/base/address_list.h" |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 spdy::SpdyFrame* SpdyProxyClientSocketTest::ConstructBodyFrame(const char* data, | 411 spdy::SpdyFrame* SpdyProxyClientSocketTest::ConstructBodyFrame(const char* data, |
| 412 int length) { | 412 int length) { |
| 413 return framer_.CreateDataFrame(kStreamId, data, length, spdy::DATA_FLAG_NONE); | 413 return framer_.CreateDataFrame(kStreamId, data, length, spdy::DATA_FLAG_NONE); |
| 414 } | 414 } |
| 415 | 415 |
| 416 // ----------- Connect | 416 // ----------- Connect |
| 417 | 417 |
| 418 TEST_F(SpdyProxyClientSocketTest, ConnectSendsCorrectRequest) { | 418 TEST_F(SpdyProxyClientSocketTest, ConnectSendsCorrectRequest) { |
| 419 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 419 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 420 MockWrite writes[] = { | 420 MockWrite writes[] = { |
| 421 CreateMockWrite(*conn, 0, false), | 421 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 422 }; | 422 }; |
| 423 | 423 |
| 424 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 424 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 425 MockRead reads[] = { | 425 MockRead reads[] = { |
| 426 CreateMockRead(*resp, 1, true), | 426 CreateMockRead(*resp, 1, ASYNC), |
| 427 MockRead(true, 0, 3), // EOF | 427 MockRead(ASYNC, 0, 3), // EOF |
| 428 }; | 428 }; |
| 429 | 429 |
| 430 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 430 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 431 | 431 |
| 432 ASSERT_FALSE(sock_->IsConnected()); | 432 ASSERT_FALSE(sock_->IsConnected()); |
| 433 | 433 |
| 434 AssertConnectSucceeds(); | 434 AssertConnectSucceeds(); |
| 435 | 435 |
| 436 AssertConnectionEstablished(); | 436 AssertConnectionEstablished(); |
| 437 } | 437 } |
| 438 | 438 |
| 439 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { | 439 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { |
| 440 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 440 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 441 MockWrite writes[] = { | 441 MockWrite writes[] = { |
| 442 CreateMockWrite(*conn, 0, false), | 442 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 443 }; | 443 }; |
| 444 | 444 |
| 445 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame()); | 445 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame()); |
| 446 MockRead reads[] = { | 446 MockRead reads[] = { |
| 447 CreateMockRead(*resp, 1, true), | 447 CreateMockRead(*resp, 1, ASYNC), |
| 448 MockRead(true, 0, 3), // EOF | 448 MockRead(ASYNC, 0, 3), // EOF |
| 449 }; | 449 }; |
| 450 | 450 |
| 451 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 451 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 452 | 452 |
| 453 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); | 453 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); |
| 454 | 454 |
| 455 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | 455 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
| 456 ASSERT_TRUE(response != NULL); | 456 ASSERT_TRUE(response != NULL); |
| 457 ASSERT_EQ(407, response->headers->response_code()); | 457 ASSERT_EQ(407, response->headers->response_code()); |
| 458 ASSERT_EQ("Proxy Authentication Required", | 458 ASSERT_EQ("Proxy Authentication Required", |
| 459 response->headers->GetStatusText()); | 459 response->headers->GetStatusText()); |
| 460 } | 460 } |
| 461 | 461 |
| 462 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { | 462 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { |
| 463 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectAuthRequestFrame()); | 463 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectAuthRequestFrame()); |
| 464 MockWrite writes[] = { | 464 MockWrite writes[] = { |
| 465 CreateMockWrite(*conn, 0, false), | 465 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 466 }; | 466 }; |
| 467 | 467 |
| 468 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 468 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 469 MockRead reads[] = { | 469 MockRead reads[] = { |
| 470 CreateMockRead(*resp, 1, true), | 470 CreateMockRead(*resp, 1, ASYNC), |
| 471 MockRead(true, 0, 3), // EOF | 471 MockRead(ASYNC, 0, 3), // EOF |
| 472 }; | 472 }; |
| 473 | 473 |
| 474 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 474 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 475 AddAuthToCache(); | 475 AddAuthToCache(); |
| 476 | 476 |
| 477 AssertConnectSucceeds(); | 477 AssertConnectSucceeds(); |
| 478 | 478 |
| 479 AssertConnectionEstablished(); | 479 AssertConnectionEstablished(); |
| 480 } | 480 } |
| 481 | 481 |
| 482 TEST_F(SpdyProxyClientSocketTest, ConnectFails) { | 482 TEST_F(SpdyProxyClientSocketTest, ConnectFails) { |
| 483 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 483 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 484 MockWrite writes[] = { | 484 MockWrite writes[] = { |
| 485 CreateMockWrite(*conn, 0, false), | 485 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 486 }; | 486 }; |
| 487 | 487 |
| 488 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 488 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 489 MockRead reads[] = { | 489 MockRead reads[] = { |
| 490 MockRead(true, 0, 1), // EOF | 490 MockRead(ASYNC, 0, 1), // EOF |
| 491 }; | 491 }; |
| 492 | 492 |
| 493 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 493 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 494 | 494 |
| 495 ASSERT_FALSE(sock_->IsConnected()); | 495 ASSERT_FALSE(sock_->IsConnected()); |
| 496 | 496 |
| 497 AssertConnectFails(ERR_CONNECTION_CLOSED); | 497 AssertConnectFails(ERR_CONNECTION_CLOSED); |
| 498 | 498 |
| 499 ASSERT_FALSE(sock_->IsConnected()); | 499 ASSERT_FALSE(sock_->IsConnected()); |
| 500 } | 500 } |
| 501 | 501 |
| 502 // ----------- WasEverUsed | 502 // ----------- WasEverUsed |
| 503 | 503 |
| 504 TEST_F(SpdyProxyClientSocketTest, WasEverUsedReturnsCorrectValues) { | 504 TEST_F(SpdyProxyClientSocketTest, WasEverUsedReturnsCorrectValues) { |
| 505 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 505 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 506 MockWrite writes[] = { | 506 MockWrite writes[] = { |
| 507 CreateMockWrite(*conn, 0, false), | 507 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 508 }; | 508 }; |
| 509 | 509 |
| 510 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 510 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 511 MockRead reads[] = { | 511 MockRead reads[] = { |
| 512 CreateMockRead(*resp, 1, true), | 512 CreateMockRead(*resp, 1, ASYNC), |
| 513 MockRead(true, 0, 2), // EOF | 513 MockRead(ASYNC, 0, 2), // EOF |
| 514 }; | 514 }; |
| 515 | 515 |
| 516 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 516 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 517 | 517 |
| 518 EXPECT_FALSE(sock_->WasEverUsed()); | 518 EXPECT_FALSE(sock_->WasEverUsed()); |
| 519 AssertConnectSucceeds(); | 519 AssertConnectSucceeds(); |
| 520 EXPECT_TRUE(sock_->WasEverUsed()); | 520 EXPECT_TRUE(sock_->WasEverUsed()); |
| 521 sock_->Disconnect(); | 521 sock_->Disconnect(); |
| 522 EXPECT_TRUE(sock_->WasEverUsed()); | 522 EXPECT_TRUE(sock_->WasEverUsed()); |
| 523 } | 523 } |
| 524 | 524 |
| 525 // ----------- GetPeerAddress | 525 // ----------- GetPeerAddress |
| 526 | 526 |
| 527 TEST_F(SpdyProxyClientSocketTest, GetPeerAddressReturnsCorrectValues) { | 527 TEST_F(SpdyProxyClientSocketTest, GetPeerAddressReturnsCorrectValues) { |
| 528 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 528 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 529 MockWrite writes[] = { | 529 MockWrite writes[] = { |
| 530 CreateMockWrite(*conn, 0, false), | 530 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 531 }; | 531 }; |
| 532 | 532 |
| 533 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 533 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 534 MockRead reads[] = { | 534 MockRead reads[] = { |
| 535 CreateMockRead(*resp, 1, true), | 535 CreateMockRead(*resp, 1, ASYNC), |
| 536 MockRead(true, 0, 2), // EOF | 536 MockRead(ASYNC, 0, 2), // EOF |
| 537 }; | 537 }; |
| 538 | 538 |
| 539 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 539 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 540 | 540 |
| 541 net::AddressList addr; | 541 net::AddressList addr; |
| 542 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); | 542 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); |
| 543 | 543 |
| 544 AssertConnectSucceeds(); | 544 AssertConnectSucceeds(); |
| 545 EXPECT_TRUE(sock_->IsConnected()); | 545 EXPECT_TRUE(sock_->IsConnected()); |
| 546 EXPECT_EQ(OK, sock_->GetPeerAddress(&addr)); | 546 EXPECT_EQ(OK, sock_->GetPeerAddress(&addr)); |
| 547 | 547 |
| 548 Run(1); | 548 Run(1); |
| 549 | 549 |
| 550 EXPECT_FALSE(sock_->IsConnected()); | 550 EXPECT_FALSE(sock_->IsConnected()); |
| 551 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); | 551 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); |
| 552 | 552 |
| 553 sock_->Disconnect(); | 553 sock_->Disconnect(); |
| 554 | 554 |
| 555 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); | 555 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr)); |
| 556 } | 556 } |
| 557 | 557 |
| 558 // ----------- Write | 558 // ----------- Write |
| 559 | 559 |
| 560 TEST_F(SpdyProxyClientSocketTest, WriteSendsDataInDataFrame) { | 560 TEST_F(SpdyProxyClientSocketTest, WriteSendsDataInDataFrame) { |
| 561 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 561 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 562 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 562 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 563 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 563 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 564 MockWrite writes[] = { | 564 MockWrite writes[] = { |
| 565 CreateMockWrite(*conn, 0, false), | 565 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 566 CreateMockWrite(*msg1, 2, false), | 566 CreateMockWrite(*msg1, 2, SYNCHRONOUS), |
| 567 CreateMockWrite(*msg2, 3, false), | 567 CreateMockWrite(*msg2, 3, SYNCHRONOUS), |
| 568 }; | 568 }; |
| 569 | 569 |
| 570 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 570 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 571 MockRead reads[] = { | 571 MockRead reads[] = { |
| 572 CreateMockRead(*resp, 1, true), | 572 CreateMockRead(*resp, 1, ASYNC), |
| 573 MockRead(true, 0, 4), // EOF | 573 MockRead(ASYNC, 0, 4), // EOF |
| 574 }; | 574 }; |
| 575 | 575 |
| 576 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 576 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 577 | 577 |
| 578 AssertConnectSucceeds(); | 578 AssertConnectSucceeds(); |
| 579 | 579 |
| 580 AssertAsyncWriteSucceeds(kMsg1, kLen1); | 580 AssertAsyncWriteSucceeds(kMsg1, kLen1); |
| 581 AssertAsyncWriteSucceeds(kMsg2, kLen2); | 581 AssertAsyncWriteSucceeds(kMsg2, kLen2); |
| 582 } | 582 } |
| 583 | 583 |
| 584 TEST_F(SpdyProxyClientSocketTest, WriteSplitsLargeDataIntoMultipleFrames) { | 584 TEST_F(SpdyProxyClientSocketTest, WriteSplitsLargeDataIntoMultipleFrames) { |
| 585 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); | 585 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
| 586 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 586 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 587 scoped_ptr<spdy::SpdyFrame> chunk(ConstructBodyFrame(chunk_data.data(), | 587 scoped_ptr<spdy::SpdyFrame> chunk(ConstructBodyFrame(chunk_data.data(), |
| 588 chunk_data.length())); | 588 chunk_data.length())); |
| 589 MockWrite writes[] = { | 589 MockWrite writes[] = { |
| 590 CreateMockWrite(*conn, 0, false), | 590 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 591 CreateMockWrite(*chunk, 2, false), | 591 CreateMockWrite(*chunk, 2, SYNCHRONOUS), |
| 592 CreateMockWrite(*chunk, 3, false), | 592 CreateMockWrite(*chunk, 3, SYNCHRONOUS), |
| 593 CreateMockWrite(*chunk, 4, false) | 593 CreateMockWrite(*chunk, 4, SYNCHRONOUS) |
| 594 }; | 594 }; |
| 595 | 595 |
| 596 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 596 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 597 MockRead reads[] = { | 597 MockRead reads[] = { |
| 598 CreateMockRead(*resp, 1, true), | 598 CreateMockRead(*resp, 1, ASYNC), |
| 599 MockRead(true, 0, 5), // EOF | 599 MockRead(ASYNC, 0, 5), // EOF |
| 600 }; | 600 }; |
| 601 | 601 |
| 602 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 602 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 603 | 603 |
| 604 AssertConnectSucceeds(); | 604 AssertConnectSucceeds(); |
| 605 | 605 |
| 606 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x'); | 606 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x'); |
| 607 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(big_data.data(), | 607 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(big_data.data(), |
| 608 big_data.length())); | 608 big_data.length())); |
| 609 | 609 |
| 610 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(buf, buf->size(), | 610 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(buf, buf->size(), |
| 611 write_callback_.callback())); | 611 write_callback_.callback())); |
| 612 data_->RunFor(3); | 612 data_->RunFor(3); |
| 613 | 613 |
| 614 EXPECT_EQ(buf->size(), write_callback_.WaitForResult()); | 614 EXPECT_EQ(buf->size(), write_callback_.WaitForResult()); |
| 615 } | 615 } |
| 616 | 616 |
| 617 // ----------- Read | 617 // ----------- Read |
| 618 | 618 |
| 619 TEST_F(SpdyProxyClientSocketTest, ReadReadsDataInDataFrame) { | 619 TEST_F(SpdyProxyClientSocketTest, ReadReadsDataInDataFrame) { |
| 620 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 620 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 621 MockWrite writes[] = { | 621 MockWrite writes[] = { |
| 622 CreateMockWrite(*conn, 0, false), | 622 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 623 }; | 623 }; |
| 624 | 624 |
| 625 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 625 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 626 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 626 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 627 MockRead reads[] = { | 627 MockRead reads[] = { |
| 628 CreateMockRead(*resp, 1, true), | 628 CreateMockRead(*resp, 1, ASYNC), |
| 629 CreateMockRead(*msg1, 2, true), | 629 CreateMockRead(*msg1, 2, ASYNC), |
| 630 MockRead(true, 0, 3), // EOF | 630 MockRead(ASYNC, 0, 3), // EOF |
| 631 }; | 631 }; |
| 632 | 632 |
| 633 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 633 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 634 | 634 |
| 635 AssertConnectSucceeds(); | 635 AssertConnectSucceeds(); |
| 636 | 636 |
| 637 Run(1); // SpdySession consumes the next read and sends it to | 637 Run(1); // SpdySession consumes the next read and sends it to |
| 638 // sock_ to be buffered. | 638 // sock_ to be buffered. |
| 639 AssertSyncReadEquals(kMsg1, kLen1); | 639 AssertSyncReadEquals(kMsg1, kLen1); |
| 640 } | 640 } |
| 641 | 641 |
| 642 TEST_F(SpdyProxyClientSocketTest, ReadDataFromBufferedFrames) { | 642 TEST_F(SpdyProxyClientSocketTest, ReadDataFromBufferedFrames) { |
| 643 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 643 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 644 MockWrite writes[] = { | 644 MockWrite writes[] = { |
| 645 CreateMockWrite(*conn, 0, false), | 645 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 646 }; | 646 }; |
| 647 | 647 |
| 648 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 648 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 649 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 649 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 650 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 650 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 651 MockRead reads[] = { | 651 MockRead reads[] = { |
| 652 CreateMockRead(*resp, 1, true), | 652 CreateMockRead(*resp, 1, ASYNC), |
| 653 CreateMockRead(*msg1, 2, true), | 653 CreateMockRead(*msg1, 2, ASYNC), |
| 654 CreateMockRead(*msg2, 3, true), | 654 CreateMockRead(*msg2, 3, ASYNC), |
| 655 MockRead(true, 0, 4), // EOF | 655 MockRead(ASYNC, 0, 4), // EOF |
| 656 }; | 656 }; |
| 657 | 657 |
| 658 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 658 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 659 | 659 |
| 660 AssertConnectSucceeds(); | 660 AssertConnectSucceeds(); |
| 661 | 661 |
| 662 Run(1); // SpdySession consumes the next read and sends it to | 662 Run(1); // SpdySession consumes the next read and sends it to |
| 663 // sock_ to be buffered. | 663 // sock_ to be buffered. |
| 664 AssertSyncReadEquals(kMsg1, kLen1); | 664 AssertSyncReadEquals(kMsg1, kLen1); |
| 665 Run(1); // SpdySession consumes the next read and sends it to | 665 Run(1); // SpdySession consumes the next read and sends it to |
| 666 // sock_ to be buffered. | 666 // sock_ to be buffered. |
| 667 AssertSyncReadEquals(kMsg2, kLen2); | 667 AssertSyncReadEquals(kMsg2, kLen2); |
| 668 } | 668 } |
| 669 | 669 |
| 670 TEST_F(SpdyProxyClientSocketTest, ReadDataMultipleBufferedFrames) { | 670 TEST_F(SpdyProxyClientSocketTest, ReadDataMultipleBufferedFrames) { |
| 671 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 671 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 672 MockWrite writes[] = { | 672 MockWrite writes[] = { |
| 673 CreateMockWrite(*conn, 0, false), | 673 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 674 }; | 674 }; |
| 675 | 675 |
| 676 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 676 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 677 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 677 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 678 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 678 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 679 MockRead reads[] = { | 679 MockRead reads[] = { |
| 680 CreateMockRead(*resp, 1, true), | 680 CreateMockRead(*resp, 1, ASYNC), |
| 681 CreateMockRead(*msg1, 2, true), | 681 CreateMockRead(*msg1, 2, ASYNC), |
| 682 CreateMockRead(*msg2, 3, true), | 682 CreateMockRead(*msg2, 3, ASYNC), |
| 683 MockRead(true, 0, 4), // EOF | 683 MockRead(ASYNC, 0, 4), // EOF |
| 684 }; | 684 }; |
| 685 | 685 |
| 686 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 686 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 687 | 687 |
| 688 AssertConnectSucceeds(); | 688 AssertConnectSucceeds(); |
| 689 | 689 |
| 690 Run(2); // SpdySession consumes the next two reads and sends then to | 690 Run(2); // SpdySession consumes the next two reads and sends then to |
| 691 // sock_ to be buffered. | 691 // sock_ to be buffered. |
| 692 AssertSyncReadEquals(kMsg1, kLen1); | 692 AssertSyncReadEquals(kMsg1, kLen1); |
| 693 AssertSyncReadEquals(kMsg2, kLen2); | 693 AssertSyncReadEquals(kMsg2, kLen2); |
| 694 } | 694 } |
| 695 | 695 |
| 696 TEST_F(SpdyProxyClientSocketTest, LargeReadWillMergeDataFromDifferentFrames) { | 696 TEST_F(SpdyProxyClientSocketTest, LargeReadWillMergeDataFromDifferentFrames) { |
| 697 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 697 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 698 MockWrite writes[] = { | 698 MockWrite writes[] = { |
| 699 CreateMockWrite(*conn, 0, false), | 699 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 700 }; | 700 }; |
| 701 | 701 |
| 702 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 702 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 703 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 703 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 704 scoped_ptr<spdy::SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); | 704 scoped_ptr<spdy::SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); |
| 705 MockRead reads[] = { | 705 MockRead reads[] = { |
| 706 CreateMockRead(*resp, 1, true), | 706 CreateMockRead(*resp, 1, ASYNC), |
| 707 CreateMockRead(*msg3, 2, true), | 707 CreateMockRead(*msg3, 2, ASYNC), |
| 708 CreateMockRead(*msg3, 3, true), | 708 CreateMockRead(*msg3, 3, ASYNC), |
| 709 MockRead(true, 0, 4), // EOF | 709 MockRead(ASYNC, 0, 4), // EOF |
| 710 }; | 710 }; |
| 711 | 711 |
| 712 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 712 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 713 | 713 |
| 714 AssertConnectSucceeds(); | 714 AssertConnectSucceeds(); |
| 715 | 715 |
| 716 Run(2); // SpdySession consumes the next two reads and sends then to | 716 Run(2); // SpdySession consumes the next two reads and sends then to |
| 717 // sock_ to be buffered. | 717 // sock_ to be buffered. |
| 718 // The payload from two data frames, each with kMsg3 will be combined | 718 // The payload from two data frames, each with kMsg3 will be combined |
| 719 // together into a single read(). | 719 // together into a single read(). |
| 720 AssertSyncReadEquals(kMsg33, kLen33); | 720 AssertSyncReadEquals(kMsg33, kLen33); |
| 721 } | 721 } |
| 722 | 722 |
| 723 TEST_F(SpdyProxyClientSocketTest, MultipleShortReadsThenMoreRead) { | 723 TEST_F(SpdyProxyClientSocketTest, MultipleShortReadsThenMoreRead) { |
| 724 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 724 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 725 MockWrite writes[] = { | 725 MockWrite writes[] = { |
| 726 CreateMockWrite(*conn, 0, false), | 726 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 727 }; | 727 }; |
| 728 | 728 |
| 729 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 729 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 730 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 730 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 731 scoped_ptr<spdy::SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); | 731 scoped_ptr<spdy::SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); |
| 732 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 732 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 733 MockRead reads[] = { | 733 MockRead reads[] = { |
| 734 CreateMockRead(*resp, 1, true), | 734 CreateMockRead(*resp, 1, ASYNC), |
| 735 CreateMockRead(*msg1, 2, true), | 735 CreateMockRead(*msg1, 2, ASYNC), |
| 736 CreateMockRead(*msg3, 3, true), | 736 CreateMockRead(*msg3, 3, ASYNC), |
| 737 CreateMockRead(*msg3, 4, true), | 737 CreateMockRead(*msg3, 4, ASYNC), |
| 738 CreateMockRead(*msg2, 5, true), | 738 CreateMockRead(*msg2, 5, ASYNC), |
| 739 MockRead(true, 0, 6), // EOF | 739 MockRead(ASYNC, 0, 6), // EOF |
| 740 }; | 740 }; |
| 741 | 741 |
| 742 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 742 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 743 | 743 |
| 744 AssertConnectSucceeds(); | 744 AssertConnectSucceeds(); |
| 745 | 745 |
| 746 Run(4); // SpdySession consumes the next four reads and sends then to | 746 Run(4); // SpdySession consumes the next four reads and sends then to |
| 747 // sock_ to be buffered. | 747 // sock_ to be buffered. |
| 748 AssertSyncReadEquals(kMsg1, kLen1); | 748 AssertSyncReadEquals(kMsg1, kLen1); |
| 749 // The payload from two data frames, each with kMsg3 will be combined | 749 // The payload from two data frames, each with kMsg3 will be combined |
| 750 // together into a single read(). | 750 // together into a single read(). |
| 751 AssertSyncReadEquals(kMsg33, kLen33); | 751 AssertSyncReadEquals(kMsg33, kLen33); |
| 752 AssertSyncReadEquals(kMsg2, kLen2); | 752 AssertSyncReadEquals(kMsg2, kLen2); |
| 753 } | 753 } |
| 754 | 754 |
| 755 TEST_F(SpdyProxyClientSocketTest, ReadWillSplitDataFromLargeFrame) { | 755 TEST_F(SpdyProxyClientSocketTest, ReadWillSplitDataFromLargeFrame) { |
| 756 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 756 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 757 MockWrite writes[] = { | 757 MockWrite writes[] = { |
| 758 CreateMockWrite(*conn, 0, false), | 758 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 759 }; | 759 }; |
| 760 | 760 |
| 761 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 761 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 762 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 762 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 763 scoped_ptr<spdy::SpdyFrame> msg33(ConstructBodyFrame(kMsg33, kLen33)); | 763 scoped_ptr<spdy::SpdyFrame> msg33(ConstructBodyFrame(kMsg33, kLen33)); |
| 764 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 764 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 765 MockRead reads[] = { | 765 MockRead reads[] = { |
| 766 CreateMockRead(*resp, 1, true), | 766 CreateMockRead(*resp, 1, ASYNC), |
| 767 CreateMockRead(*msg1, 2, true), | 767 CreateMockRead(*msg1, 2, ASYNC), |
| 768 CreateMockRead(*msg33, 3, true), | 768 CreateMockRead(*msg33, 3, ASYNC), |
| 769 MockRead(true, 0, 4), // EOF | 769 MockRead(ASYNC, 0, 4), // EOF |
| 770 }; | 770 }; |
| 771 | 771 |
| 772 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 772 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 773 | 773 |
| 774 AssertConnectSucceeds(); | 774 AssertConnectSucceeds(); |
| 775 | 775 |
| 776 Run(2); // SpdySession consumes the next two reads and sends then to | 776 Run(2); // SpdySession consumes the next two reads and sends then to |
| 777 // sock_ to be buffered. | 777 // sock_ to be buffered. |
| 778 AssertSyncReadEquals(kMsg1, kLen1); | 778 AssertSyncReadEquals(kMsg1, kLen1); |
| 779 // The payload from the single large data frame will be read across | 779 // The payload from the single large data frame will be read across |
| 780 // two different reads. | 780 // two different reads. |
| 781 AssertSyncReadEquals(kMsg3, kLen3); | 781 AssertSyncReadEquals(kMsg3, kLen3); |
| 782 AssertSyncReadEquals(kMsg3, kLen3); | 782 AssertSyncReadEquals(kMsg3, kLen3); |
| 783 } | 783 } |
| 784 | 784 |
| 785 TEST_F(SpdyProxyClientSocketTest, MultipleReadsFromSameLargeFrame) { | 785 TEST_F(SpdyProxyClientSocketTest, MultipleReadsFromSameLargeFrame) { |
| 786 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 786 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 787 MockWrite writes[] = { | 787 MockWrite writes[] = { |
| 788 CreateMockWrite(*conn, 0, false), | 788 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 789 }; | 789 }; |
| 790 | 790 |
| 791 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 791 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 792 scoped_ptr<spdy::SpdyFrame> msg333(ConstructBodyFrame(kMsg333, kLen333)); | 792 scoped_ptr<spdy::SpdyFrame> msg333(ConstructBodyFrame(kMsg333, kLen333)); |
| 793 MockRead reads[] = { | 793 MockRead reads[] = { |
| 794 CreateMockRead(*resp, 1, true), | 794 CreateMockRead(*resp, 1, ASYNC), |
| 795 CreateMockRead(*msg333, 2, true), | 795 CreateMockRead(*msg333, 2, ASYNC), |
| 796 MockRead(true, 0, 3), // EOF | 796 MockRead(ASYNC, 0, 3), // EOF |
| 797 }; | 797 }; |
| 798 | 798 |
| 799 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 799 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 800 | 800 |
| 801 AssertConnectSucceeds(); | 801 AssertConnectSucceeds(); |
| 802 | 802 |
| 803 Run(1); // SpdySession consumes the next read and sends it to | 803 Run(1); // SpdySession consumes the next read and sends it to |
| 804 // sock_ to be buffered. | 804 // sock_ to be buffered. |
| 805 // The payload from the single large data frame will be read across | 805 // The payload from the single large data frame will be read across |
| 806 // two different reads. | 806 // two different reads. |
| 807 AssertSyncReadEquals(kMsg33, kLen33); | 807 AssertSyncReadEquals(kMsg33, kLen33); |
| 808 | 808 |
| 809 // Now attempt to do a read of more data than remains buffered | 809 // Now attempt to do a read of more data than remains buffered |
| 810 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33)); | 810 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33)); |
| 811 ASSERT_EQ(kLen3, sock_->Read(buf, kLen33, read_callback_.callback())); | 811 ASSERT_EQ(kLen3, sock_->Read(buf, kLen33, read_callback_.callback())); |
| 812 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3)); | 812 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3)); |
| 813 ASSERT_TRUE(sock_->IsConnected()); | 813 ASSERT_TRUE(sock_->IsConnected()); |
| 814 } | 814 } |
| 815 | 815 |
| 816 TEST_F(SpdyProxyClientSocketTest, ReadAuthResponseBody) { | 816 TEST_F(SpdyProxyClientSocketTest, ReadAuthResponseBody) { |
| 817 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 817 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 818 MockWrite writes[] = { | 818 MockWrite writes[] = { |
| 819 CreateMockWrite(*conn, 0, false), | 819 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 820 }; | 820 }; |
| 821 | 821 |
| 822 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame()); | 822 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame()); |
| 823 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 823 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 824 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 824 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 825 MockRead reads[] = { | 825 MockRead reads[] = { |
| 826 CreateMockRead(*resp, 1, true), | 826 CreateMockRead(*resp, 1, ASYNC), |
| 827 CreateMockRead(*msg1, 2, true), | 827 CreateMockRead(*msg1, 2, ASYNC), |
| 828 CreateMockRead(*msg2, 3, true), | 828 CreateMockRead(*msg2, 3, ASYNC), |
| 829 MockRead(true, 0, 4), // EOF | 829 MockRead(ASYNC, 0, 4), // EOF |
| 830 }; | 830 }; |
| 831 | 831 |
| 832 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 832 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 833 | 833 |
| 834 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); | 834 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); |
| 835 | 835 |
| 836 Run(2); // SpdySession consumes the next two reads and sends then to | 836 Run(2); // SpdySession consumes the next two reads and sends then to |
| 837 // sock_ to be buffered. | 837 // sock_ to be buffered. |
| 838 AssertSyncReadEquals(kMsg1, kLen1); | 838 AssertSyncReadEquals(kMsg1, kLen1); |
| 839 AssertSyncReadEquals(kMsg2, kLen2); | 839 AssertSyncReadEquals(kMsg2, kLen2); |
| 840 } | 840 } |
| 841 | 841 |
| 842 TEST_F(SpdyProxyClientSocketTest, ReadErrorResponseBody) { | 842 TEST_F(SpdyProxyClientSocketTest, ReadErrorResponseBody) { |
| 843 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 843 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 844 MockWrite writes[] = { | 844 MockWrite writes[] = { |
| 845 CreateMockWrite(*conn, 0, false), | 845 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 846 }; | 846 }; |
| 847 | 847 |
| 848 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectErrorReplyFrame()); | 848 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectErrorReplyFrame()); |
| 849 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 849 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 850 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 850 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 851 MockRead reads[] = { | 851 MockRead reads[] = { |
| 852 CreateMockRead(*resp, 1, true), | 852 CreateMockRead(*resp, 1, ASYNC), |
| 853 CreateMockRead(*msg1, 2, true), | 853 CreateMockRead(*msg1, 2, ASYNC), |
| 854 CreateMockRead(*msg2, 3, true), | 854 CreateMockRead(*msg2, 3, ASYNC), |
| 855 MockRead(true, 0, 4), // EOF | 855 MockRead(ASYNC, 0, 4), // EOF |
| 856 }; | 856 }; |
| 857 | 857 |
| 858 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 858 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 859 | 859 |
| 860 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); | 860 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); |
| 861 | 861 |
| 862 Run(2); // SpdySession consumes the next two reads and sends then to | 862 Run(2); // SpdySession consumes the next two reads and sends then to |
| 863 // sock_ to be buffered. | 863 // sock_ to be buffered. |
| 864 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, | 864 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 865 sock_->Read(NULL, 1, CompletionCallback())); | 865 sock_->Read(NULL, 1, CompletionCallback())); |
| 866 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1 + kLen2)); | 866 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1 + kLen2)); |
| 867 scoped_ptr<HttpStream> stream(sock_->CreateConnectResponseStream()); | 867 scoped_ptr<HttpStream> stream(sock_->CreateConnectResponseStream()); |
| 868 stream->ReadResponseBody(buf, kLen1 + kLen2, read_callback_.callback()); | 868 stream->ReadResponseBody(buf, kLen1 + kLen2, read_callback_.callback()); |
| 869 } | 869 } |
| 870 | 870 |
| 871 // ----------- Reads and Writes | 871 // ----------- Reads and Writes |
| 872 | 872 |
| 873 TEST_F(SpdyProxyClientSocketTest, AsyncReadAroundWrite) { | 873 TEST_F(SpdyProxyClientSocketTest, AsyncReadAroundWrite) { |
| 874 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 874 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 875 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 875 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 876 MockWrite writes[] = { | 876 MockWrite writes[] = { |
| 877 CreateMockWrite(*conn, 0, false), | 877 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 878 CreateMockWrite(*msg2, 3, false), | 878 CreateMockWrite(*msg2, 3, SYNCHRONOUS), |
| 879 }; | 879 }; |
| 880 | 880 |
| 881 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 881 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 882 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 882 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 883 scoped_ptr<spdy::SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); | 883 scoped_ptr<spdy::SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); |
| 884 MockRead reads[] = { | 884 MockRead reads[] = { |
| 885 CreateMockRead(*resp, 1, true), | 885 CreateMockRead(*resp, 1, ASYNC), |
| 886 CreateMockRead(*msg1, 2, true), // sync read | 886 CreateMockRead(*msg1, 2, ASYNC), // sync read |
| 887 CreateMockRead(*msg3, 4, true), // async read | 887 CreateMockRead(*msg3, 4, ASYNC), // async read |
| 888 MockRead(true, 0, 5), // EOF | 888 MockRead(ASYNC, 0, 5), // EOF |
| 889 }; | 889 }; |
| 890 | 890 |
| 891 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 891 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 892 | 892 |
| 893 AssertConnectSucceeds(); | 893 AssertConnectSucceeds(); |
| 894 | 894 |
| 895 Run(1); | 895 Run(1); |
| 896 AssertSyncReadEquals(kMsg1, kLen1); | 896 AssertSyncReadEquals(kMsg1, kLen1); |
| 897 | 897 |
| 898 AssertReadStarts(kMsg3, kLen3); | 898 AssertReadStarts(kMsg3, kLen3); |
| 899 // Read should block until after the write succeeds | 899 // Read should block until after the write succeeds |
| 900 | 900 |
| 901 AssertAsyncWriteSucceeds(kMsg2, kLen2); // Runs 1 step | 901 AssertAsyncWriteSucceeds(kMsg2, kLen2); // Runs 1 step |
| 902 | 902 |
| 903 ASSERT_FALSE(read_callback_.have_result()); | 903 ASSERT_FALSE(read_callback_.have_result()); |
| 904 Run(1); | 904 Run(1); |
| 905 // Now the read will return | 905 // Now the read will return |
| 906 AssertReadReturns(kMsg3, kLen3); | 906 AssertReadReturns(kMsg3, kLen3); |
| 907 } | 907 } |
| 908 | 908 |
| 909 TEST_F(SpdyProxyClientSocketTest, AsyncWriteAroundReads) { | 909 TEST_F(SpdyProxyClientSocketTest, AsyncWriteAroundReads) { |
| 910 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 910 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 911 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 911 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 912 MockWrite writes[] = { | 912 MockWrite writes[] = { |
| 913 CreateMockWrite(*conn, 0, false), | 913 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 914 CreateMockWrite(*msg2, 4, true), | 914 CreateMockWrite(*msg2, 4, ASYNC), |
| 915 }; | 915 }; |
| 916 | 916 |
| 917 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 917 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 918 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 918 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 919 scoped_ptr<spdy::SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); | 919 scoped_ptr<spdy::SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3)); |
| 920 MockRead reads[] = { | 920 MockRead reads[] = { |
| 921 CreateMockRead(*resp, 1, true), | 921 CreateMockRead(*resp, 1, ASYNC), |
| 922 CreateMockRead(*msg1, 2, true), | 922 CreateMockRead(*msg1, 2, ASYNC), |
| 923 CreateMockRead(*msg3, 3, true), | 923 CreateMockRead(*msg3, 3, ASYNC), |
| 924 MockRead(true, 0, 5), // EOF | 924 MockRead(ASYNC, 0, 5), // EOF |
| 925 }; | 925 }; |
| 926 | 926 |
| 927 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 927 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 928 | 928 |
| 929 AssertConnectSucceeds(); | 929 AssertConnectSucceeds(); |
| 930 | 930 |
| 931 Run(1); | 931 Run(1); |
| 932 AssertSyncReadEquals(kMsg1, kLen1); | 932 AssertSyncReadEquals(kMsg1, kLen1); |
| 933 // Write should block until the read completes | 933 // Write should block until the read completes |
| 934 AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING); | 934 AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING); |
| 935 | 935 |
| 936 AssertAsyncReadEquals(kMsg3, kLen3); | 936 AssertAsyncReadEquals(kMsg3, kLen3); |
| 937 | 937 |
| 938 ASSERT_FALSE(write_callback_.have_result()); | 938 ASSERT_FALSE(write_callback_.have_result()); |
| 939 | 939 |
| 940 // Now the write will complete | 940 // Now the write will complete |
| 941 Run(1); | 941 Run(1); |
| 942 AssertWriteLength(kLen2); | 942 AssertWriteLength(kLen2); |
| 943 } | 943 } |
| 944 | 944 |
| 945 // ----------- Reading/Writing on Closed socket | 945 // ----------- Reading/Writing on Closed socket |
| 946 | 946 |
| 947 // Reading from an already closed socket should return 0 | 947 // Reading from an already closed socket should return 0 |
| 948 TEST_F(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsZero) { | 948 TEST_F(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsZero) { |
| 949 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 949 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 950 MockWrite writes[] = { | 950 MockWrite writes[] = { |
| 951 CreateMockWrite(*conn, 0, false), | 951 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 952 }; | 952 }; |
| 953 | 953 |
| 954 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 954 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 955 MockRead reads[] = { | 955 MockRead reads[] = { |
| 956 CreateMockRead(*resp, 1, true), | 956 CreateMockRead(*resp, 1, ASYNC), |
| 957 MockRead(true, 0, 2), // EOF | 957 MockRead(ASYNC, 0, 2), // EOF |
| 958 }; | 958 }; |
| 959 | 959 |
| 960 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 960 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 961 | 961 |
| 962 AssertConnectSucceeds(); | 962 AssertConnectSucceeds(); |
| 963 | 963 |
| 964 Run(1); | 964 Run(1); |
| 965 | 965 |
| 966 ASSERT_FALSE(sock_->IsConnected()); | 966 ASSERT_FALSE(sock_->IsConnected()); |
| 967 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 967 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
| 968 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 968 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
| 969 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 969 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
| 970 ASSERT_FALSE(sock_->IsConnectedAndIdle()); | 970 ASSERT_FALSE(sock_->IsConnectedAndIdle()); |
| 971 } | 971 } |
| 972 | 972 |
| 973 // Read pending when socket is closed should return 0 | 973 // Read pending when socket is closed should return 0 |
| 974 TEST_F(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) { | 974 TEST_F(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) { |
| 975 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 975 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 976 MockWrite writes[] = { | 976 MockWrite writes[] = { |
| 977 CreateMockWrite(*conn, 0, false), | 977 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 978 }; | 978 }; |
| 979 | 979 |
| 980 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 980 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 981 MockRead reads[] = { | 981 MockRead reads[] = { |
| 982 CreateMockRead(*resp, 1, true), | 982 CreateMockRead(*resp, 1, ASYNC), |
| 983 MockRead(true, 0, 2), // EOF | 983 MockRead(ASYNC, 0, 2), // EOF |
| 984 }; | 984 }; |
| 985 | 985 |
| 986 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 986 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 987 | 987 |
| 988 AssertConnectSucceeds(); | 988 AssertConnectSucceeds(); |
| 989 | 989 |
| 990 AssertReadStarts(kMsg1, kLen1); | 990 AssertReadStarts(kMsg1, kLen1); |
| 991 | 991 |
| 992 Run(1); | 992 Run(1); |
| 993 | 993 |
| 994 ASSERT_EQ(0, read_callback_.WaitForResult()); | 994 ASSERT_EQ(0, read_callback_.WaitForResult()); |
| 995 } | 995 } |
| 996 | 996 |
| 997 // Reading from a disconnected socket is an error | 997 // Reading from a disconnected socket is an error |
| 998 TEST_F(SpdyProxyClientSocketTest, ReadOnDisconnectSocketReturnsNotConnected) { | 998 TEST_F(SpdyProxyClientSocketTest, ReadOnDisconnectSocketReturnsNotConnected) { |
| 999 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 999 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1000 MockWrite writes[] = { | 1000 MockWrite writes[] = { |
| 1001 CreateMockWrite(*conn, 0, false), | 1001 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1002 }; | 1002 }; |
| 1003 | 1003 |
| 1004 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1004 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1005 MockRead reads[] = { | 1005 MockRead reads[] = { |
| 1006 CreateMockRead(*resp, 1, true), | 1006 CreateMockRead(*resp, 1, ASYNC), |
| 1007 MockRead(true, 0, 2), // EOF | 1007 MockRead(ASYNC, 0, 2), // EOF |
| 1008 }; | 1008 }; |
| 1009 | 1009 |
| 1010 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1010 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1011 | 1011 |
| 1012 AssertConnectSucceeds(); | 1012 AssertConnectSucceeds(); |
| 1013 | 1013 |
| 1014 sock_->Disconnect(); | 1014 sock_->Disconnect(); |
| 1015 | 1015 |
| 1016 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1016 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1017 sock_->Read(NULL, 1, CompletionCallback())); | 1017 sock_->Read(NULL, 1, CompletionCallback())); |
| 1018 } | 1018 } |
| 1019 | 1019 |
| 1020 // Reading buffered data from an already closed socket should return | 1020 // Reading buffered data from an already closed socket should return |
| 1021 // buffered data, then 0. | 1021 // buffered data, then 0. |
| 1022 TEST_F(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { | 1022 TEST_F(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { |
| 1023 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1023 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1024 MockWrite writes[] = { | 1024 MockWrite writes[] = { |
| 1025 CreateMockWrite(*conn, 0, false), | 1025 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1026 }; | 1026 }; |
| 1027 | 1027 |
| 1028 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1028 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1029 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1029 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 1030 MockRead reads[] = { | 1030 MockRead reads[] = { |
| 1031 CreateMockRead(*resp, 1, true), | 1031 CreateMockRead(*resp, 1, ASYNC), |
| 1032 CreateMockRead(*msg1, 2, true), | 1032 CreateMockRead(*msg1, 2, ASYNC), |
| 1033 MockRead(true, 0, 3), // EOF | 1033 MockRead(ASYNC, 0, 3), // EOF |
| 1034 }; | 1034 }; |
| 1035 | 1035 |
| 1036 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1036 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1037 | 1037 |
| 1038 AssertConnectSucceeds(); | 1038 AssertConnectSucceeds(); |
| 1039 | 1039 |
| 1040 Run(2); | 1040 Run(2); |
| 1041 | 1041 |
| 1042 ASSERT_FALSE(sock_->IsConnected()); | 1042 ASSERT_FALSE(sock_->IsConnected()); |
| 1043 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); | 1043 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); |
| 1044 ASSERT_EQ(kLen1, sock_->Read(buf, kLen1, CompletionCallback())); | 1044 ASSERT_EQ(kLen1, sock_->Read(buf, kLen1, CompletionCallback())); |
| 1045 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1)); | 1045 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1)); |
| 1046 | 1046 |
| 1047 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 1047 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
| 1048 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); | 1048 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback())); |
| 1049 sock_->Disconnect(); | 1049 sock_->Disconnect(); |
| 1050 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1050 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1051 sock_->Read(NULL, 1, CompletionCallback())); | 1051 sock_->Read(NULL, 1, CompletionCallback())); |
| 1052 } | 1052 } |
| 1053 | 1053 |
| 1054 // Calling Write() on a closed socket is an error | 1054 // Calling Write() on a closed socket is an error |
| 1055 TEST_F(SpdyProxyClientSocketTest, WriteOnClosedStream) { | 1055 TEST_F(SpdyProxyClientSocketTest, WriteOnClosedStream) { |
| 1056 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1056 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1057 MockWrite writes[] = { | 1057 MockWrite writes[] = { |
| 1058 CreateMockWrite(*conn, 0, false), | 1058 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1059 }; | 1059 }; |
| 1060 | 1060 |
| 1061 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1061 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1062 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1062 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 1063 MockRead reads[] = { | 1063 MockRead reads[] = { |
| 1064 CreateMockRead(*resp, 1, true), | 1064 CreateMockRead(*resp, 1, ASYNC), |
| 1065 MockRead(true, 0, 2), // EOF | 1065 MockRead(ASYNC, 0, 2), // EOF |
| 1066 }; | 1066 }; |
| 1067 | 1067 |
| 1068 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1068 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1069 | 1069 |
| 1070 AssertConnectSucceeds(); | 1070 AssertConnectSucceeds(); |
| 1071 | 1071 |
| 1072 Run(1); // Read EOF which will close the stream | 1072 Run(1); // Read EOF which will close the stream |
| 1073 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1073 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1074 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1074 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1075 sock_->Write(buf, buf->size(), CompletionCallback())); | 1075 sock_->Write(buf, buf->size(), CompletionCallback())); |
| 1076 } | 1076 } |
| 1077 | 1077 |
| 1078 // Calling Write() on a disconnected socket is an error | 1078 // Calling Write() on a disconnected socket is an error |
| 1079 TEST_F(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { | 1079 TEST_F(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { |
| 1080 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1080 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1081 MockWrite writes[] = { | 1081 MockWrite writes[] = { |
| 1082 CreateMockWrite(*conn, 0, false), | 1082 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1083 }; | 1083 }; |
| 1084 | 1084 |
| 1085 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1085 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1086 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); | 1086 scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
| 1087 MockRead reads[] = { | 1087 MockRead reads[] = { |
| 1088 CreateMockRead(*resp, 1, true), | 1088 CreateMockRead(*resp, 1, ASYNC), |
| 1089 MockRead(true, 0, 2), // EOF | 1089 MockRead(ASYNC, 0, 2), // EOF |
| 1090 }; | 1090 }; |
| 1091 | 1091 |
| 1092 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1092 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1093 | 1093 |
| 1094 AssertConnectSucceeds(); | 1094 AssertConnectSucceeds(); |
| 1095 | 1095 |
| 1096 sock_->Disconnect(); | 1096 sock_->Disconnect(); |
| 1097 | 1097 |
| 1098 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1098 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1099 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, | 1099 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, |
| 1100 sock_->Write(buf, buf->size(), CompletionCallback())); | 1100 sock_->Write(buf, buf->size(), CompletionCallback())); |
| 1101 } | 1101 } |
| 1102 | 1102 |
| 1103 // If the socket is closed with a pending Write(), the callback | 1103 // If the socket is closed with a pending Write(), the callback |
| 1104 // should be called with ERR_CONNECTION_CLOSED. | 1104 // should be called with ERR_CONNECTION_CLOSED. |
| 1105 TEST_F(SpdyProxyClientSocketTest, WritePendingOnClose) { | 1105 TEST_F(SpdyProxyClientSocketTest, WritePendingOnClose) { |
| 1106 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1106 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1107 MockWrite writes[] = { | 1107 MockWrite writes[] = { |
| 1108 CreateMockWrite(*conn, 0, false), | 1108 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1109 MockWrite(true, ERR_IO_PENDING, 2), | 1109 MockWrite(ASYNC, ERR_IO_PENDING, 2), |
| 1110 }; | 1110 }; |
| 1111 | 1111 |
| 1112 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1112 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1113 MockRead reads[] = { | 1113 MockRead reads[] = { |
| 1114 CreateMockRead(*resp, 1, true), | 1114 CreateMockRead(*resp, 1, ASYNC), |
| 1115 MockRead(true, 0, 3), // EOF | 1115 MockRead(ASYNC, 0, 3), // EOF |
| 1116 }; | 1116 }; |
| 1117 | 1117 |
| 1118 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1118 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1119 | 1119 |
| 1120 AssertConnectSucceeds(); | 1120 AssertConnectSucceeds(); |
| 1121 | 1121 |
| 1122 EXPECT_TRUE(sock_->IsConnected()); | 1122 EXPECT_TRUE(sock_->IsConnected()); |
| 1123 | 1123 |
| 1124 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1124 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1125 EXPECT_EQ(ERR_IO_PENDING, | 1125 EXPECT_EQ(ERR_IO_PENDING, |
| 1126 sock_->Write(buf, buf->size(), write_callback_.callback())); | 1126 sock_->Write(buf, buf->size(), write_callback_.callback())); |
| 1127 | 1127 |
| 1128 Run(1); | 1128 Run(1); |
| 1129 | 1129 |
| 1130 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult()); | 1130 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult()); |
| 1131 } | 1131 } |
| 1132 | 1132 |
| 1133 // If the socket is Disconnected with a pending Write(), the callback | 1133 // If the socket is Disconnected with a pending Write(), the callback |
| 1134 // should not be called. | 1134 // should not be called. |
| 1135 TEST_F(SpdyProxyClientSocketTest, DisconnectWithWritePending) { | 1135 TEST_F(SpdyProxyClientSocketTest, DisconnectWithWritePending) { |
| 1136 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1136 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1137 MockWrite writes[] = { | 1137 MockWrite writes[] = { |
| 1138 CreateMockWrite(*conn, 0, false), | 1138 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1139 MockWrite(false, 0, 2), // EOF | 1139 MockWrite(SYNCHRONOUS, 0, 2), // EOF |
| 1140 }; | 1140 }; |
| 1141 | 1141 |
| 1142 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1142 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1143 MockRead reads[] = { | 1143 MockRead reads[] = { |
| 1144 CreateMockRead(*resp, 1, true), | 1144 CreateMockRead(*resp, 1, ASYNC), |
| 1145 MockRead(true, 0, 3), // EOF | 1145 MockRead(ASYNC, 0, 3), // EOF |
| 1146 }; | 1146 }; |
| 1147 | 1147 |
| 1148 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1148 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1149 | 1149 |
| 1150 AssertConnectSucceeds(); | 1150 AssertConnectSucceeds(); |
| 1151 | 1151 |
| 1152 EXPECT_TRUE(sock_->IsConnected()); | 1152 EXPECT_TRUE(sock_->IsConnected()); |
| 1153 | 1153 |
| 1154 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); | 1154 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
| 1155 EXPECT_EQ(ERR_IO_PENDING, | 1155 EXPECT_EQ(ERR_IO_PENDING, |
| 1156 sock_->Write(buf, buf->size(), write_callback_.callback())); | 1156 sock_->Write(buf, buf->size(), write_callback_.callback())); |
| 1157 | 1157 |
| 1158 sock_->Disconnect(); | 1158 sock_->Disconnect(); |
| 1159 | 1159 |
| 1160 EXPECT_FALSE(sock_->IsConnected()); | 1160 EXPECT_FALSE(sock_->IsConnected()); |
| 1161 EXPECT_FALSE(write_callback_.have_result()); | 1161 EXPECT_FALSE(write_callback_.have_result()); |
| 1162 } | 1162 } |
| 1163 | 1163 |
| 1164 // If the socket is Disconnected with a pending Read(), the callback | 1164 // If the socket is Disconnected with a pending Read(), the callback |
| 1165 // should not be called. | 1165 // should not be called. |
| 1166 TEST_F(SpdyProxyClientSocketTest, DisconnectWithReadPending) { | 1166 TEST_F(SpdyProxyClientSocketTest, DisconnectWithReadPending) { |
| 1167 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1167 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1168 MockWrite writes[] = { | 1168 MockWrite writes[] = { |
| 1169 CreateMockWrite(*conn, 0, false), | 1169 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1170 }; | 1170 }; |
| 1171 | 1171 |
| 1172 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1172 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1173 MockRead reads[] = { | 1173 MockRead reads[] = { |
| 1174 CreateMockRead(*resp, 1, true), | 1174 CreateMockRead(*resp, 1, ASYNC), |
| 1175 MockRead(true, 0, 2), // EOF | 1175 MockRead(ASYNC, 0, 2), // EOF |
| 1176 }; | 1176 }; |
| 1177 | 1177 |
| 1178 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1178 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1179 | 1179 |
| 1180 AssertConnectSucceeds(); | 1180 AssertConnectSucceeds(); |
| 1181 | 1181 |
| 1182 EXPECT_TRUE(sock_->IsConnected()); | 1182 EXPECT_TRUE(sock_->IsConnected()); |
| 1183 | 1183 |
| 1184 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); | 1184 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); |
| 1185 ASSERT_EQ(ERR_IO_PENDING, | 1185 ASSERT_EQ(ERR_IO_PENDING, |
| 1186 sock_->Read(buf, kLen1, read_callback_.callback())); | 1186 sock_->Read(buf, kLen1, read_callback_.callback())); |
| 1187 | 1187 |
| 1188 sock_->Disconnect(); | 1188 sock_->Disconnect(); |
| 1189 | 1189 |
| 1190 EXPECT_FALSE(sock_->IsConnected()); | 1190 EXPECT_FALSE(sock_->IsConnected()); |
| 1191 EXPECT_FALSE(read_callback_.have_result()); | 1191 EXPECT_FALSE(read_callback_.have_result()); |
| 1192 } | 1192 } |
| 1193 | 1193 |
| 1194 // If the socket is Reset when both a read and write are pending, | 1194 // If the socket is Reset when both a read and write are pending, |
| 1195 // both should be called back. | 1195 // both should be called back. |
| 1196 TEST_F(SpdyProxyClientSocketTest, RstWithReadAndWritePending) { | 1196 TEST_F(SpdyProxyClientSocketTest, RstWithReadAndWritePending) { |
| 1197 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1197 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1198 MockWrite writes[] = { | 1198 MockWrite writes[] = { |
| 1199 CreateMockWrite(*conn, 0, false), | 1199 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1200 MockWrite(true, ERR_IO_PENDING, 2), | 1200 MockWrite(ASYNC, ERR_IO_PENDING, 2), |
| 1201 }; | 1201 }; |
| 1202 | 1202 |
| 1203 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1203 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1204 scoped_ptr<spdy::SpdyFrame> rst(ConstructSpdyRstStream(1, spdy::CANCEL)); | 1204 scoped_ptr<spdy::SpdyFrame> rst(ConstructSpdyRstStream(1, spdy::CANCEL)); |
| 1205 MockRead reads[] = { | 1205 MockRead reads[] = { |
| 1206 CreateMockRead(*resp, 1, true), | 1206 CreateMockRead(*resp, 1, ASYNC), |
| 1207 CreateMockRead(*rst, 3, true), | 1207 CreateMockRead(*rst, 3, ASYNC), |
| 1208 }; | 1208 }; |
| 1209 | 1209 |
| 1210 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1210 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1211 | 1211 |
| 1212 AssertConnectSucceeds(); | 1212 AssertConnectSucceeds(); |
| 1213 | 1213 |
| 1214 EXPECT_TRUE(sock_->IsConnected()); | 1214 EXPECT_TRUE(sock_->IsConnected()); |
| 1215 | 1215 |
| 1216 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); | 1216 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); |
| 1217 ASSERT_EQ(ERR_IO_PENDING, | 1217 ASSERT_EQ(ERR_IO_PENDING, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1256 | 1256 |
| 1257 DISALLOW_COPY_AND_ASSIGN(DeleteSockCallback); | 1257 DISALLOW_COPY_AND_ASSIGN(DeleteSockCallback); |
| 1258 }; | 1258 }; |
| 1259 | 1259 |
| 1260 // If the socket is Reset when both a read and write are pending, and the | 1260 // If the socket is Reset when both a read and write are pending, and the |
| 1261 // read callback causes the socket to be deleted, the write callback should | 1261 // read callback causes the socket to be deleted, the write callback should |
| 1262 // not be called. | 1262 // not be called. |
| 1263 TEST_F(SpdyProxyClientSocketTest, RstWithReadAndWritePendingDelete) { | 1263 TEST_F(SpdyProxyClientSocketTest, RstWithReadAndWritePendingDelete) { |
| 1264 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 1264 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 1265 MockWrite writes[] = { | 1265 MockWrite writes[] = { |
| 1266 CreateMockWrite(*conn, 0, false), | 1266 CreateMockWrite(*conn, 0, SYNCHRONOUS), |
| 1267 MockWrite(true, ERR_IO_PENDING, 2), | 1267 MockWrite(ASYNC, ERR_IO_PENDING, 2), |
| 1268 }; | 1268 }; |
| 1269 | 1269 |
| 1270 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 1270 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 1271 scoped_ptr<spdy::SpdyFrame> rst(ConstructSpdyRstStream(1, spdy::CANCEL)); | 1271 scoped_ptr<spdy::SpdyFrame> rst(ConstructSpdyRstStream(1, spdy::CANCEL)); |
| 1272 MockRead reads[] = { | 1272 MockRead reads[] = { |
| 1273 CreateMockRead(*resp, 1, true), | 1273 CreateMockRead(*resp, 1, ASYNC), |
| 1274 CreateMockRead(*rst, 3, true), | 1274 CreateMockRead(*rst, 3, ASYNC), |
| 1275 }; | 1275 }; |
| 1276 | 1276 |
| 1277 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 1277 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 1278 | 1278 |
| 1279 AssertConnectSucceeds(); | 1279 AssertConnectSucceeds(); |
| 1280 | 1280 |
| 1281 EXPECT_TRUE(sock_->IsConnected()); | 1281 EXPECT_TRUE(sock_->IsConnected()); |
| 1282 | 1282 |
| 1283 DeleteSockCallback read_callback(&sock_); | 1283 DeleteSockCallback read_callback(&sock_); |
| 1284 | 1284 |
| 1285 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); | 1285 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); |
| 1286 ASSERT_EQ(ERR_IO_PENDING, | 1286 ASSERT_EQ(ERR_IO_PENDING, |
| 1287 sock_->Read(read_buf, kLen1, read_callback.callback())); | 1287 sock_->Read(read_buf, kLen1, read_callback.callback())); |
| 1288 | 1288 |
| 1289 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1)); | 1289 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1)); |
| 1290 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(write_buf, write_buf->size(), | 1290 EXPECT_EQ(ERR_IO_PENDING, sock_->Write(write_buf, write_buf->size(), |
| 1291 write_callback_.callback())); | 1291 write_callback_.callback())); |
| 1292 | 1292 |
| 1293 Run(2); | 1293 Run(2); |
| 1294 | 1294 |
| 1295 EXPECT_FALSE(sock_.get()); | 1295 EXPECT_FALSE(sock_.get()); |
| 1296 EXPECT_TRUE(read_callback.have_result()); | 1296 EXPECT_TRUE(read_callback.have_result()); |
| 1297 EXPECT_FALSE(write_callback_.have_result()); | 1297 EXPECT_FALSE(write_callback_.have_result()); |
| 1298 } | 1298 } |
| 1299 | 1299 |
| 1300 } // namespace net | 1300 } // namespace net |
| OLD | NEW |