| 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/socket/socket_test_util.h" | 5 #include "net/socket/socket_test_util.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 | 524 |
| 525 MockRead SequencedSocketData::OnRead() { | 525 MockRead SequencedSocketData::OnRead() { |
| 526 CHECK_EQ(IDLE, read_state_); | 526 CHECK_EQ(IDLE, read_state_); |
| 527 CHECK(!helper_.AllReadDataConsumed()); | 527 CHECK(!helper_.AllReadDataConsumed()); |
| 528 | 528 |
| 529 NET_TRACE(1, " *** ") << "sequence_number: " << sequence_number_; | 529 NET_TRACE(1, " *** ") << "sequence_number: " << sequence_number_; |
| 530 const MockRead& next_read = helper_.PeekRead(); | 530 const MockRead& next_read = helper_.PeekRead(); |
| 531 NET_TRACE(1, " *** ") << "next_read: " << next_read.sequence_number; | 531 NET_TRACE(1, " *** ") << "next_read: " << next_read.sequence_number; |
| 532 CHECK_GE(next_read.sequence_number, sequence_number_); | 532 CHECK_GE(next_read.sequence_number, sequence_number_); |
| 533 | 533 |
| 534 // Special case handling for hanging reads. |
| 535 if (next_read.mode == ASYNC && next_read.result == ERR_IO_PENDING) { |
| 536 NET_TRACE(1, " *** ") << "Hanging read"; |
| 537 helper_.AdvanceRead(); |
| 538 ++sequence_number_; |
| 539 CHECK(helper_.AllReadDataConsumed()); |
| 540 return MockRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 541 } |
| 542 |
| 534 if (next_read.sequence_number <= sequence_number_) { | 543 if (next_read.sequence_number <= sequence_number_) { |
| 535 if (next_read.mode == SYNCHRONOUS) { | 544 if (next_read.mode == SYNCHRONOUS) { |
| 536 NET_TRACE(1, " *** ") << "Returning synchronously"; | 545 NET_TRACE(1, " *** ") << "Returning synchronously"; |
| 537 DumpMockReadWrite(next_read); | 546 DumpMockReadWrite(next_read); |
| 538 helper_.AdvanceRead(); | 547 helper_.AdvanceRead(); |
| 539 ++sequence_number_; | 548 ++sequence_number_; |
| 540 MaybePostWriteCompleteTask(); | 549 MaybePostWriteCompleteTask(); |
| 541 return next_read; | 550 return next_read; |
| 542 } | 551 } |
| 543 | 552 |
| 544 // If the result is ERR_IO_PENDING, then advance to the next state | |
| 545 // and pause reads. | |
| 546 if (next_read.result == ERR_IO_PENDING) { | |
| 547 NET_TRACE(1, " *** ") << "Pausing at: " << sequence_number_; | |
| 548 ++sequence_number_; | |
| 549 helper_.AdvanceRead(); | |
| 550 read_state_ = PAUSED; | |
| 551 return MockRead(SYNCHRONOUS, ERR_IO_PENDING); | |
| 552 } | |
| 553 base::MessageLoop::current()->PostTask( | 553 base::MessageLoop::current()->PostTask( |
| 554 FROM_HERE, base::Bind(&SequencedSocketData::OnReadComplete, | 554 FROM_HERE, base::Bind(&SequencedSocketData::OnReadComplete, |
| 555 weak_factory_.GetWeakPtr())); | 555 weak_factory_.GetWeakPtr())); |
| 556 CHECK_NE(COMPLETING, write_state_); | 556 CHECK_NE(COMPLETING, write_state_); |
| 557 read_state_ = COMPLETING; | 557 read_state_ = COMPLETING; |
| 558 } else if (next_read.mode == SYNCHRONOUS) { | 558 } else if (next_read.mode == SYNCHRONOUS) { |
| 559 ADD_FAILURE() << "Unable to perform synchronous IO while stopped"; | 559 ADD_FAILURE() << "Unable to perform synchronous IO while stopped"; |
| 560 return MockRead(SYNCHRONOUS, ERR_UNEXPECTED); | 560 return MockRead(SYNCHRONOUS, ERR_UNEXPECTED); |
| 561 } else { | 561 } else { |
| 562 NET_TRACE(1, " *** ") << "Waiting for write to trigger read"; | 562 NET_TRACE(1, " *** ") << "Waiting for write to trigger read"; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 617 } | 617 } |
| 618 | 618 |
| 619 bool SequencedSocketData::AllReadDataConsumed() const { | 619 bool SequencedSocketData::AllReadDataConsumed() const { |
| 620 return helper_.AllReadDataConsumed(); | 620 return helper_.AllReadDataConsumed(); |
| 621 } | 621 } |
| 622 | 622 |
| 623 bool SequencedSocketData::AllWriteDataConsumed() const { | 623 bool SequencedSocketData::AllWriteDataConsumed() const { |
| 624 return helper_.AllWriteDataConsumed(); | 624 return helper_.AllWriteDataConsumed(); |
| 625 } | 625 } |
| 626 | 626 |
| 627 bool SequencedSocketData::IsReadPaused() { | |
| 628 return read_state_ == PAUSED; | |
| 629 } | |
| 630 | |
| 631 void SequencedSocketData::CompleteRead() { | |
| 632 if (read_state_ != PAUSED) { | |
| 633 ADD_FAILURE() << "Unable to CompleteRead when not paused."; | |
| 634 return; | |
| 635 } | |
| 636 read_state_ = COMPLETING; | |
| 637 OnReadComplete(); | |
| 638 } | |
| 639 | |
| 640 void SequencedSocketData::MaybePostReadCompleteTask() { | 627 void SequencedSocketData::MaybePostReadCompleteTask() { |
| 641 NET_TRACE(1, " ****** ") << " current: " << sequence_number_; | 628 NET_TRACE(1, " ****** ") << " current: " << sequence_number_; |
| 642 // Only trigger the next read to complete if there is already a read pending | 629 // Only trigger the next read to complete if there is already a read pending |
| 643 // which should complete at the current sequence number. | 630 // which should complete at the current sequence number. |
| 644 if (read_state_ != PENDING || | 631 if (read_state_ != PENDING || |
| 645 helper_.PeekRead().sequence_number != sequence_number_) { | 632 helper_.PeekRead().sequence_number != sequence_number_) { |
| 646 return; | 633 return; |
| 647 } | 634 } |
| 648 | 635 |
| 649 // If the result is ERR_IO_PENDING, then advance to the next state | |
| 650 // and pause reads. | |
| 651 if (helper_.PeekRead().result == ERR_IO_PENDING) { | |
| 652 NET_TRACE(1, " *** ") << "Pausing read at: " << sequence_number_; | |
| 653 ++sequence_number_; | |
| 654 helper_.AdvanceRead(); | |
| 655 read_state_ = PAUSED; | |
| 656 return; | |
| 657 } | |
| 658 | |
| 659 NET_TRACE(1, " ****** ") << "Posting task to complete read: " | 636 NET_TRACE(1, " ****** ") << "Posting task to complete read: " |
| 660 << sequence_number_; | 637 << sequence_number_; |
| 661 base::MessageLoop::current()->PostTask( | 638 base::MessageLoop::current()->PostTask( |
| 662 FROM_HERE, base::Bind(&SequencedSocketData::OnReadComplete, | 639 FROM_HERE, base::Bind(&SequencedSocketData::OnReadComplete, |
| 663 weak_factory_.GetWeakPtr())); | 640 weak_factory_.GetWeakPtr())); |
| 664 CHECK_NE(COMPLETING, write_state_); | 641 CHECK_NE(COMPLETING, write_state_); |
| 665 read_state_ = COMPLETING; | 642 read_state_ = COMPLETING; |
| 666 } | 643 } |
| 667 | 644 |
| 668 void SequencedSocketData::MaybePostWriteCompleteTask() { | 645 void SequencedSocketData::MaybePostWriteCompleteTask() { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 696 sequence_number_++; | 673 sequence_number_++; |
| 697 read_state_ = IDLE; | 674 read_state_ = IDLE; |
| 698 | 675 |
| 699 // The result of this read completing might trigger the completion | 676 // The result of this read completing might trigger the completion |
| 700 // of a pending write. If so, post a task to complete the write later. | 677 // of a pending write. If so, post a task to complete the write later. |
| 701 // Since the socket may call back into the SequencedSocketData | 678 // Since the socket may call back into the SequencedSocketData |
| 702 // from socket()->OnReadComplete(), trigger the write task to be posted | 679 // from socket()->OnReadComplete(), trigger the write task to be posted |
| 703 // before calling that. | 680 // before calling that. |
| 704 MaybePostWriteCompleteTask(); | 681 MaybePostWriteCompleteTask(); |
| 705 | 682 |
| 706 NET_TRACE(1, " *** ") << "Completing socket read for: " | 683 NET_TRACE(1, " *** ") << "Completing socket read for: " << sequence_number_; |
| 707 << data.sequence_number; | |
| 708 DumpMockReadWrite(data); | 684 DumpMockReadWrite(data); |
| 709 socket()->OnReadComplete(data); | 685 socket()->OnReadComplete(data); |
| 710 NET_TRACE(1, " *** ") << "Done"; | 686 NET_TRACE(1, " *** ") << "Done"; |
| 711 } | 687 } |
| 712 | 688 |
| 713 void SequencedSocketData::OnWriteComplete() { | 689 void SequencedSocketData::OnWriteComplete() { |
| 714 CHECK_EQ(COMPLETING, write_state_); | 690 CHECK_EQ(COMPLETING, write_state_); |
| 715 NET_TRACE(1, " *** ") << " Completing write for: " << sequence_number_; | 691 NET_TRACE(1, " *** ") << " Completing write for: " << sequence_number_; |
| 716 if (!socket()) { | 692 if (!socket()) { |
| 717 NET_TRACE(1, " *** ") << "No socket available to complete write."; | 693 NET_TRACE(1, " *** ") << "No socket available to complete write."; |
| 718 return; | 694 return; |
| 719 } | 695 } |
| 720 | 696 |
| 721 const MockWrite& data = helper_.AdvanceWrite(); | 697 const MockWrite& data = helper_.AdvanceWrite(); |
| 722 DCHECK_EQ(sequence_number_, data.sequence_number); | 698 DCHECK_EQ(sequence_number_, data.sequence_number); |
| 723 sequence_number_++; | 699 sequence_number_++; |
| 724 write_state_ = IDLE; | 700 write_state_ = IDLE; |
| 725 int rv = data.result == OK ? data.data_len : data.result; | 701 int rv = data.result == OK ? data.data_len : data.result; |
| 726 | 702 |
| 727 // The result of this write completing might trigger the completion | 703 // The result of this write completing might trigger the completion |
| 728 // of a pending read. If so, post a task to complete the read later. | 704 // of a pending read. If so, post a task to complete the read later. |
| 729 // Since the socket may call back into the SequencedSocketData | 705 // Since the socket may call back into the SequencedSocketData |
| 730 // from socket()->OnWriteComplete(), trigger the write task to be posted | 706 // from socket()->OnWriteComplete(), trigger the write task to be posted |
| 731 // before calling that. | 707 // before calling that. |
| 732 MaybePostReadCompleteTask(); | 708 MaybePostReadCompleteTask(); |
| 733 | 709 |
| 734 NET_TRACE(1, " *** ") << " Completing socket write for: " | 710 NET_TRACE(1, " *** ") << " Completing socket write for: " << sequence_number_; |
| 735 << data.sequence_number; | |
| 736 socket()->OnWriteComplete(rv); | 711 socket()->OnWriteComplete(rv); |
| 737 NET_TRACE(1, " *** ") << "Done"; | 712 NET_TRACE(1, " *** ") << "Done"; |
| 738 } | 713 } |
| 739 | 714 |
| 740 SequencedSocketData::~SequencedSocketData() { | 715 SequencedSocketData::~SequencedSocketData() { |
| 741 } | 716 } |
| 742 | 717 |
| 743 DeterministicSocketData::DeterministicSocketData(MockRead* reads, | 718 DeterministicSocketData::DeterministicSocketData(MockRead* reads, |
| 744 size_t reads_count, MockWrite* writes, size_t writes_count) | 719 size_t reads_count, MockWrite* writes, size_t writes_count) |
| 745 : StaticSocketDataProvider(reads, reads_count, writes, writes_count), | 720 : StaticSocketDataProvider(reads, reads_count, writes, writes_count), |
| (...skipping 1474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2220 | 2195 |
| 2221 const char kSOCKS5OkRequest[] = | 2196 const char kSOCKS5OkRequest[] = |
| 2222 { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 }; | 2197 { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 }; |
| 2223 const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest); | 2198 const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest); |
| 2224 | 2199 |
| 2225 const char kSOCKS5OkResponse[] = | 2200 const char kSOCKS5OkResponse[] = |
| 2226 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; | 2201 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; |
| 2227 const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse); | 2202 const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse); |
| 2228 | 2203 |
| 2229 } // namespace net | 2204 } // namespace net |
| OLD | NEW |