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 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 NET_TRACE(1, " *** ") << " Completing socket write for: " | 599 NET_TRACE(1, " *** ") << " Completing socket write for: " |
600 << data.sequence_number; | 600 << data.sequence_number; |
601 socket()->OnWriteComplete(rv); | 601 socket()->OnWriteComplete(rv); |
602 NET_TRACE(1, " *** ") << "Done"; | 602 NET_TRACE(1, " *** ") << "Done"; |
603 } | 603 } |
604 | 604 |
605 SequencedSocketData::~SequencedSocketData() { | 605 SequencedSocketData::~SequencedSocketData() { |
606 } | 606 } |
607 | 607 |
608 DeterministicSocketData::DeterministicSocketData(MockRead* reads, | 608 DeterministicSocketData::DeterministicSocketData(MockRead* reads, |
609 size_t reads_count, MockWrite* writes, size_t writes_count) | 609 size_t reads_count, |
610 : StaticSocketDataProvider(reads, reads_count, writes, writes_count), | 610 MockWrite* writes, |
| 611 size_t writes_count) |
| 612 : helper_(reads, reads_count, writes, writes_count), |
611 sequence_number_(0), | 613 sequence_number_(0), |
612 current_read_(), | 614 current_read_(), |
613 current_write_(), | 615 current_write_(), |
614 stopping_sequence_number_(0), | 616 stopping_sequence_number_(0), |
615 stopped_(false), | 617 stopped_(false), |
616 print_debug_(false), | 618 print_debug_(false), |
617 is_running_(false) { | 619 is_running_(false) { |
618 VerifyCorrectSequenceNumbers(reads, reads_count, writes, writes_count); | 620 VerifyCorrectSequenceNumbers(reads, reads_count, writes, writes_count); |
619 } | 621 } |
620 | 622 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 DCHECK_LT(sequence_number_, seq); | 662 DCHECK_LT(sequence_number_, seq); |
661 stopping_sequence_number_ = seq; | 663 stopping_sequence_number_ = seq; |
662 stopped_ = false; | 664 stopped_ = false; |
663 } | 665 } |
664 | 666 |
665 void DeterministicSocketData::StopAfter(int seq) { | 667 void DeterministicSocketData::StopAfter(int seq) { |
666 SetStop(sequence_number_ + seq); | 668 SetStop(sequence_number_ + seq); |
667 } | 669 } |
668 | 670 |
669 MockRead DeterministicSocketData::OnRead() { | 671 MockRead DeterministicSocketData::OnRead() { |
670 current_read_ = helper()->PeekRead(); | 672 current_read_ = helper_.PeekRead(); |
671 | 673 |
672 // Synchronous read while stopped is an error | 674 // Synchronous read while stopped is an error |
673 if (stopped() && current_read_.mode == SYNCHRONOUS) { | 675 if (stopped() && current_read_.mode == SYNCHRONOUS) { |
674 LOG(ERROR) << "Unable to perform synchronous IO while stopped"; | 676 LOG(ERROR) << "Unable to perform synchronous IO while stopped"; |
675 return MockRead(SYNCHRONOUS, ERR_UNEXPECTED); | 677 return MockRead(SYNCHRONOUS, ERR_UNEXPECTED); |
676 } | 678 } |
677 | 679 |
678 // Async read which will be called back in a future step. | 680 // Async read which will be called back in a future step. |
679 if (sequence_number_ < current_read_.sequence_number) { | 681 if (sequence_number_ < current_read_.sequence_number) { |
680 NET_TRACE(1, " *** ") << "Stage " << sequence_number_ << ": I/O Pending"; | 682 NET_TRACE(1, " *** ") << "Stage " << sequence_number_ << ": I/O Pending"; |
681 MockRead result = MockRead(SYNCHRONOUS, ERR_IO_PENDING); | 683 MockRead result = MockRead(SYNCHRONOUS, ERR_IO_PENDING); |
682 if (current_read_.mode == SYNCHRONOUS) { | 684 if (current_read_.mode == SYNCHRONOUS) { |
683 LOG(ERROR) << "Unable to perform synchronous read: " | 685 LOG(ERROR) << "Unable to perform synchronous read: " |
684 << current_read_.sequence_number | 686 << current_read_.sequence_number |
685 << " at stage: " << sequence_number_; | 687 << " at stage: " << sequence_number_; |
686 result = MockRead(SYNCHRONOUS, ERR_UNEXPECTED); | 688 result = MockRead(SYNCHRONOUS, ERR_UNEXPECTED); |
687 } | 689 } |
688 if (print_debug_) | 690 if (print_debug_) |
689 DumpMockReadWrite(result); | 691 DumpMockReadWrite(result); |
690 return result; | 692 return result; |
691 } | 693 } |
692 | 694 |
693 NET_TRACE(1, " *** ") << "Stage " << sequence_number_ << ": Read " | 695 NET_TRACE(1, " *** ") << "Stage " << sequence_number_ << ": Read " |
694 << read_index(); | 696 << helper_.read_index(); |
695 if (print_debug_) | 697 if (print_debug_) |
696 DumpMockReadWrite(current_read_); | 698 DumpMockReadWrite(current_read_); |
697 | 699 |
698 // Increment the sequence number if IO is complete | 700 // Increment the sequence number if IO is complete |
699 if (current_read_.mode == SYNCHRONOUS) | 701 if (current_read_.mode == SYNCHRONOUS) |
700 NextStep(); | 702 NextStep(); |
701 | 703 |
702 DCHECK_NE(ERR_IO_PENDING, current_read_.result); | 704 DCHECK_NE(ERR_IO_PENDING, current_read_.result); |
703 StaticSocketDataProvider::OnRead(); | |
704 | 705 |
| 706 helper_.AdvanceRead(); |
705 return current_read_; | 707 return current_read_; |
706 } | 708 } |
707 | 709 |
708 MockWriteResult DeterministicSocketData::OnWrite(const std::string& data) { | 710 MockWriteResult DeterministicSocketData::OnWrite(const std::string& data) { |
709 const MockWrite& next_write = helper()->PeekWrite(); | 711 const MockWrite& next_write = helper_.PeekWrite(); |
710 current_write_ = next_write; | 712 current_write_ = next_write; |
711 | 713 |
712 // Synchronous write while stopped is an error | 714 // Synchronous write while stopped is an error |
713 if (stopped() && next_write.mode == SYNCHRONOUS) { | 715 if (stopped() && next_write.mode == SYNCHRONOUS) { |
714 LOG(ERROR) << "Unable to perform synchronous IO while stopped"; | 716 LOG(ERROR) << "Unable to perform synchronous IO while stopped"; |
715 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); | 717 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); |
716 } | 718 } |
717 | 719 |
718 // Async write which will be called back in a future step. | 720 // Async write which will be called back in a future step. |
719 if (sequence_number_ < next_write.sequence_number) { | 721 if (sequence_number_ < next_write.sequence_number) { |
720 NET_TRACE(1, " *** ") << "Stage " << sequence_number_ << ": I/O Pending"; | 722 NET_TRACE(1, " *** ") << "Stage " << sequence_number_ << ": I/O Pending"; |
721 if (next_write.mode == SYNCHRONOUS) { | 723 if (next_write.mode == SYNCHRONOUS) { |
722 LOG(ERROR) << "Unable to perform synchronous write: " | 724 LOG(ERROR) << "Unable to perform synchronous write: " |
723 << next_write.sequence_number << " at stage: " << sequence_number_; | 725 << next_write.sequence_number << " at stage: " << sequence_number_; |
724 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); | 726 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); |
725 } | 727 } |
726 } else { | 728 } else { |
727 NET_TRACE(1, " *** ") << "Stage " << sequence_number_ << ": Write " | 729 NET_TRACE(1, " *** ") << "Stage " << sequence_number_ << ": Write " |
728 << write_index(); | 730 << helper_.write_index(); |
729 } | 731 } |
730 | 732 |
731 if (print_debug_) | 733 if (print_debug_) |
732 DumpMockReadWrite(next_write); | 734 DumpMockReadWrite(next_write); |
733 | 735 |
734 // Move to the next step if I/O is synchronous, since the operation will | 736 // Move to the next step if I/O is synchronous, since the operation will |
735 // complete when this method returns. | 737 // complete when this method returns. |
736 if (next_write.mode == SYNCHRONOUS) | 738 if (next_write.mode == SYNCHRONOUS) |
737 NextStep(); | 739 NextStep(); |
738 | 740 |
739 // This is either a sync write for this step, or an async write. | 741 // Check that what we are writing matches the expectation. |
740 return StaticSocketDataProvider::OnWrite(data); | 742 // Then give the mocked return value. |
| 743 if (!helper_.VerifyWriteData(data)) |
| 744 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); |
| 745 |
| 746 helper_.AdvanceWrite(); |
| 747 |
| 748 // In the case that the write was successful, return the number of bytes |
| 749 // written. Otherwise return the error code. |
| 750 int result = |
| 751 next_write.result == OK ? next_write.data_len : next_write.result; |
| 752 return MockWriteResult(next_write.mode, result); |
741 } | 753 } |
742 | 754 |
743 void DeterministicSocketData::Reset() { | 755 bool DeterministicSocketData::AllReadDataConsumed() const { |
744 NET_TRACE(1, " *** ") << "Stage " << sequence_number_ << ": Reset()"; | 756 return helper_.AllReadDataConsumed(); |
745 sequence_number_ = 0; | 757 } |
746 StaticSocketDataProvider::Reset(); | 758 |
747 NOTREACHED(); | 759 bool DeterministicSocketData::AllWriteDataConsumed() const { |
| 760 return helper_.AllWriteDataConsumed(); |
748 } | 761 } |
749 | 762 |
750 void DeterministicSocketData::InvokeCallbacks() { | 763 void DeterministicSocketData::InvokeCallbacks() { |
751 if (delegate_.get() && delegate_->WritePending() && | 764 if (delegate_.get() && delegate_->WritePending() && |
752 (current_write().sequence_number == sequence_number())) { | 765 (current_write().sequence_number == sequence_number())) { |
753 NextStep(); | 766 NextStep(); |
754 delegate_->CompleteWrite(); | 767 delegate_->CompleteWrite(); |
755 return; | 768 return; |
756 } | 769 } |
757 if (delegate_.get() && delegate_->ReadPending() && | 770 if (delegate_.get() && delegate_->ReadPending() && |
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1384 bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip); | 1397 bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip); |
1385 CHECK(rv); | 1398 CHECK(rv); |
1386 *address = IPEndPoint(ip, source_port_); | 1399 *address = IPEndPoint(ip, source_port_); |
1387 return OK; | 1400 return OK; |
1388 } | 1401 } |
1389 | 1402 |
1390 const BoundNetLog& DeterministicMockUDPClientSocket::NetLog() const { | 1403 const BoundNetLog& DeterministicMockUDPClientSocket::NetLog() const { |
1391 return helper_.net_log(); | 1404 return helper_.net_log(); |
1392 } | 1405 } |
1393 | 1406 |
1394 void DeterministicMockUDPClientSocket::OnReadComplete(const MockRead& data) {} | |
1395 | |
1396 void DeterministicMockUDPClientSocket::OnWriteComplete(int rv) { | |
1397 } | |
1398 | |
1399 void DeterministicMockUDPClientSocket::OnConnectComplete( | |
1400 const MockConnect& data) { | |
1401 NOTIMPLEMENTED(); | |
1402 } | |
1403 | |
1404 DeterministicMockTCPClientSocket::DeterministicMockTCPClientSocket( | 1407 DeterministicMockTCPClientSocket::DeterministicMockTCPClientSocket( |
1405 net::NetLog* net_log, | 1408 net::NetLog* net_log, |
1406 DeterministicSocketData* data) | 1409 DeterministicSocketData* data) |
1407 : MockClientSocket(BoundNetLog::Make(net_log, NetLog::SOURCE_NONE)), | 1410 : MockClientSocket(BoundNetLog::Make(net_log, NetLog::SOURCE_NONE)), |
1408 helper_(net_log, data) { | 1411 helper_(net_log, data) { |
1409 peer_addr_ = data->connect_data().peer_addr; | 1412 peer_addr_ = data->connect_data().peer_addr; |
1410 } | 1413 } |
1411 | 1414 |
1412 DeterministicMockTCPClientSocket::~DeterministicMockTCPClientSocket() {} | 1415 DeterministicMockTCPClientSocket::~DeterministicMockTCPClientSocket() {} |
1413 | 1416 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1481 } | 1484 } |
1482 | 1485 |
1483 bool DeterministicMockTCPClientSocket::WasNpnNegotiated() const { | 1486 bool DeterministicMockTCPClientSocket::WasNpnNegotiated() const { |
1484 return false; | 1487 return false; |
1485 } | 1488 } |
1486 | 1489 |
1487 bool DeterministicMockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) { | 1490 bool DeterministicMockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) { |
1488 return false; | 1491 return false; |
1489 } | 1492 } |
1490 | 1493 |
1491 void DeterministicMockTCPClientSocket::OnReadComplete(const MockRead& data) {} | |
1492 | |
1493 void DeterministicMockTCPClientSocket::OnWriteComplete(int rv) { | |
1494 } | |
1495 | |
1496 void DeterministicMockTCPClientSocket::OnConnectComplete( | |
1497 const MockConnect& data) {} | |
1498 | |
1499 // static | 1494 // static |
1500 void MockSSLClientSocket::ConnectCallback( | 1495 void MockSSLClientSocket::ConnectCallback( |
1501 MockSSLClientSocket* ssl_client_socket, | 1496 MockSSLClientSocket* ssl_client_socket, |
1502 const CompletionCallback& callback, | 1497 const CompletionCallback& callback, |
1503 int rv) { | 1498 int rv) { |
1504 if (rv == OK) | 1499 if (rv == OK) |
1505 ssl_client_socket->connected_ = true; | 1500 ssl_client_socket->connected_ = true; |
1506 callback.Run(rv); | 1501 callback.Run(rv); |
1507 } | 1502 } |
1508 | 1503 |
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2109 | 2104 |
2110 const char kSOCKS5OkRequest[] = | 2105 const char kSOCKS5OkRequest[] = |
2111 { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 }; | 2106 { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 }; |
2112 const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest); | 2107 const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest); |
2113 | 2108 |
2114 const char kSOCKS5OkResponse[] = | 2109 const char kSOCKS5OkResponse[] = |
2115 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; | 2110 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; |
2116 const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse); | 2111 const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse); |
2117 | 2112 |
2118 } // namespace net | 2113 } // namespace net |
OLD | NEW |