Index: net/socket/socket_test_util.cc |
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc |
deleted file mode 100644 |
index 791c9f684804dd7fd74ac8adee3b2a5e7d8cc164..0000000000000000000000000000000000000000 |
--- a/net/socket/socket_test_util.cc |
+++ /dev/null |
@@ -1,2022 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/socket/socket_test_util.h" |
- |
-#include <algorithm> |
-#include <vector> |
- |
-#include "base/basictypes.h" |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/callback_helpers.h" |
-#include "base/compiler_specific.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/run_loop.h" |
-#include "base/time/time.h" |
-#include "net/base/address_family.h" |
-#include "net/base/address_list.h" |
-#include "net/base/auth.h" |
-#include "net/base/load_timing_info.h" |
-#include "net/http/http_network_session.h" |
-#include "net/http/http_request_headers.h" |
-#include "net/http/http_response_headers.h" |
-#include "net/socket/client_socket_pool_histograms.h" |
-#include "net/socket/socket.h" |
-#include "net/socket/websocket_endpoint_lock_manager.h" |
-#include "net/ssl/ssl_cert_request_info.h" |
-#include "net/ssl/ssl_connection_status_flags.h" |
-#include "net/ssl/ssl_info.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-// Socket events are easier to debug if you log individual reads and writes. |
-// Enable these if locally debugging, but they are too noisy for the waterfall. |
-#if 0 |
-#define NET_TRACE(level, s) DLOG(level) << s << __FUNCTION__ << "() " |
-#else |
-#define NET_TRACE(level, s) EAT_STREAM_PARAMETERS |
-#endif |
- |
-namespace net { |
- |
-namespace { |
- |
-inline char AsciifyHigh(char x) { |
- char nybble = static_cast<char>((x >> 4) & 0x0F); |
- return nybble + ((nybble < 0x0A) ? '0' : 'A' - 10); |
-} |
- |
-inline char AsciifyLow(char x) { |
- char nybble = static_cast<char>((x >> 0) & 0x0F); |
- return nybble + ((nybble < 0x0A) ? '0' : 'A' - 10); |
-} |
- |
-inline char Asciify(char x) { |
- if ((x < 0) || !isprint(x)) |
- return '.'; |
- return x; |
-} |
- |
-void DumpData(const char* data, int data_len) { |
- if (logging::LOG_INFO < logging::GetMinLogLevel()) |
- return; |
- DVLOG(1) << "Length: " << data_len; |
- const char* pfx = "Data: "; |
- if (!data || (data_len <= 0)) { |
- DVLOG(1) << pfx << "<None>"; |
- } else { |
- int i; |
- for (i = 0; i <= (data_len - 4); i += 4) { |
- DVLOG(1) << pfx |
- << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0]) |
- << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1]) |
- << AsciifyHigh(data[i + 2]) << AsciifyLow(data[i + 2]) |
- << AsciifyHigh(data[i + 3]) << AsciifyLow(data[i + 3]) |
- << " '" |
- << Asciify(data[i + 0]) |
- << Asciify(data[i + 1]) |
- << Asciify(data[i + 2]) |
- << Asciify(data[i + 3]) |
- << "'"; |
- pfx = " "; |
- } |
- // Take care of any 'trailing' bytes, if data_len was not a multiple of 4. |
- switch (data_len - i) { |
- case 3: |
- DVLOG(1) << pfx |
- << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0]) |
- << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1]) |
- << AsciifyHigh(data[i + 2]) << AsciifyLow(data[i + 2]) |
- << " '" |
- << Asciify(data[i + 0]) |
- << Asciify(data[i + 1]) |
- << Asciify(data[i + 2]) |
- << " '"; |
- break; |
- case 2: |
- DVLOG(1) << pfx |
- << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0]) |
- << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1]) |
- << " '" |
- << Asciify(data[i + 0]) |
- << Asciify(data[i + 1]) |
- << " '"; |
- break; |
- case 1: |
- DVLOG(1) << pfx |
- << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0]) |
- << " '" |
- << Asciify(data[i + 0]) |
- << " '"; |
- break; |
- } |
- } |
-} |
- |
-template <MockReadWriteType type> |
-void DumpMockReadWrite(const MockReadWrite<type>& r) { |
- if (logging::LOG_INFO < logging::GetMinLogLevel()) |
- return; |
- DVLOG(1) << "Async: " << (r.mode == ASYNC) |
- << "\nResult: " << r.result; |
- DumpData(r.data, r.data_len); |
- const char* stop = (r.sequence_number & MockRead::STOPLOOP) ? " (STOP)" : ""; |
- DVLOG(1) << "Stage: " << (r.sequence_number & ~MockRead::STOPLOOP) << stop |
- << "\nTime: " << r.time_stamp.ToInternalValue(); |
-} |
- |
-} // namespace |
- |
-MockConnect::MockConnect() : mode(ASYNC), result(OK) { |
- IPAddressNumber ip; |
- CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip)); |
- peer_addr = IPEndPoint(ip, 0); |
-} |
- |
-MockConnect::MockConnect(IoMode io_mode, int r) : mode(io_mode), result(r) { |
- IPAddressNumber ip; |
- CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip)); |
- peer_addr = IPEndPoint(ip, 0); |
-} |
- |
-MockConnect::MockConnect(IoMode io_mode, int r, IPEndPoint addr) : |
- mode(io_mode), |
- result(r), |
- peer_addr(addr) { |
-} |
- |
-MockConnect::~MockConnect() {} |
- |
-StaticSocketDataProvider::StaticSocketDataProvider() |
- : reads_(NULL), |
- read_index_(0), |
- read_count_(0), |
- writes_(NULL), |
- write_index_(0), |
- write_count_(0) { |
-} |
- |
-StaticSocketDataProvider::StaticSocketDataProvider(MockRead* reads, |
- size_t reads_count, |
- MockWrite* writes, |
- size_t writes_count) |
- : reads_(reads), |
- read_index_(0), |
- read_count_(reads_count), |
- writes_(writes), |
- write_index_(0), |
- write_count_(writes_count) { |
-} |
- |
-StaticSocketDataProvider::~StaticSocketDataProvider() {} |
- |
-const MockRead& StaticSocketDataProvider::PeekRead() const { |
- CHECK(!at_read_eof()); |
- return reads_[read_index_]; |
-} |
- |
-const MockWrite& StaticSocketDataProvider::PeekWrite() const { |
- CHECK(!at_write_eof()); |
- return writes_[write_index_]; |
-} |
- |
-const MockRead& StaticSocketDataProvider::PeekRead(size_t index) const { |
- CHECK_LT(index, read_count_); |
- return reads_[index]; |
-} |
- |
-const MockWrite& StaticSocketDataProvider::PeekWrite(size_t index) const { |
- CHECK_LT(index, write_count_); |
- return writes_[index]; |
-} |
- |
-MockRead StaticSocketDataProvider::GetNextRead() { |
- CHECK(!at_read_eof()); |
- reads_[read_index_].time_stamp = base::Time::Now(); |
- return reads_[read_index_++]; |
-} |
- |
-MockWriteResult StaticSocketDataProvider::OnWrite(const std::string& data) { |
- if (!writes_) { |
- // Not using mock writes; succeed synchronously. |
- return MockWriteResult(SYNCHRONOUS, data.length()); |
- } |
- EXPECT_FALSE(at_write_eof()); |
- if (at_write_eof()) { |
- // Show what the extra write actually consists of. |
- EXPECT_EQ("<unexpected write>", data); |
- return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); |
- } |
- |
- // Check that what we are writing matches the expectation. |
- // Then give the mocked return value. |
- MockWrite* w = &writes_[write_index_++]; |
- w->time_stamp = base::Time::Now(); |
- int result = w->result; |
- if (w->data) { |
- // Note - we can simulate a partial write here. If the expected data |
- // is a match, but shorter than the write actually written, that is legal. |
- // Example: |
- // Application writes "foobarbaz" (9 bytes) |
- // Expected write was "foo" (3 bytes) |
- // This is a success, and we return 3 to the application. |
- std::string expected_data(w->data, w->data_len); |
- EXPECT_GE(data.length(), expected_data.length()); |
- std::string actual_data(data.substr(0, w->data_len)); |
- EXPECT_EQ(expected_data, actual_data); |
- if (expected_data != actual_data) |
- return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); |
- if (result == OK) |
- result = w->data_len; |
- } |
- return MockWriteResult(w->mode, result); |
-} |
- |
-void StaticSocketDataProvider::Reset() { |
- read_index_ = 0; |
- write_index_ = 0; |
-} |
- |
-DynamicSocketDataProvider::DynamicSocketDataProvider() |
- : short_read_limit_(0), |
- allow_unconsumed_reads_(false) { |
-} |
- |
-DynamicSocketDataProvider::~DynamicSocketDataProvider() {} |
- |
-MockRead DynamicSocketDataProvider::GetNextRead() { |
- if (reads_.empty()) |
- return MockRead(SYNCHRONOUS, ERR_UNEXPECTED); |
- MockRead result = reads_.front(); |
- if (short_read_limit_ == 0 || result.data_len <= short_read_limit_) { |
- reads_.pop_front(); |
- } else { |
- result.data_len = short_read_limit_; |
- reads_.front().data += result.data_len; |
- reads_.front().data_len -= result.data_len; |
- } |
- return result; |
-} |
- |
-void DynamicSocketDataProvider::Reset() { |
- reads_.clear(); |
-} |
- |
-void DynamicSocketDataProvider::SimulateRead(const char* data, |
- const size_t length) { |
- if (!allow_unconsumed_reads_) { |
- EXPECT_TRUE(reads_.empty()) << "Unconsumed read: " << reads_.front().data; |
- } |
- reads_.push_back(MockRead(ASYNC, data, length)); |
-} |
- |
-SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode, int result) |
- : connect(mode, result), |
- next_proto_status(SSLClientSocket::kNextProtoUnsupported), |
- was_npn_negotiated(false), |
- protocol_negotiated(kProtoUnknown), |
- client_cert_sent(false), |
- cert_request_info(NULL), |
- channel_id_sent(false), |
- connection_status(0), |
- should_pause_on_connect(false), |
- is_in_session_cache(false) { |
- SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_2, |
- &connection_status); |
- // Set to TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 |
- SSLConnectionStatusSetCipherSuite(0xcc14, &connection_status); |
-} |
- |
-SSLSocketDataProvider::~SSLSocketDataProvider() { |
-} |
- |
-void SSLSocketDataProvider::SetNextProto(NextProto proto) { |
- was_npn_negotiated = true; |
- next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
- protocol_negotiated = proto; |
- next_proto = SSLClientSocket::NextProtoToString(proto); |
-} |
- |
-DelayedSocketData::DelayedSocketData( |
- int write_delay, MockRead* reads, size_t reads_count, |
- MockWrite* writes, size_t writes_count) |
- : StaticSocketDataProvider(reads, reads_count, writes, writes_count), |
- write_delay_(write_delay), |
- read_in_progress_(false), |
- weak_factory_(this) { |
- DCHECK_GE(write_delay_, 0); |
-} |
- |
-DelayedSocketData::DelayedSocketData( |
- const MockConnect& connect, int write_delay, MockRead* reads, |
- size_t reads_count, MockWrite* writes, size_t writes_count) |
- : StaticSocketDataProvider(reads, reads_count, writes, writes_count), |
- write_delay_(write_delay), |
- read_in_progress_(false), |
- weak_factory_(this) { |
- DCHECK_GE(write_delay_, 0); |
- set_connect_data(connect); |
-} |
- |
-DelayedSocketData::~DelayedSocketData() { |
-} |
- |
-void DelayedSocketData::ForceNextRead() { |
- DCHECK(read_in_progress_); |
- write_delay_ = 0; |
- CompleteRead(); |
-} |
- |
-MockRead DelayedSocketData::GetNextRead() { |
- MockRead out = MockRead(ASYNC, ERR_IO_PENDING); |
- if (write_delay_ <= 0) |
- out = StaticSocketDataProvider::GetNextRead(); |
- read_in_progress_ = (out.result == ERR_IO_PENDING); |
- return out; |
-} |
- |
-MockWriteResult DelayedSocketData::OnWrite(const std::string& data) { |
- MockWriteResult rv = StaticSocketDataProvider::OnWrite(data); |
- // Now that our write has completed, we can allow reads to continue. |
- if (!--write_delay_ && read_in_progress_) |
- base::MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&DelayedSocketData::CompleteRead, |
- weak_factory_.GetWeakPtr()), |
- base::TimeDelta::FromMilliseconds(100)); |
- return rv; |
-} |
- |
-void DelayedSocketData::Reset() { |
- set_socket(NULL); |
- read_in_progress_ = false; |
- weak_factory_.InvalidateWeakPtrs(); |
- StaticSocketDataProvider::Reset(); |
-} |
- |
-void DelayedSocketData::CompleteRead() { |
- if (socket() && read_in_progress_) |
- socket()->OnReadComplete(GetNextRead()); |
-} |
- |
-OrderedSocketData::OrderedSocketData( |
- MockRead* reads, size_t reads_count, MockWrite* writes, size_t writes_count) |
- : StaticSocketDataProvider(reads, reads_count, writes, writes_count), |
- sequence_number_(0), loop_stop_stage_(0), |
- blocked_(false), weak_factory_(this) { |
-} |
- |
-OrderedSocketData::OrderedSocketData( |
- const MockConnect& connect, |
- MockRead* reads, size_t reads_count, |
- MockWrite* writes, size_t writes_count) |
- : StaticSocketDataProvider(reads, reads_count, writes, writes_count), |
- sequence_number_(0), loop_stop_stage_(0), |
- blocked_(false), weak_factory_(this) { |
- set_connect_data(connect); |
-} |
- |
-void OrderedSocketData::EndLoop() { |
- // If we've already stopped the loop, don't do it again until we've advanced |
- // to the next sequence_number. |
- NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ << ": EndLoop()"; |
- if (loop_stop_stage_ > 0) { |
- const MockRead& next_read = StaticSocketDataProvider::PeekRead(); |
- if ((next_read.sequence_number & ~MockRead::STOPLOOP) > |
- loop_stop_stage_) { |
- NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ |
- << ": Clearing stop index"; |
- loop_stop_stage_ = 0; |
- } else { |
- return; |
- } |
- } |
- // Record the sequence_number at which we stopped the loop. |
- NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ |
- << ": Posting Quit at read " << read_index(); |
- loop_stop_stage_ = sequence_number_; |
-} |
- |
-MockRead OrderedSocketData::GetNextRead() { |
- weak_factory_.InvalidateWeakPtrs(); |
- blocked_ = false; |
- const MockRead& next_read = StaticSocketDataProvider::PeekRead(); |
- if (next_read.sequence_number & MockRead::STOPLOOP) |
- EndLoop(); |
- if ((next_read.sequence_number & ~MockRead::STOPLOOP) <= |
- sequence_number_++) { |
- NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ - 1 |
- << ": Read " << read_index(); |
- DumpMockReadWrite(next_read); |
- blocked_ = (next_read.result == ERR_IO_PENDING); |
- return StaticSocketDataProvider::GetNextRead(); |
- } |
- NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ - 1 |
- << ": I/O Pending"; |
- MockRead result = MockRead(ASYNC, ERR_IO_PENDING); |
- DumpMockReadWrite(result); |
- blocked_ = true; |
- return result; |
-} |
- |
-MockWriteResult OrderedSocketData::OnWrite(const std::string& data) { |
- NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ |
- << ": Write " << write_index(); |
- DumpMockReadWrite(PeekWrite()); |
- ++sequence_number_; |
- if (blocked_) { |
- // TODO(willchan): This 100ms delay seems to work around some weirdness. We |
- // should probably fix the weirdness. One example is in SpdyStream, |
- // DoSendRequest() will return ERR_IO_PENDING, and there's a race. If the |
- // SYN_REPLY causes OnResponseReceived() to get called before |
- // SpdyStream::ReadResponseHeaders() is called, we hit a NOTREACHED(). |
- base::MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&OrderedSocketData::CompleteRead, |
- weak_factory_.GetWeakPtr()), |
- base::TimeDelta::FromMilliseconds(100)); |
- } |
- return StaticSocketDataProvider::OnWrite(data); |
-} |
- |
-void OrderedSocketData::Reset() { |
- NET_TRACE(INFO, " *** ") << "Stage " |
- << sequence_number_ << ": Reset()"; |
- sequence_number_ = 0; |
- loop_stop_stage_ = 0; |
- set_socket(NULL); |
- weak_factory_.InvalidateWeakPtrs(); |
- StaticSocketDataProvider::Reset(); |
-} |
- |
-void OrderedSocketData::CompleteRead() { |
- if (socket() && blocked_) { |
- NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_; |
- socket()->OnReadComplete(GetNextRead()); |
- } |
-} |
- |
-OrderedSocketData::~OrderedSocketData() {} |
- |
-DeterministicSocketData::DeterministicSocketData(MockRead* reads, |
- size_t reads_count, MockWrite* writes, size_t writes_count) |
- : StaticSocketDataProvider(reads, reads_count, writes, writes_count), |
- sequence_number_(0), |
- current_read_(), |
- current_write_(), |
- stopping_sequence_number_(0), |
- stopped_(false), |
- print_debug_(false), |
- is_running_(false) { |
- VerifyCorrectSequenceNumbers(reads, reads_count, writes, writes_count); |
-} |
- |
-DeterministicSocketData::~DeterministicSocketData() {} |
- |
-void DeterministicSocketData::Run() { |
- DCHECK(!is_running_); |
- is_running_ = true; |
- |
- SetStopped(false); |
- int counter = 0; |
- // Continue to consume data until all data has run out, or the stopped_ flag |
- // has been set. Consuming data requires two separate operations -- running |
- // the tasks in the message loop, and explicitly invoking the read/write |
- // callbacks (simulating network I/O). We check our conditions between each, |
- // since they can change in either. |
- while ((!at_write_eof() || !at_read_eof()) && !stopped()) { |
- if (counter % 2 == 0) |
- base::RunLoop().RunUntilIdle(); |
- if (counter % 2 == 1) { |
- InvokeCallbacks(); |
- } |
- counter++; |
- } |
- // We're done consuming new data, but it is possible there are still some |
- // pending callbacks which we expect to complete before returning. |
- while (delegate_.get() && |
- (delegate_->WritePending() || delegate_->ReadPending()) && |
- !stopped()) { |
- InvokeCallbacks(); |
- base::RunLoop().RunUntilIdle(); |
- } |
- SetStopped(false); |
- is_running_ = false; |
-} |
- |
-void DeterministicSocketData::RunFor(int steps) { |
- StopAfter(steps); |
- Run(); |
-} |
- |
-void DeterministicSocketData::SetStop(int seq) { |
- DCHECK_LT(sequence_number_, seq); |
- stopping_sequence_number_ = seq; |
- stopped_ = false; |
-} |
- |
-void DeterministicSocketData::StopAfter(int seq) { |
- SetStop(sequence_number_ + seq); |
-} |
- |
-MockRead DeterministicSocketData::GetNextRead() { |
- current_read_ = StaticSocketDataProvider::PeekRead(); |
- |
- // Synchronous read while stopped is an error |
- if (stopped() && current_read_.mode == SYNCHRONOUS) { |
- LOG(ERROR) << "Unable to perform synchronous IO while stopped"; |
- return MockRead(SYNCHRONOUS, ERR_UNEXPECTED); |
- } |
- |
- // Async read which will be called back in a future step. |
- if (sequence_number_ < current_read_.sequence_number) { |
- NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ |
- << ": I/O Pending"; |
- MockRead result = MockRead(SYNCHRONOUS, ERR_IO_PENDING); |
- if (current_read_.mode == SYNCHRONOUS) { |
- LOG(ERROR) << "Unable to perform synchronous read: " |
- << current_read_.sequence_number |
- << " at stage: " << sequence_number_; |
- result = MockRead(SYNCHRONOUS, ERR_UNEXPECTED); |
- } |
- if (print_debug_) |
- DumpMockReadWrite(result); |
- return result; |
- } |
- |
- NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ |
- << ": Read " << read_index(); |
- if (print_debug_) |
- DumpMockReadWrite(current_read_); |
- |
- // Increment the sequence number if IO is complete |
- if (current_read_.mode == SYNCHRONOUS) |
- NextStep(); |
- |
- DCHECK_NE(ERR_IO_PENDING, current_read_.result); |
- StaticSocketDataProvider::GetNextRead(); |
- |
- return current_read_; |
-} |
- |
-MockWriteResult DeterministicSocketData::OnWrite(const std::string& data) { |
- const MockWrite& next_write = StaticSocketDataProvider::PeekWrite(); |
- current_write_ = next_write; |
- |
- // Synchronous write while stopped is an error |
- if (stopped() && next_write.mode == SYNCHRONOUS) { |
- LOG(ERROR) << "Unable to perform synchronous IO while stopped"; |
- return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); |
- } |
- |
- // Async write which will be called back in a future step. |
- if (sequence_number_ < next_write.sequence_number) { |
- NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ |
- << ": I/O Pending"; |
- if (next_write.mode == SYNCHRONOUS) { |
- LOG(ERROR) << "Unable to perform synchronous write: " |
- << next_write.sequence_number << " at stage: " << sequence_number_; |
- return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); |
- } |
- } else { |
- NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ |
- << ": Write " << write_index(); |
- } |
- |
- if (print_debug_) |
- DumpMockReadWrite(next_write); |
- |
- // Move to the next step if I/O is synchronous, since the operation will |
- // complete when this method returns. |
- if (next_write.mode == SYNCHRONOUS) |
- NextStep(); |
- |
- // This is either a sync write for this step, or an async write. |
- return StaticSocketDataProvider::OnWrite(data); |
-} |
- |
-void DeterministicSocketData::Reset() { |
- NET_TRACE(INFO, " *** ") << "Stage " |
- << sequence_number_ << ": Reset()"; |
- sequence_number_ = 0; |
- StaticSocketDataProvider::Reset(); |
- NOTREACHED(); |
-} |
- |
-void DeterministicSocketData::InvokeCallbacks() { |
- if (delegate_.get() && delegate_->WritePending() && |
- (current_write().sequence_number == sequence_number())) { |
- NextStep(); |
- delegate_->CompleteWrite(); |
- return; |
- } |
- if (delegate_.get() && delegate_->ReadPending() && |
- (current_read().sequence_number == sequence_number())) { |
- NextStep(); |
- delegate_->CompleteRead(); |
- return; |
- } |
-} |
- |
-void DeterministicSocketData::NextStep() { |
- // Invariant: Can never move *past* the stopping step. |
- DCHECK_LT(sequence_number_, stopping_sequence_number_); |
- sequence_number_++; |
- if (sequence_number_ == stopping_sequence_number_) |
- SetStopped(true); |
-} |
- |
-void DeterministicSocketData::VerifyCorrectSequenceNumbers( |
- MockRead* reads, size_t reads_count, |
- MockWrite* writes, size_t writes_count) { |
- size_t read = 0; |
- size_t write = 0; |
- int expected = 0; |
- while (read < reads_count || write < writes_count) { |
- // Check to see that we have a read or write at the expected |
- // state. |
- if (read < reads_count && reads[read].sequence_number == expected) { |
- ++read; |
- ++expected; |
- continue; |
- } |
- if (write < writes_count && writes[write].sequence_number == expected) { |
- ++write; |
- ++expected; |
- continue; |
- } |
- NOTREACHED() << "Missing sequence number: " << expected; |
- return; |
- } |
- DCHECK_EQ(read, reads_count); |
- DCHECK_EQ(write, writes_count); |
-} |
- |
-MockClientSocketFactory::MockClientSocketFactory() {} |
- |
-MockClientSocketFactory::~MockClientSocketFactory() {} |
- |
-void MockClientSocketFactory::AddSocketDataProvider( |
- SocketDataProvider* data) { |
- mock_data_.Add(data); |
-} |
- |
-void MockClientSocketFactory::AddSSLSocketDataProvider( |
- SSLSocketDataProvider* data) { |
- mock_ssl_data_.Add(data); |
-} |
- |
-void MockClientSocketFactory::ResetNextMockIndexes() { |
- mock_data_.ResetNextIndex(); |
- mock_ssl_data_.ResetNextIndex(); |
-} |
- |
-scoped_ptr<DatagramClientSocket> |
-MockClientSocketFactory::CreateDatagramClientSocket( |
- DatagramSocket::BindType bind_type, |
- const RandIntCallback& rand_int_cb, |
- net::NetLog* net_log, |
- const net::NetLog::Source& source) { |
- SocketDataProvider* data_provider = mock_data_.GetNext(); |
- scoped_ptr<MockUDPClientSocket> socket( |
- new MockUDPClientSocket(data_provider, net_log)); |
- data_provider->set_socket(socket.get()); |
- if (bind_type == DatagramSocket::RANDOM_BIND) |
- socket->set_source_port(static_cast<uint16>(rand_int_cb.Run(1025, 65535))); |
- return socket.Pass(); |
-} |
- |
-scoped_ptr<StreamSocket> MockClientSocketFactory::CreateTransportClientSocket( |
- const AddressList& addresses, |
- net::NetLog* net_log, |
- const net::NetLog::Source& source) { |
- SocketDataProvider* data_provider = mock_data_.GetNext(); |
- scoped_ptr<MockTCPClientSocket> socket( |
- new MockTCPClientSocket(addresses, net_log, data_provider)); |
- data_provider->set_socket(socket.get()); |
- return socket.Pass(); |
-} |
- |
-scoped_ptr<SSLClientSocket> MockClientSocketFactory::CreateSSLClientSocket( |
- scoped_ptr<ClientSocketHandle> transport_socket, |
- const HostPortPair& host_and_port, |
- const SSLConfig& ssl_config, |
- const SSLClientSocketContext& context) { |
- SSLSocketDataProvider* next_ssl_data = mock_ssl_data_.GetNext(); |
- if (!next_ssl_data->next_protos_expected_in_ssl_config.empty()) { |
- EXPECT_EQ(next_ssl_data->next_protos_expected_in_ssl_config.size(), |
- ssl_config.next_protos.size()); |
- EXPECT_TRUE( |
- std::equal(next_ssl_data->next_protos_expected_in_ssl_config.begin(), |
- next_ssl_data->next_protos_expected_in_ssl_config.end(), |
- ssl_config.next_protos.begin())); |
- } |
- scoped_ptr<MockSSLClientSocket> socket(new MockSSLClientSocket( |
- transport_socket.Pass(), host_and_port, ssl_config, next_ssl_data)); |
- ssl_client_sockets_.push_back(socket.get()); |
- return socket.Pass(); |
-} |
- |
-void MockClientSocketFactory::ClearSSLSessionCache() { |
-} |
- |
-const char MockClientSocket::kTlsUnique[] = "MOCK_TLSUNIQ"; |
- |
-MockClientSocket::MockClientSocket(const BoundNetLog& net_log) |
- : connected_(false), |
- net_log_(net_log), |
- weak_factory_(this) { |
- IPAddressNumber ip; |
- CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip)); |
- peer_addr_ = IPEndPoint(ip, 0); |
-} |
- |
-int MockClientSocket::SetReceiveBufferSize(int32 size) { |
- return OK; |
-} |
- |
-int MockClientSocket::SetSendBufferSize(int32 size) { |
- return OK; |
-} |
- |
-void MockClientSocket::Disconnect() { |
- connected_ = false; |
-} |
- |
-bool MockClientSocket::IsConnected() const { |
- return connected_; |
-} |
- |
-bool MockClientSocket::IsConnectedAndIdle() const { |
- return connected_; |
-} |
- |
-int MockClientSocket::GetPeerAddress(IPEndPoint* address) const { |
- if (!IsConnected()) |
- return ERR_SOCKET_NOT_CONNECTED; |
- *address = peer_addr_; |
- return OK; |
-} |
- |
-int MockClientSocket::GetLocalAddress(IPEndPoint* address) const { |
- IPAddressNumber ip; |
- bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip); |
- CHECK(rv); |
- *address = IPEndPoint(ip, 123); |
- return OK; |
-} |
- |
-const BoundNetLog& MockClientSocket::NetLog() const { |
- return net_log_; |
-} |
- |
-std::string MockClientSocket::GetSessionCacheKey() const { |
- NOTIMPLEMENTED(); |
- return std::string(); |
-} |
- |
-bool MockClientSocket::InSessionCache() const { |
- NOTIMPLEMENTED(); |
- return false; |
-} |
- |
-void MockClientSocket::SetHandshakeCompletionCallback(const base::Closure& cb) { |
- NOTIMPLEMENTED(); |
-} |
- |
-void MockClientSocket::GetSSLCertRequestInfo( |
- SSLCertRequestInfo* cert_request_info) { |
-} |
- |
-int MockClientSocket::ExportKeyingMaterial(const base::StringPiece& label, |
- bool has_context, |
- const base::StringPiece& context, |
- unsigned char* out, |
- unsigned int outlen) { |
- memset(out, 'A', outlen); |
- return OK; |
-} |
- |
-int MockClientSocket::GetTLSUniqueChannelBinding(std::string* out) { |
- out->assign(MockClientSocket::kTlsUnique); |
- return OK; |
-} |
- |
-ChannelIDService* MockClientSocket::GetChannelIDService() const { |
- NOTREACHED(); |
- return NULL; |
-} |
- |
-SSLClientSocket::NextProtoStatus |
-MockClientSocket::GetNextProto(std::string* proto) { |
- proto->clear(); |
- return SSLClientSocket::kNextProtoUnsupported; |
-} |
- |
-scoped_refptr<X509Certificate> |
-MockClientSocket::GetUnverifiedServerCertificateChain() const { |
- NOTREACHED(); |
- return NULL; |
-} |
- |
-MockClientSocket::~MockClientSocket() {} |
- |
-void MockClientSocket::RunCallbackAsync(const CompletionCallback& callback, |
- int result) { |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&MockClientSocket::RunCallback, |
- weak_factory_.GetWeakPtr(), |
- callback, |
- result)); |
-} |
- |
-void MockClientSocket::RunCallback(const net::CompletionCallback& callback, |
- int result) { |
- if (!callback.is_null()) |
- callback.Run(result); |
-} |
- |
-MockTCPClientSocket::MockTCPClientSocket(const AddressList& addresses, |
- net::NetLog* net_log, |
- SocketDataProvider* data) |
- : MockClientSocket(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)), |
- addresses_(addresses), |
- data_(data), |
- read_offset_(0), |
- read_data_(SYNCHRONOUS, ERR_UNEXPECTED), |
- need_read_data_(true), |
- peer_closed_connection_(false), |
- pending_buf_(NULL), |
- pending_buf_len_(0), |
- was_used_to_convey_data_(false) { |
- DCHECK(data_); |
- peer_addr_ = data->connect_data().peer_addr; |
- data_->Reset(); |
-} |
- |
-MockTCPClientSocket::~MockTCPClientSocket() {} |
- |
-int MockTCPClientSocket::Read(IOBuffer* buf, int buf_len, |
- const CompletionCallback& callback) { |
- if (!connected_) |
- return ERR_UNEXPECTED; |
- |
- // If the buffer is already in use, a read is already in progress! |
- DCHECK(pending_buf_.get() == NULL); |
- |
- // Store our async IO data. |
- pending_buf_ = buf; |
- pending_buf_len_ = buf_len; |
- pending_callback_ = callback; |
- |
- if (need_read_data_) { |
- read_data_ = data_->GetNextRead(); |
- if (read_data_.result == ERR_CONNECTION_CLOSED) { |
- // This MockRead is just a marker to instruct us to set |
- // peer_closed_connection_. |
- peer_closed_connection_ = true; |
- } |
- if (read_data_.result == ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ) { |
- // This MockRead is just a marker to instruct us to set |
- // peer_closed_connection_. Skip it and get the next one. |
- read_data_ = data_->GetNextRead(); |
- peer_closed_connection_ = true; |
- } |
- // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility |
- // to complete the async IO manually later (via OnReadComplete). |
- if (read_data_.result == ERR_IO_PENDING) { |
- // We need to be using async IO in this case. |
- DCHECK(!callback.is_null()); |
- return ERR_IO_PENDING; |
- } |
- need_read_data_ = false; |
- } |
- |
- return CompleteRead(); |
-} |
- |
-int MockTCPClientSocket::Write(IOBuffer* buf, int buf_len, |
- const CompletionCallback& callback) { |
- DCHECK(buf); |
- DCHECK_GT(buf_len, 0); |
- |
- if (!connected_) |
- return ERR_UNEXPECTED; |
- |
- std::string data(buf->data(), buf_len); |
- MockWriteResult write_result = data_->OnWrite(data); |
- |
- was_used_to_convey_data_ = true; |
- |
- if (write_result.mode == ASYNC) { |
- RunCallbackAsync(callback, write_result.result); |
- return ERR_IO_PENDING; |
- } |
- |
- return write_result.result; |
-} |
- |
-int MockTCPClientSocket::Connect(const CompletionCallback& callback) { |
- if (connected_) |
- return OK; |
- connected_ = true; |
- peer_closed_connection_ = false; |
- if (data_->connect_data().mode == ASYNC) { |
- if (data_->connect_data().result == ERR_IO_PENDING) |
- pending_callback_ = callback; |
- else |
- RunCallbackAsync(callback, data_->connect_data().result); |
- return ERR_IO_PENDING; |
- } |
- return data_->connect_data().result; |
-} |
- |
-void MockTCPClientSocket::Disconnect() { |
- MockClientSocket::Disconnect(); |
- pending_callback_.Reset(); |
-} |
- |
-bool MockTCPClientSocket::IsConnected() const { |
- return connected_ && !peer_closed_connection_; |
-} |
- |
-bool MockTCPClientSocket::IsConnectedAndIdle() const { |
- return IsConnected(); |
-} |
- |
-int MockTCPClientSocket::GetPeerAddress(IPEndPoint* address) const { |
- if (addresses_.empty()) |
- return MockClientSocket::GetPeerAddress(address); |
- |
- *address = addresses_[0]; |
- return OK; |
-} |
- |
-bool MockTCPClientSocket::WasEverUsed() const { |
- return was_used_to_convey_data_; |
-} |
- |
-bool MockTCPClientSocket::UsingTCPFastOpen() const { |
- return false; |
-} |
- |
-bool MockTCPClientSocket::WasNpnNegotiated() const { |
- return false; |
-} |
- |
-bool MockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) { |
- return false; |
-} |
- |
-void MockTCPClientSocket::OnReadComplete(const MockRead& data) { |
- // There must be a read pending. |
- DCHECK(pending_buf_.get()); |
- // You can't complete a read with another ERR_IO_PENDING status code. |
- DCHECK_NE(ERR_IO_PENDING, data.result); |
- // Since we've been waiting for data, need_read_data_ should be true. |
- DCHECK(need_read_data_); |
- |
- read_data_ = data; |
- need_read_data_ = false; |
- |
- // The caller is simulating that this IO completes right now. Don't |
- // let CompleteRead() schedule a callback. |
- read_data_.mode = SYNCHRONOUS; |
- |
- CompletionCallback callback = pending_callback_; |
- int rv = CompleteRead(); |
- RunCallback(callback, rv); |
-} |
- |
-void MockTCPClientSocket::OnConnectComplete(const MockConnect& data) { |
- CompletionCallback callback = pending_callback_; |
- RunCallback(callback, data.result); |
-} |
- |
-int MockTCPClientSocket::CompleteRead() { |
- DCHECK(pending_buf_.get()); |
- DCHECK(pending_buf_len_ > 0); |
- |
- was_used_to_convey_data_ = true; |
- |
- // Save the pending async IO data and reset our |pending_| state. |
- scoped_refptr<IOBuffer> buf = pending_buf_; |
- int buf_len = pending_buf_len_; |
- CompletionCallback callback = pending_callback_; |
- pending_buf_ = NULL; |
- pending_buf_len_ = 0; |
- pending_callback_.Reset(); |
- |
- int result = read_data_.result; |
- DCHECK(result != ERR_IO_PENDING); |
- |
- if (read_data_.data) { |
- if (read_data_.data_len - read_offset_ > 0) { |
- result = std::min(buf_len, read_data_.data_len - read_offset_); |
- memcpy(buf->data(), read_data_.data + read_offset_, result); |
- read_offset_ += result; |
- if (read_offset_ == read_data_.data_len) { |
- need_read_data_ = true; |
- read_offset_ = 0; |
- } |
- } else { |
- result = 0; // EOF |
- } |
- } |
- |
- if (read_data_.mode == ASYNC) { |
- DCHECK(!callback.is_null()); |
- RunCallbackAsync(callback, result); |
- return ERR_IO_PENDING; |
- } |
- return result; |
-} |
- |
-DeterministicSocketHelper::DeterministicSocketHelper( |
- net::NetLog* net_log, |
- DeterministicSocketData* data) |
- : write_pending_(false), |
- write_result_(0), |
- read_data_(), |
- read_buf_(NULL), |
- read_buf_len_(0), |
- read_pending_(false), |
- data_(data), |
- was_used_to_convey_data_(false), |
- peer_closed_connection_(false), |
- net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)) { |
-} |
- |
-DeterministicSocketHelper::~DeterministicSocketHelper() {} |
- |
-void DeterministicSocketHelper::CompleteWrite() { |
- was_used_to_convey_data_ = true; |
- write_pending_ = false; |
- write_callback_.Run(write_result_); |
-} |
- |
-int DeterministicSocketHelper::CompleteRead() { |
- DCHECK_GT(read_buf_len_, 0); |
- DCHECK_LE(read_data_.data_len, read_buf_len_); |
- DCHECK(read_buf_); |
- |
- was_used_to_convey_data_ = true; |
- |
- if (read_data_.result == ERR_IO_PENDING) |
- read_data_ = data_->GetNextRead(); |
- DCHECK_NE(ERR_IO_PENDING, read_data_.result); |
- // If read_data_.mode is ASYNC, we do not need to wait, since this is already |
- // the callback. Therefore we don't even bother to check it. |
- int result = read_data_.result; |
- |
- if (read_data_.data_len > 0) { |
- DCHECK(read_data_.data); |
- result = std::min(read_buf_len_, read_data_.data_len); |
- memcpy(read_buf_->data(), read_data_.data, result); |
- } |
- |
- if (read_pending_) { |
- read_pending_ = false; |
- read_callback_.Run(result); |
- } |
- |
- return result; |
-} |
- |
-int DeterministicSocketHelper::Write( |
- IOBuffer* buf, int buf_len, const CompletionCallback& callback) { |
- DCHECK(buf); |
- DCHECK_GT(buf_len, 0); |
- |
- std::string data(buf->data(), buf_len); |
- MockWriteResult write_result = data_->OnWrite(data); |
- |
- if (write_result.mode == ASYNC) { |
- write_callback_ = callback; |
- write_result_ = write_result.result; |
- DCHECK(!write_callback_.is_null()); |
- write_pending_ = true; |
- return ERR_IO_PENDING; |
- } |
- |
- was_used_to_convey_data_ = true; |
- write_pending_ = false; |
- return write_result.result; |
-} |
- |
-int DeterministicSocketHelper::Read( |
- IOBuffer* buf, int buf_len, const CompletionCallback& callback) { |
- |
- read_data_ = data_->GetNextRead(); |
- // The buffer should always be big enough to contain all the MockRead data. To |
- // use small buffers, split the data into multiple MockReads. |
- DCHECK_LE(read_data_.data_len, buf_len); |
- |
- if (read_data_.result == ERR_CONNECTION_CLOSED) { |
- // This MockRead is just a marker to instruct us to set |
- // peer_closed_connection_. |
- peer_closed_connection_ = true; |
- } |
- if (read_data_.result == ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ) { |
- // This MockRead is just a marker to instruct us to set |
- // peer_closed_connection_. Skip it and get the next one. |
- read_data_ = data_->GetNextRead(); |
- peer_closed_connection_ = true; |
- } |
- |
- read_buf_ = buf; |
- read_buf_len_ = buf_len; |
- read_callback_ = callback; |
- |
- if (read_data_.mode == ASYNC || (read_data_.result == ERR_IO_PENDING)) { |
- read_pending_ = true; |
- DCHECK(!read_callback_.is_null()); |
- return ERR_IO_PENDING; |
- } |
- |
- was_used_to_convey_data_ = true; |
- return CompleteRead(); |
-} |
- |
-DeterministicMockUDPClientSocket::DeterministicMockUDPClientSocket( |
- net::NetLog* net_log, |
- DeterministicSocketData* data) |
- : connected_(false), |
- helper_(net_log, data), |
- source_port_(123) { |
-} |
- |
-DeterministicMockUDPClientSocket::~DeterministicMockUDPClientSocket() {} |
- |
-bool DeterministicMockUDPClientSocket::WritePending() const { |
- return helper_.write_pending(); |
-} |
- |
-bool DeterministicMockUDPClientSocket::ReadPending() const { |
- return helper_.read_pending(); |
-} |
- |
-void DeterministicMockUDPClientSocket::CompleteWrite() { |
- helper_.CompleteWrite(); |
-} |
- |
-int DeterministicMockUDPClientSocket::CompleteRead() { |
- return helper_.CompleteRead(); |
-} |
- |
-int DeterministicMockUDPClientSocket::Connect(const IPEndPoint& address) { |
- if (connected_) |
- return OK; |
- connected_ = true; |
- peer_address_ = address; |
- return helper_.data()->connect_data().result; |
-}; |
- |
-int DeterministicMockUDPClientSocket::Write( |
- IOBuffer* buf, |
- int buf_len, |
- const CompletionCallback& callback) { |
- if (!connected_) |
- return ERR_UNEXPECTED; |
- |
- return helper_.Write(buf, buf_len, callback); |
-} |
- |
-int DeterministicMockUDPClientSocket::Read( |
- IOBuffer* buf, |
- int buf_len, |
- const CompletionCallback& callback) { |
- if (!connected_) |
- return ERR_UNEXPECTED; |
- |
- return helper_.Read(buf, buf_len, callback); |
-} |
- |
-int DeterministicMockUDPClientSocket::SetReceiveBufferSize(int32 size) { |
- return OK; |
-} |
- |
-int DeterministicMockUDPClientSocket::SetSendBufferSize(int32 size) { |
- return OK; |
-} |
- |
-void DeterministicMockUDPClientSocket::Close() { |
- connected_ = false; |
-} |
- |
-int DeterministicMockUDPClientSocket::GetPeerAddress( |
- IPEndPoint* address) const { |
- *address = peer_address_; |
- return OK; |
-} |
- |
-int DeterministicMockUDPClientSocket::GetLocalAddress( |
- IPEndPoint* address) const { |
- IPAddressNumber ip; |
- bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip); |
- CHECK(rv); |
- *address = IPEndPoint(ip, source_port_); |
- return OK; |
-} |
- |
-const BoundNetLog& DeterministicMockUDPClientSocket::NetLog() const { |
- return helper_.net_log(); |
-} |
- |
-void DeterministicMockUDPClientSocket::OnReadComplete(const MockRead& data) {} |
- |
-void DeterministicMockUDPClientSocket::OnConnectComplete( |
- const MockConnect& data) { |
- NOTIMPLEMENTED(); |
-} |
- |
-DeterministicMockTCPClientSocket::DeterministicMockTCPClientSocket( |
- net::NetLog* net_log, |
- DeterministicSocketData* data) |
- : MockClientSocket(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)), |
- helper_(net_log, data) { |
- peer_addr_ = data->connect_data().peer_addr; |
-} |
- |
-DeterministicMockTCPClientSocket::~DeterministicMockTCPClientSocket() {} |
- |
-bool DeterministicMockTCPClientSocket::WritePending() const { |
- return helper_.write_pending(); |
-} |
- |
-bool DeterministicMockTCPClientSocket::ReadPending() const { |
- return helper_.read_pending(); |
-} |
- |
-void DeterministicMockTCPClientSocket::CompleteWrite() { |
- helper_.CompleteWrite(); |
-} |
- |
-int DeterministicMockTCPClientSocket::CompleteRead() { |
- return helper_.CompleteRead(); |
-} |
- |
-int DeterministicMockTCPClientSocket::Write( |
- IOBuffer* buf, |
- int buf_len, |
- const CompletionCallback& callback) { |
- if (!connected_) |
- return ERR_UNEXPECTED; |
- |
- return helper_.Write(buf, buf_len, callback); |
-} |
- |
-int DeterministicMockTCPClientSocket::Read( |
- IOBuffer* buf, |
- int buf_len, |
- const CompletionCallback& callback) { |
- if (!connected_) |
- return ERR_UNEXPECTED; |
- |
- return helper_.Read(buf, buf_len, callback); |
-} |
- |
-// TODO(erikchen): Support connect sequencing. |
-int DeterministicMockTCPClientSocket::Connect( |
- const CompletionCallback& callback) { |
- if (connected_) |
- return OK; |
- connected_ = true; |
- if (helper_.data()->connect_data().mode == ASYNC) { |
- RunCallbackAsync(callback, helper_.data()->connect_data().result); |
- return ERR_IO_PENDING; |
- } |
- return helper_.data()->connect_data().result; |
-} |
- |
-void DeterministicMockTCPClientSocket::Disconnect() { |
- MockClientSocket::Disconnect(); |
-} |
- |
-bool DeterministicMockTCPClientSocket::IsConnected() const { |
- return connected_ && !helper_.peer_closed_connection(); |
-} |
- |
-bool DeterministicMockTCPClientSocket::IsConnectedAndIdle() const { |
- return IsConnected(); |
-} |
- |
-bool DeterministicMockTCPClientSocket::WasEverUsed() const { |
- return helper_.was_used_to_convey_data(); |
-} |
- |
-bool DeterministicMockTCPClientSocket::UsingTCPFastOpen() const { |
- return false; |
-} |
- |
-bool DeterministicMockTCPClientSocket::WasNpnNegotiated() const { |
- return false; |
-} |
- |
-bool DeterministicMockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) { |
- return false; |
-} |
- |
-void DeterministicMockTCPClientSocket::OnReadComplete(const MockRead& data) {} |
- |
-void DeterministicMockTCPClientSocket::OnConnectComplete( |
- const MockConnect& data) {} |
- |
-MockSSLClientSocket::MockSSLClientSocket( |
- scoped_ptr<ClientSocketHandle> transport_socket, |
- const HostPortPair& host_port_pair, |
- const SSLConfig& ssl_config, |
- SSLSocketDataProvider* data) |
- : MockClientSocket( |
- // Have to use the right BoundNetLog for LoadTimingInfo regression |
- // tests. |
- transport_socket->socket()->NetLog()), |
- transport_(transport_socket.Pass()), |
- host_port_pair_(host_port_pair), |
- data_(data), |
- is_npn_state_set_(false), |
- new_npn_value_(false), |
- is_protocol_negotiated_set_(false), |
- protocol_negotiated_(kProtoUnknown), |
- next_connect_state_(STATE_NONE), |
- reached_connect_(false), |
- weak_factory_(this) { |
- DCHECK(data_); |
- peer_addr_ = data->connect.peer_addr; |
-} |
- |
-MockSSLClientSocket::~MockSSLClientSocket() { |
- Disconnect(); |
-} |
- |
-int MockSSLClientSocket::Read(IOBuffer* buf, int buf_len, |
- const CompletionCallback& callback) { |
- return transport_->socket()->Read(buf, buf_len, callback); |
-} |
- |
-int MockSSLClientSocket::Write(IOBuffer* buf, int buf_len, |
- const CompletionCallback& callback) { |
- return transport_->socket()->Write(buf, buf_len, callback); |
-} |
- |
-int MockSSLClientSocket::Connect(const CompletionCallback& callback) { |
- next_connect_state_ = STATE_SSL_CONNECT; |
- reached_connect_ = true; |
- int rv = DoConnectLoop(OK); |
- if (rv == ERR_IO_PENDING) |
- connect_callback_ = callback; |
- return rv; |
-} |
- |
-void MockSSLClientSocket::Disconnect() { |
- weak_factory_.InvalidateWeakPtrs(); |
- MockClientSocket::Disconnect(); |
- if (transport_->socket() != NULL) |
- transport_->socket()->Disconnect(); |
-} |
- |
-bool MockSSLClientSocket::IsConnected() const { |
- return transport_->socket()->IsConnected() && connected_; |
-} |
- |
-bool MockSSLClientSocket::WasEverUsed() const { |
- return transport_->socket()->WasEverUsed(); |
-} |
- |
-bool MockSSLClientSocket::UsingTCPFastOpen() const { |
- return transport_->socket()->UsingTCPFastOpen(); |
-} |
- |
-int MockSSLClientSocket::GetPeerAddress(IPEndPoint* address) const { |
- return transport_->socket()->GetPeerAddress(address); |
-} |
- |
-bool MockSSLClientSocket::GetSSLInfo(SSLInfo* ssl_info) { |
- ssl_info->Reset(); |
- ssl_info->cert = data_->cert; |
- ssl_info->client_cert_sent = data_->client_cert_sent; |
- ssl_info->channel_id_sent = data_->channel_id_sent; |
- ssl_info->connection_status = data_->connection_status; |
- return true; |
-} |
- |
-std::string MockSSLClientSocket::GetSessionCacheKey() const { |
- // For the purposes of these tests, |host_and_port| will serve as the |
- // cache key. |
- return host_port_pair_.ToString(); |
-} |
- |
-bool MockSSLClientSocket::InSessionCache() const { |
- return data_->is_in_session_cache; |
-} |
- |
-void MockSSLClientSocket::SetHandshakeCompletionCallback( |
- const base::Closure& cb) { |
- handshake_completion_callback_ = cb; |
-} |
- |
-void MockSSLClientSocket::GetSSLCertRequestInfo( |
- SSLCertRequestInfo* cert_request_info) { |
- DCHECK(cert_request_info); |
- if (data_->cert_request_info) { |
- cert_request_info->host_and_port = |
- data_->cert_request_info->host_and_port; |
- cert_request_info->client_certs = data_->cert_request_info->client_certs; |
- } else { |
- cert_request_info->Reset(); |
- } |
-} |
- |
-SSLClientSocket::NextProtoStatus MockSSLClientSocket::GetNextProto( |
- std::string* proto) { |
- *proto = data_->next_proto; |
- return data_->next_proto_status; |
-} |
- |
-bool MockSSLClientSocket::set_was_npn_negotiated(bool negotiated) { |
- is_npn_state_set_ = true; |
- return new_npn_value_ = negotiated; |
-} |
- |
-bool MockSSLClientSocket::WasNpnNegotiated() const { |
- if (is_npn_state_set_) |
- return new_npn_value_; |
- return data_->was_npn_negotiated; |
-} |
- |
-NextProto MockSSLClientSocket::GetNegotiatedProtocol() const { |
- if (is_protocol_negotiated_set_) |
- return protocol_negotiated_; |
- return data_->protocol_negotiated; |
-} |
- |
-void MockSSLClientSocket::set_protocol_negotiated( |
- NextProto protocol_negotiated) { |
- is_protocol_negotiated_set_ = true; |
- protocol_negotiated_ = protocol_negotiated; |
-} |
- |
-bool MockSSLClientSocket::WasChannelIDSent() const { |
- return data_->channel_id_sent; |
-} |
- |
-void MockSSLClientSocket::set_channel_id_sent(bool channel_id_sent) { |
- data_->channel_id_sent = channel_id_sent; |
-} |
- |
-ChannelIDService* MockSSLClientSocket::GetChannelIDService() const { |
- return data_->channel_id_service; |
-} |
- |
-void MockSSLClientSocket::OnReadComplete(const MockRead& data) { |
- NOTIMPLEMENTED(); |
-} |
- |
-void MockSSLClientSocket::OnConnectComplete(const MockConnect& data) { |
- NOTIMPLEMENTED(); |
-} |
- |
-void MockSSLClientSocket::RestartPausedConnect() { |
- DCHECK(data_->should_pause_on_connect); |
- DCHECK_EQ(next_connect_state_, STATE_SSL_CONNECT_COMPLETE); |
- OnIOComplete(data_->connect.result); |
-} |
- |
-void MockSSLClientSocket::OnIOComplete(int result) { |
- int rv = DoConnectLoop(result); |
- if (rv != ERR_IO_PENDING) |
- base::ResetAndReturn(&connect_callback_).Run(rv); |
-} |
- |
-int MockSSLClientSocket::DoConnectLoop(int result) { |
- DCHECK_NE(next_connect_state_, STATE_NONE); |
- |
- int rv = result; |
- do { |
- ConnectState state = next_connect_state_; |
- next_connect_state_ = STATE_NONE; |
- switch (state) { |
- case STATE_SSL_CONNECT: |
- rv = DoSSLConnect(); |
- break; |
- case STATE_SSL_CONNECT_COMPLETE: |
- rv = DoSSLConnectComplete(rv); |
- break; |
- default: |
- NOTREACHED() << "bad state"; |
- rv = ERR_UNEXPECTED; |
- break; |
- } |
- } while (rv != ERR_IO_PENDING && next_connect_state_ != STATE_NONE); |
- |
- return rv; |
-} |
- |
-int MockSSLClientSocket::DoSSLConnect() { |
- next_connect_state_ = STATE_SSL_CONNECT_COMPLETE; |
- |
- if (data_->should_pause_on_connect) |
- return ERR_IO_PENDING; |
- |
- if (data_->connect.mode == ASYNC) { |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&MockSSLClientSocket::OnIOComplete, |
- weak_factory_.GetWeakPtr(), |
- data_->connect.result)); |
- return ERR_IO_PENDING; |
- } |
- |
- return data_->connect.result; |
-} |
- |
-int MockSSLClientSocket::DoSSLConnectComplete(int result) { |
- if (result == OK) |
- connected_ = true; |
- |
- if (!handshake_completion_callback_.is_null()) |
- base::ResetAndReturn(&handshake_completion_callback_).Run(); |
- return result; |
-} |
- |
-MockUDPClientSocket::MockUDPClientSocket(SocketDataProvider* data, |
- net::NetLog* net_log) |
- : connected_(false), |
- data_(data), |
- read_offset_(0), |
- read_data_(SYNCHRONOUS, ERR_UNEXPECTED), |
- need_read_data_(true), |
- source_port_(123), |
- pending_buf_(NULL), |
- pending_buf_len_(0), |
- net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)), |
- weak_factory_(this) { |
- DCHECK(data_); |
- data_->Reset(); |
- peer_addr_ = data->connect_data().peer_addr; |
-} |
- |
-MockUDPClientSocket::~MockUDPClientSocket() {} |
- |
-int MockUDPClientSocket::Read(IOBuffer* buf, |
- int buf_len, |
- const CompletionCallback& callback) { |
- if (!connected_) |
- return ERR_UNEXPECTED; |
- |
- // If the buffer is already in use, a read is already in progress! |
- DCHECK(pending_buf_.get() == NULL); |
- |
- // Store our async IO data. |
- pending_buf_ = buf; |
- pending_buf_len_ = buf_len; |
- pending_callback_ = callback; |
- |
- if (need_read_data_) { |
- read_data_ = data_->GetNextRead(); |
- // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility |
- // to complete the async IO manually later (via OnReadComplete). |
- if (read_data_.result == ERR_IO_PENDING) { |
- // We need to be using async IO in this case. |
- DCHECK(!callback.is_null()); |
- return ERR_IO_PENDING; |
- } |
- need_read_data_ = false; |
- } |
- |
- return CompleteRead(); |
-} |
- |
-int MockUDPClientSocket::Write(IOBuffer* buf, int buf_len, |
- const CompletionCallback& callback) { |
- DCHECK(buf); |
- DCHECK_GT(buf_len, 0); |
- |
- if (!connected_) |
- return ERR_UNEXPECTED; |
- |
- std::string data(buf->data(), buf_len); |
- MockWriteResult write_result = data_->OnWrite(data); |
- |
- if (write_result.mode == ASYNC) { |
- RunCallbackAsync(callback, write_result.result); |
- return ERR_IO_PENDING; |
- } |
- return write_result.result; |
-} |
- |
-int MockUDPClientSocket::SetReceiveBufferSize(int32 size) { |
- return OK; |
-} |
- |
-int MockUDPClientSocket::SetSendBufferSize(int32 size) { |
- return OK; |
-} |
- |
-void MockUDPClientSocket::Close() { |
- connected_ = false; |
-} |
- |
-int MockUDPClientSocket::GetPeerAddress(IPEndPoint* address) const { |
- *address = peer_addr_; |
- return OK; |
-} |
- |
-int MockUDPClientSocket::GetLocalAddress(IPEndPoint* address) const { |
- IPAddressNumber ip; |
- bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip); |
- CHECK(rv); |
- *address = IPEndPoint(ip, source_port_); |
- return OK; |
-} |
- |
-const BoundNetLog& MockUDPClientSocket::NetLog() const { |
- return net_log_; |
-} |
- |
-int MockUDPClientSocket::Connect(const IPEndPoint& address) { |
- connected_ = true; |
- peer_addr_ = address; |
- return data_->connect_data().result; |
-} |
- |
-void MockUDPClientSocket::OnReadComplete(const MockRead& data) { |
- // There must be a read pending. |
- DCHECK(pending_buf_.get()); |
- // You can't complete a read with another ERR_IO_PENDING status code. |
- DCHECK_NE(ERR_IO_PENDING, data.result); |
- // Since we've been waiting for data, need_read_data_ should be true. |
- DCHECK(need_read_data_); |
- |
- read_data_ = data; |
- need_read_data_ = false; |
- |
- // The caller is simulating that this IO completes right now. Don't |
- // let CompleteRead() schedule a callback. |
- read_data_.mode = SYNCHRONOUS; |
- |
- net::CompletionCallback callback = pending_callback_; |
- int rv = CompleteRead(); |
- RunCallback(callback, rv); |
-} |
- |
-void MockUDPClientSocket::OnConnectComplete(const MockConnect& data) { |
- NOTIMPLEMENTED(); |
-} |
- |
-int MockUDPClientSocket::CompleteRead() { |
- DCHECK(pending_buf_.get()); |
- DCHECK(pending_buf_len_ > 0); |
- |
- // Save the pending async IO data and reset our |pending_| state. |
- scoped_refptr<IOBuffer> buf = pending_buf_; |
- int buf_len = pending_buf_len_; |
- CompletionCallback callback = pending_callback_; |
- pending_buf_ = NULL; |
- pending_buf_len_ = 0; |
- pending_callback_.Reset(); |
- |
- int result = read_data_.result; |
- DCHECK(result != ERR_IO_PENDING); |
- |
- if (read_data_.data) { |
- if (read_data_.data_len - read_offset_ > 0) { |
- result = std::min(buf_len, read_data_.data_len - read_offset_); |
- memcpy(buf->data(), read_data_.data + read_offset_, result); |
- read_offset_ += result; |
- if (read_offset_ == read_data_.data_len) { |
- need_read_data_ = true; |
- read_offset_ = 0; |
- } |
- } else { |
- result = 0; // EOF |
- } |
- } |
- |
- if (read_data_.mode == ASYNC) { |
- DCHECK(!callback.is_null()); |
- RunCallbackAsync(callback, result); |
- return ERR_IO_PENDING; |
- } |
- return result; |
-} |
- |
-void MockUDPClientSocket::RunCallbackAsync(const CompletionCallback& callback, |
- int result) { |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&MockUDPClientSocket::RunCallback, |
- weak_factory_.GetWeakPtr(), |
- callback, |
- result)); |
-} |
- |
-void MockUDPClientSocket::RunCallback(const CompletionCallback& callback, |
- int result) { |
- if (!callback.is_null()) |
- callback.Run(result); |
-} |
- |
-TestSocketRequest::TestSocketRequest( |
- std::vector<TestSocketRequest*>* request_order, size_t* completion_count) |
- : request_order_(request_order), |
- completion_count_(completion_count), |
- callback_(base::Bind(&TestSocketRequest::OnComplete, |
- base::Unretained(this))) { |
- DCHECK(request_order); |
- DCHECK(completion_count); |
-} |
- |
-TestSocketRequest::~TestSocketRequest() { |
-} |
- |
-void TestSocketRequest::OnComplete(int result) { |
- SetResult(result); |
- (*completion_count_)++; |
- request_order_->push_back(this); |
-} |
- |
-// static |
-const int ClientSocketPoolTest::kIndexOutOfBounds = -1; |
- |
-// static |
-const int ClientSocketPoolTest::kRequestNotFound = -2; |
- |
-ClientSocketPoolTest::ClientSocketPoolTest() : completion_count_(0) {} |
-ClientSocketPoolTest::~ClientSocketPoolTest() {} |
- |
-int ClientSocketPoolTest::GetOrderOfRequest(size_t index) const { |
- index--; |
- if (index >= requests_.size()) |
- return kIndexOutOfBounds; |
- |
- for (size_t i = 0; i < request_order_.size(); i++) |
- if (requests_[index] == request_order_[i]) |
- return i + 1; |
- |
- return kRequestNotFound; |
-} |
- |
-bool ClientSocketPoolTest::ReleaseOneConnection(KeepAlive keep_alive) { |
- ScopedVector<TestSocketRequest>::iterator i; |
- for (i = requests_.begin(); i != requests_.end(); ++i) { |
- if ((*i)->handle()->is_initialized()) { |
- if (keep_alive == NO_KEEP_ALIVE) |
- (*i)->handle()->socket()->Disconnect(); |
- (*i)->handle()->Reset(); |
- base::RunLoop().RunUntilIdle(); |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-void ClientSocketPoolTest::ReleaseAllConnections(KeepAlive keep_alive) { |
- bool released_one; |
- do { |
- released_one = ReleaseOneConnection(keep_alive); |
- } while (released_one); |
-} |
- |
-MockTransportClientSocketPool::MockConnectJob::MockConnectJob( |
- scoped_ptr<StreamSocket> socket, |
- ClientSocketHandle* handle, |
- const CompletionCallback& callback) |
- : socket_(socket.Pass()), |
- handle_(handle), |
- user_callback_(callback) { |
-} |
- |
-MockTransportClientSocketPool::MockConnectJob::~MockConnectJob() {} |
- |
-int MockTransportClientSocketPool::MockConnectJob::Connect() { |
- int rv = socket_->Connect(base::Bind(&MockConnectJob::OnConnect, |
- base::Unretained(this))); |
- if (rv == OK) { |
- user_callback_.Reset(); |
- OnConnect(OK); |
- } |
- return rv; |
-} |
- |
-bool MockTransportClientSocketPool::MockConnectJob::CancelHandle( |
- const ClientSocketHandle* handle) { |
- if (handle != handle_) |
- return false; |
- socket_.reset(); |
- handle_ = NULL; |
- user_callback_.Reset(); |
- return true; |
-} |
- |
-void MockTransportClientSocketPool::MockConnectJob::OnConnect(int rv) { |
- if (!socket_.get()) |
- return; |
- if (rv == OK) { |
- handle_->SetSocket(socket_.Pass()); |
- |
- // Needed for socket pool tests that layer other sockets on top of mock |
- // sockets. |
- LoadTimingInfo::ConnectTiming connect_timing; |
- base::TimeTicks now = base::TimeTicks::Now(); |
- connect_timing.dns_start = now; |
- connect_timing.dns_end = now; |
- connect_timing.connect_start = now; |
- connect_timing.connect_end = now; |
- handle_->set_connect_timing(connect_timing); |
- } else { |
- socket_.reset(); |
- } |
- |
- handle_ = NULL; |
- |
- if (!user_callback_.is_null()) { |
- CompletionCallback callback = user_callback_; |
- user_callback_.Reset(); |
- callback.Run(rv); |
- } |
-} |
- |
-MockTransportClientSocketPool::MockTransportClientSocketPool( |
- int max_sockets, |
- int max_sockets_per_group, |
- ClientSocketPoolHistograms* histograms, |
- ClientSocketFactory* socket_factory) |
- : TransportClientSocketPool(max_sockets, max_sockets_per_group, histograms, |
- NULL, NULL, NULL), |
- client_socket_factory_(socket_factory), |
- last_request_priority_(DEFAULT_PRIORITY), |
- release_count_(0), |
- cancel_count_(0) { |
-} |
- |
-MockTransportClientSocketPool::~MockTransportClientSocketPool() {} |
- |
-int MockTransportClientSocketPool::RequestSocket( |
- const std::string& group_name, const void* socket_params, |
- RequestPriority priority, ClientSocketHandle* handle, |
- const CompletionCallback& callback, const BoundNetLog& net_log) { |
- last_request_priority_ = priority; |
- scoped_ptr<StreamSocket> socket = |
- client_socket_factory_->CreateTransportClientSocket( |
- AddressList(), net_log.net_log(), net::NetLog::Source()); |
- MockConnectJob* job = new MockConnectJob(socket.Pass(), handle, callback); |
- job_list_.push_back(job); |
- handle->set_pool_id(1); |
- return job->Connect(); |
-} |
- |
-void MockTransportClientSocketPool::CancelRequest(const std::string& group_name, |
- ClientSocketHandle* handle) { |
- std::vector<MockConnectJob*>::iterator i; |
- for (i = job_list_.begin(); i != job_list_.end(); ++i) { |
- if ((*i)->CancelHandle(handle)) { |
- cancel_count_++; |
- break; |
- } |
- } |
-} |
- |
-void MockTransportClientSocketPool::ReleaseSocket( |
- const std::string& group_name, |
- scoped_ptr<StreamSocket> socket, |
- int id) { |
- EXPECT_EQ(1, id); |
- release_count_++; |
-} |
- |
-DeterministicMockClientSocketFactory::DeterministicMockClientSocketFactory() {} |
- |
-DeterministicMockClientSocketFactory::~DeterministicMockClientSocketFactory() {} |
- |
-void DeterministicMockClientSocketFactory::AddSocketDataProvider( |
- DeterministicSocketData* data) { |
- mock_data_.Add(data); |
-} |
- |
-void DeterministicMockClientSocketFactory::AddSSLSocketDataProvider( |
- SSLSocketDataProvider* data) { |
- mock_ssl_data_.Add(data); |
-} |
- |
-void DeterministicMockClientSocketFactory::ResetNextMockIndexes() { |
- mock_data_.ResetNextIndex(); |
- mock_ssl_data_.ResetNextIndex(); |
-} |
- |
-MockSSLClientSocket* DeterministicMockClientSocketFactory:: |
- GetMockSSLClientSocket(size_t index) const { |
- DCHECK_LT(index, ssl_client_sockets_.size()); |
- return ssl_client_sockets_[index]; |
-} |
- |
-scoped_ptr<DatagramClientSocket> |
-DeterministicMockClientSocketFactory::CreateDatagramClientSocket( |
- DatagramSocket::BindType bind_type, |
- const RandIntCallback& rand_int_cb, |
- net::NetLog* net_log, |
- const NetLog::Source& source) { |
- DeterministicSocketData* data_provider = mock_data().GetNext(); |
- scoped_ptr<DeterministicMockUDPClientSocket> socket( |
- new DeterministicMockUDPClientSocket(net_log, data_provider)); |
- data_provider->set_delegate(socket->AsWeakPtr()); |
- udp_client_sockets().push_back(socket.get()); |
- if (bind_type == DatagramSocket::RANDOM_BIND) |
- socket->set_source_port(static_cast<uint16>(rand_int_cb.Run(1025, 65535))); |
- return socket.Pass(); |
-} |
- |
-scoped_ptr<StreamSocket> |
-DeterministicMockClientSocketFactory::CreateTransportClientSocket( |
- const AddressList& addresses, |
- net::NetLog* net_log, |
- const net::NetLog::Source& source) { |
- DeterministicSocketData* data_provider = mock_data().GetNext(); |
- scoped_ptr<DeterministicMockTCPClientSocket> socket( |
- new DeterministicMockTCPClientSocket(net_log, data_provider)); |
- data_provider->set_delegate(socket->AsWeakPtr()); |
- tcp_client_sockets().push_back(socket.get()); |
- return socket.Pass(); |
-} |
- |
-scoped_ptr<SSLClientSocket> |
-DeterministicMockClientSocketFactory::CreateSSLClientSocket( |
- scoped_ptr<ClientSocketHandle> transport_socket, |
- const HostPortPair& host_and_port, |
- const SSLConfig& ssl_config, |
- const SSLClientSocketContext& context) { |
- scoped_ptr<MockSSLClientSocket> socket( |
- new MockSSLClientSocket(transport_socket.Pass(), |
- host_and_port, ssl_config, |
- mock_ssl_data_.GetNext())); |
- ssl_client_sockets_.push_back(socket.get()); |
- return socket.Pass(); |
-} |
- |
-void DeterministicMockClientSocketFactory::ClearSSLSessionCache() { |
-} |
- |
-MockSOCKSClientSocketPool::MockSOCKSClientSocketPool( |
- int max_sockets, |
- int max_sockets_per_group, |
- ClientSocketPoolHistograms* histograms, |
- TransportClientSocketPool* transport_pool) |
- : SOCKSClientSocketPool(max_sockets, max_sockets_per_group, histograms, |
- NULL, transport_pool, NULL), |
- transport_pool_(transport_pool) { |
-} |
- |
-MockSOCKSClientSocketPool::~MockSOCKSClientSocketPool() {} |
- |
-int MockSOCKSClientSocketPool::RequestSocket( |
- const std::string& group_name, const void* socket_params, |
- RequestPriority priority, ClientSocketHandle* handle, |
- const CompletionCallback& callback, const BoundNetLog& net_log) { |
- return transport_pool_->RequestSocket( |
- group_name, socket_params, priority, handle, callback, net_log); |
-} |
- |
-void MockSOCKSClientSocketPool::CancelRequest( |
- const std::string& group_name, |
- ClientSocketHandle* handle) { |
- return transport_pool_->CancelRequest(group_name, handle); |
-} |
- |
-void MockSOCKSClientSocketPool::ReleaseSocket(const std::string& group_name, |
- scoped_ptr<StreamSocket> socket, |
- int id) { |
- return transport_pool_->ReleaseSocket(group_name, socket.Pass(), id); |
-} |
- |
-ScopedWebSocketEndpointZeroUnlockDelay:: |
- ScopedWebSocketEndpointZeroUnlockDelay() { |
- old_delay_ = |
- WebSocketEndpointLockManager::GetInstance()->SetUnlockDelayForTesting( |
- base::TimeDelta()); |
-} |
- |
-ScopedWebSocketEndpointZeroUnlockDelay:: |
- ~ScopedWebSocketEndpointZeroUnlockDelay() { |
- base::TimeDelta active_delay = |
- WebSocketEndpointLockManager::GetInstance()->SetUnlockDelayForTesting( |
- old_delay_); |
- EXPECT_EQ(active_delay, base::TimeDelta()); |
-} |
- |
-const char kSOCKS5GreetRequest[] = { 0x05, 0x01, 0x00 }; |
-const int kSOCKS5GreetRequestLength = arraysize(kSOCKS5GreetRequest); |
- |
-const char kSOCKS5GreetResponse[] = { 0x05, 0x00 }; |
-const int kSOCKS5GreetResponseLength = arraysize(kSOCKS5GreetResponse); |
- |
-const char kSOCKS5OkRequest[] = |
- { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 }; |
-const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest); |
- |
-const char kSOCKS5OkResponse[] = |
- { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; |
-const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse); |
- |
-} // namespace net |