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 |