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