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 |