• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "net/socket/socket_test_util.h"
6 
7 #include <algorithm>
8 #include <vector>
9 
10 #include "base/basictypes.h"
11 #include "base/bind.h"
12 #include "base/bind_helpers.h"
13 #include "base/compiler_specific.h"
14 #include "base/message_loop/message_loop.h"
15 #include "base/run_loop.h"
16 #include "base/time/time.h"
17 #include "net/base/address_family.h"
18 #include "net/base/address_list.h"
19 #include "net/base/auth.h"
20 #include "net/base/load_timing_info.h"
21 #include "net/http/http_network_session.h"
22 #include "net/http/http_request_headers.h"
23 #include "net/http/http_response_headers.h"
24 #include "net/socket/client_socket_pool_histograms.h"
25 #include "net/socket/socket.h"
26 #include "net/ssl/ssl_cert_request_info.h"
27 #include "net/ssl/ssl_connection_status_flags.h"
28 #include "net/ssl/ssl_info.h"
29 #include "testing/gtest/include/gtest/gtest.h"
30 
31 // Socket events are easier to debug if you log individual reads and writes.
32 // Enable these if locally debugging, but they are too noisy for the waterfall.
33 #if 0
34 #define NET_TRACE(level, s) DLOG(level) << s << __FUNCTION__ << "() "
35 #else
36 #define NET_TRACE(level, s) EAT_STREAM_PARAMETERS
37 #endif
38 
39 namespace net {
40 
41 namespace {
42 
AsciifyHigh(char x)43 inline char AsciifyHigh(char x) {
44   char nybble = static_cast<char>((x >> 4) & 0x0F);
45   return nybble + ((nybble < 0x0A) ? '0' : 'A' - 10);
46 }
47 
AsciifyLow(char x)48 inline char AsciifyLow(char x) {
49   char nybble = static_cast<char>((x >> 0) & 0x0F);
50   return nybble + ((nybble < 0x0A) ? '0' : 'A' - 10);
51 }
52 
Asciify(char x)53 inline char Asciify(char x) {
54   if ((x < 0) || !isprint(x))
55     return '.';
56   return x;
57 }
58 
DumpData(const char * data,int data_len)59 void DumpData(const char* data, int data_len) {
60   if (logging::LOG_INFO < logging::GetMinLogLevel())
61     return;
62   DVLOG(1) << "Length:  " << data_len;
63   const char* pfx = "Data:    ";
64   if (!data || (data_len <= 0)) {
65     DVLOG(1) << pfx << "<None>";
66   } else {
67     int i;
68     for (i = 0; i <= (data_len - 4); i += 4) {
69       DVLOG(1) << pfx
70                << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
71                << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
72                << AsciifyHigh(data[i + 2]) << AsciifyLow(data[i + 2])
73                << AsciifyHigh(data[i + 3]) << AsciifyLow(data[i + 3])
74                << "  '"
75                << Asciify(data[i + 0])
76                << Asciify(data[i + 1])
77                << Asciify(data[i + 2])
78                << Asciify(data[i + 3])
79                << "'";
80       pfx = "         ";
81     }
82     // Take care of any 'trailing' bytes, if data_len was not a multiple of 4.
83     switch (data_len - i) {
84       case 3:
85         DVLOG(1) << pfx
86                  << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
87                  << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
88                  << AsciifyHigh(data[i + 2]) << AsciifyLow(data[i + 2])
89                  << "    '"
90                  << Asciify(data[i + 0])
91                  << Asciify(data[i + 1])
92                  << Asciify(data[i + 2])
93                  << " '";
94         break;
95       case 2:
96         DVLOG(1) << pfx
97                  << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
98                  << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
99                  << "      '"
100                  << Asciify(data[i + 0])
101                  << Asciify(data[i + 1])
102                  << "  '";
103         break;
104       case 1:
105         DVLOG(1) << pfx
106                  << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
107                  << "        '"
108                  << Asciify(data[i + 0])
109                  << "   '";
110         break;
111     }
112   }
113 }
114 
115 template <MockReadWriteType type>
DumpMockReadWrite(const MockReadWrite<type> & r)116 void DumpMockReadWrite(const MockReadWrite<type>& r) {
117   if (logging::LOG_INFO < logging::GetMinLogLevel())
118     return;
119   DVLOG(1) << "Async:   " << (r.mode == ASYNC)
120            << "\nResult:  " << r.result;
121   DumpData(r.data, r.data_len);
122   const char* stop = (r.sequence_number & MockRead::STOPLOOP) ? " (STOP)" : "";
123   DVLOG(1) << "Stage:   " << (r.sequence_number & ~MockRead::STOPLOOP) << stop
124            << "\nTime:    " << r.time_stamp.ToInternalValue();
125 }
126 
127 }  // namespace
128 
MockConnect()129 MockConnect::MockConnect() : mode(ASYNC), result(OK) {
130   IPAddressNumber ip;
131   CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
132   peer_addr = IPEndPoint(ip, 0);
133 }
134 
MockConnect(IoMode io_mode,int r)135 MockConnect::MockConnect(IoMode io_mode, int r) : mode(io_mode), result(r) {
136   IPAddressNumber ip;
137   CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
138   peer_addr = IPEndPoint(ip, 0);
139 }
140 
MockConnect(IoMode io_mode,int r,IPEndPoint addr)141 MockConnect::MockConnect(IoMode io_mode, int r, IPEndPoint addr) :
142     mode(io_mode),
143     result(r),
144     peer_addr(addr) {
145 }
146 
~MockConnect()147 MockConnect::~MockConnect() {}
148 
StaticSocketDataProvider()149 StaticSocketDataProvider::StaticSocketDataProvider()
150     : reads_(NULL),
151       read_index_(0),
152       read_count_(0),
153       writes_(NULL),
154       write_index_(0),
155       write_count_(0) {
156 }
157 
StaticSocketDataProvider(MockRead * reads,size_t reads_count,MockWrite * writes,size_t writes_count)158 StaticSocketDataProvider::StaticSocketDataProvider(MockRead* reads,
159                                                    size_t reads_count,
160                                                    MockWrite* writes,
161                                                    size_t writes_count)
162     : reads_(reads),
163       read_index_(0),
164       read_count_(reads_count),
165       writes_(writes),
166       write_index_(0),
167       write_count_(writes_count) {
168 }
169 
~StaticSocketDataProvider()170 StaticSocketDataProvider::~StaticSocketDataProvider() {}
171 
PeekRead() const172 const MockRead& StaticSocketDataProvider::PeekRead() const {
173   CHECK(!at_read_eof());
174   return reads_[read_index_];
175 }
176 
PeekWrite() const177 const MockWrite& StaticSocketDataProvider::PeekWrite() const {
178   CHECK(!at_write_eof());
179   return writes_[write_index_];
180 }
181 
PeekRead(size_t index) const182 const MockRead& StaticSocketDataProvider::PeekRead(size_t index) const {
183   CHECK_LT(index, read_count_);
184   return reads_[index];
185 }
186 
PeekWrite(size_t index) const187 const MockWrite& StaticSocketDataProvider::PeekWrite(size_t index) const {
188   CHECK_LT(index, write_count_);
189   return writes_[index];
190 }
191 
GetNextRead()192 MockRead StaticSocketDataProvider::GetNextRead() {
193   CHECK(!at_read_eof());
194   reads_[read_index_].time_stamp = base::Time::Now();
195   return reads_[read_index_++];
196 }
197 
OnWrite(const std::string & data)198 MockWriteResult StaticSocketDataProvider::OnWrite(const std::string& data) {
199   if (!writes_) {
200     // Not using mock writes; succeed synchronously.
201     return MockWriteResult(SYNCHRONOUS, data.length());
202   }
203   EXPECT_FALSE(at_write_eof());
204   if (at_write_eof()) {
205     // Show what the extra write actually consists of.
206     EXPECT_EQ("<unexpected write>", data);
207     return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
208   }
209 
210   // Check that what we are writing matches the expectation.
211   // Then give the mocked return value.
212   MockWrite* w = &writes_[write_index_++];
213   w->time_stamp = base::Time::Now();
214   int result = w->result;
215   if (w->data) {
216     // Note - we can simulate a partial write here.  If the expected data
217     // is a match, but shorter than the write actually written, that is legal.
218     // Example:
219     //   Application writes "foobarbaz" (9 bytes)
220     //   Expected write was "foo" (3 bytes)
221     //   This is a success, and we return 3 to the application.
222     std::string expected_data(w->data, w->data_len);
223     EXPECT_GE(data.length(), expected_data.length());
224     std::string actual_data(data.substr(0, w->data_len));
225     EXPECT_EQ(expected_data, actual_data);
226     if (expected_data != actual_data)
227       return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
228     if (result == OK)
229       result = w->data_len;
230   }
231   return MockWriteResult(w->mode, result);
232 }
233 
Reset()234 void StaticSocketDataProvider::Reset() {
235   read_index_ = 0;
236   write_index_ = 0;
237 }
238 
DynamicSocketDataProvider()239 DynamicSocketDataProvider::DynamicSocketDataProvider()
240     : short_read_limit_(0),
241       allow_unconsumed_reads_(false) {
242 }
243 
~DynamicSocketDataProvider()244 DynamicSocketDataProvider::~DynamicSocketDataProvider() {}
245 
GetNextRead()246 MockRead DynamicSocketDataProvider::GetNextRead() {
247   if (reads_.empty())
248     return MockRead(SYNCHRONOUS, ERR_UNEXPECTED);
249   MockRead result = reads_.front();
250   if (short_read_limit_ == 0 || result.data_len <= short_read_limit_) {
251     reads_.pop_front();
252   } else {
253     result.data_len = short_read_limit_;
254     reads_.front().data += result.data_len;
255     reads_.front().data_len -= result.data_len;
256   }
257   return result;
258 }
259 
Reset()260 void DynamicSocketDataProvider::Reset() {
261   reads_.clear();
262 }
263 
SimulateRead(const char * data,const size_t length)264 void DynamicSocketDataProvider::SimulateRead(const char* data,
265                                              const size_t length) {
266   if (!allow_unconsumed_reads_) {
267     EXPECT_TRUE(reads_.empty()) << "Unconsumed read: " << reads_.front().data;
268   }
269   reads_.push_back(MockRead(ASYNC, data, length));
270 }
271 
SSLSocketDataProvider(IoMode mode,int result)272 SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode, int result)
273     : connect(mode, result),
274       next_proto_status(SSLClientSocket::kNextProtoUnsupported),
275       was_npn_negotiated(false),
276       protocol_negotiated(kProtoUnknown),
277       client_cert_sent(false),
278       cert_request_info(NULL),
279       channel_id_sent(false),
280       connection_status(0) {
281   SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_2,
282                                 &connection_status);
283   // Set to TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
284   SSLConnectionStatusSetCipherSuite(0xcc14, &connection_status);
285 }
286 
~SSLSocketDataProvider()287 SSLSocketDataProvider::~SSLSocketDataProvider() {
288 }
289 
SetNextProto(NextProto proto)290 void SSLSocketDataProvider::SetNextProto(NextProto proto) {
291   was_npn_negotiated = true;
292   next_proto_status = SSLClientSocket::kNextProtoNegotiated;
293   protocol_negotiated = proto;
294   next_proto = SSLClientSocket::NextProtoToString(proto);
295 }
296 
DelayedSocketData(int write_delay,MockRead * reads,size_t reads_count,MockWrite * writes,size_t writes_count)297 DelayedSocketData::DelayedSocketData(
298     int write_delay, MockRead* reads, size_t reads_count,
299     MockWrite* writes, size_t writes_count)
300     : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
301       write_delay_(write_delay),
302       read_in_progress_(false),
303       weak_factory_(this) {
304   DCHECK_GE(write_delay_, 0);
305 }
306 
DelayedSocketData(const MockConnect & connect,int write_delay,MockRead * reads,size_t reads_count,MockWrite * writes,size_t writes_count)307 DelayedSocketData::DelayedSocketData(
308     const MockConnect& connect, int write_delay, MockRead* reads,
309     size_t reads_count, MockWrite* writes, size_t writes_count)
310     : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
311       write_delay_(write_delay),
312       read_in_progress_(false),
313       weak_factory_(this) {
314   DCHECK_GE(write_delay_, 0);
315   set_connect_data(connect);
316 }
317 
~DelayedSocketData()318 DelayedSocketData::~DelayedSocketData() {
319 }
320 
ForceNextRead()321 void DelayedSocketData::ForceNextRead() {
322   DCHECK(read_in_progress_);
323   write_delay_ = 0;
324   CompleteRead();
325 }
326 
GetNextRead()327 MockRead DelayedSocketData::GetNextRead() {
328   MockRead out = MockRead(ASYNC, ERR_IO_PENDING);
329   if (write_delay_ <= 0)
330     out = StaticSocketDataProvider::GetNextRead();
331   read_in_progress_ = (out.result == ERR_IO_PENDING);
332   return out;
333 }
334 
OnWrite(const std::string & data)335 MockWriteResult DelayedSocketData::OnWrite(const std::string& data) {
336   MockWriteResult rv = StaticSocketDataProvider::OnWrite(data);
337   // Now that our write has completed, we can allow reads to continue.
338   if (!--write_delay_ && read_in_progress_)
339     base::MessageLoop::current()->PostDelayedTask(
340         FROM_HERE,
341         base::Bind(&DelayedSocketData::CompleteRead,
342                    weak_factory_.GetWeakPtr()),
343         base::TimeDelta::FromMilliseconds(100));
344   return rv;
345 }
346 
Reset()347 void DelayedSocketData::Reset() {
348   set_socket(NULL);
349   read_in_progress_ = false;
350   weak_factory_.InvalidateWeakPtrs();
351   StaticSocketDataProvider::Reset();
352 }
353 
CompleteRead()354 void DelayedSocketData::CompleteRead() {
355   if (socket() && read_in_progress_)
356     socket()->OnReadComplete(GetNextRead());
357 }
358 
OrderedSocketData(MockRead * reads,size_t reads_count,MockWrite * writes,size_t writes_count)359 OrderedSocketData::OrderedSocketData(
360     MockRead* reads, size_t reads_count, MockWrite* writes, size_t writes_count)
361     : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
362       sequence_number_(0), loop_stop_stage_(0),
363       blocked_(false), weak_factory_(this) {
364 }
365 
OrderedSocketData(const MockConnect & connect,MockRead * reads,size_t reads_count,MockWrite * writes,size_t writes_count)366 OrderedSocketData::OrderedSocketData(
367     const MockConnect& connect,
368     MockRead* reads, size_t reads_count,
369     MockWrite* writes, size_t writes_count)
370     : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
371       sequence_number_(0), loop_stop_stage_(0),
372       blocked_(false), weak_factory_(this) {
373   set_connect_data(connect);
374 }
375 
EndLoop()376 void OrderedSocketData::EndLoop() {
377   // If we've already stopped the loop, don't do it again until we've advanced
378   // to the next sequence_number.
379   NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_ << ": EndLoop()";
380   if (loop_stop_stage_ > 0) {
381     const MockRead& next_read = StaticSocketDataProvider::PeekRead();
382     if ((next_read.sequence_number & ~MockRead::STOPLOOP) >
383         loop_stop_stage_) {
384       NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
385                                 << ": Clearing stop index";
386       loop_stop_stage_ = 0;
387     } else {
388       return;
389     }
390   }
391   // Record the sequence_number at which we stopped the loop.
392   NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
393                             << ": Posting Quit at read " << read_index();
394   loop_stop_stage_ = sequence_number_;
395 }
396 
GetNextRead()397 MockRead OrderedSocketData::GetNextRead() {
398   weak_factory_.InvalidateWeakPtrs();
399   blocked_ = false;
400   const MockRead& next_read = StaticSocketDataProvider::PeekRead();
401   if (next_read.sequence_number & MockRead::STOPLOOP)
402     EndLoop();
403   if ((next_read.sequence_number & ~MockRead::STOPLOOP) <=
404       sequence_number_++) {
405     NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_ - 1
406                               << ": Read " << read_index();
407     DumpMockReadWrite(next_read);
408     blocked_ = (next_read.result == ERR_IO_PENDING);
409     return StaticSocketDataProvider::GetNextRead();
410   }
411   NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_ - 1
412                             << ": I/O Pending";
413   MockRead result = MockRead(ASYNC, ERR_IO_PENDING);
414   DumpMockReadWrite(result);
415   blocked_ = true;
416   return result;
417 }
418 
OnWrite(const std::string & data)419 MockWriteResult OrderedSocketData::OnWrite(const std::string& data) {
420   NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
421                             << ": Write " << write_index();
422   DumpMockReadWrite(PeekWrite());
423   ++sequence_number_;
424   if (blocked_) {
425     // TODO(willchan): This 100ms delay seems to work around some weirdness.  We
426     // should probably fix the weirdness.  One example is in SpdyStream,
427     // DoSendRequest() will return ERR_IO_PENDING, and there's a race.  If the
428     // SYN_REPLY causes OnResponseReceived() to get called before
429     // SpdyStream::ReadResponseHeaders() is called, we hit a NOTREACHED().
430     base::MessageLoop::current()->PostDelayedTask(
431         FROM_HERE,
432         base::Bind(&OrderedSocketData::CompleteRead,
433                    weak_factory_.GetWeakPtr()),
434         base::TimeDelta::FromMilliseconds(100));
435   }
436   return StaticSocketDataProvider::OnWrite(data);
437 }
438 
Reset()439 void OrderedSocketData::Reset() {
440   NET_TRACE(INFO, "  *** ") << "Stage "
441                             << sequence_number_ << ": Reset()";
442   sequence_number_ = 0;
443   loop_stop_stage_ = 0;
444   set_socket(NULL);
445   weak_factory_.InvalidateWeakPtrs();
446   StaticSocketDataProvider::Reset();
447 }
448 
CompleteRead()449 void OrderedSocketData::CompleteRead() {
450   if (socket() && blocked_) {
451     NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_;
452     socket()->OnReadComplete(GetNextRead());
453   }
454 }
455 
~OrderedSocketData()456 OrderedSocketData::~OrderedSocketData() {}
457 
DeterministicSocketData(MockRead * reads,size_t reads_count,MockWrite * writes,size_t writes_count)458 DeterministicSocketData::DeterministicSocketData(MockRead* reads,
459     size_t reads_count, MockWrite* writes, size_t writes_count)
460     : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
461       sequence_number_(0),
462       current_read_(),
463       current_write_(),
464       stopping_sequence_number_(0),
465       stopped_(false),
466       print_debug_(false),
467       is_running_(false) {
468   VerifyCorrectSequenceNumbers(reads, reads_count, writes, writes_count);
469 }
470 
~DeterministicSocketData()471 DeterministicSocketData::~DeterministicSocketData() {}
472 
Run()473 void DeterministicSocketData::Run() {
474   DCHECK(!is_running_);
475   is_running_ = true;
476 
477   SetStopped(false);
478   int counter = 0;
479   // Continue to consume data until all data has run out, or the stopped_ flag
480   // has been set. Consuming data requires two separate operations -- running
481   // the tasks in the message loop, and explicitly invoking the read/write
482   // callbacks (simulating network I/O). We check our conditions between each,
483   // since they can change in either.
484   while ((!at_write_eof() || !at_read_eof()) && !stopped()) {
485     if (counter % 2 == 0)
486       base::RunLoop().RunUntilIdle();
487     if (counter % 2 == 1) {
488       InvokeCallbacks();
489     }
490     counter++;
491   }
492   // We're done consuming new data, but it is possible there are still some
493   // pending callbacks which we expect to complete before returning.
494   while (delegate_.get() &&
495          (delegate_->WritePending() || delegate_->ReadPending()) &&
496          !stopped()) {
497     InvokeCallbacks();
498     base::RunLoop().RunUntilIdle();
499   }
500   SetStopped(false);
501   is_running_ = false;
502 }
503 
RunFor(int steps)504 void DeterministicSocketData::RunFor(int steps) {
505   StopAfter(steps);
506   Run();
507 }
508 
SetStop(int seq)509 void DeterministicSocketData::SetStop(int seq) {
510   DCHECK_LT(sequence_number_, seq);
511   stopping_sequence_number_ = seq;
512   stopped_ = false;
513 }
514 
StopAfter(int seq)515 void DeterministicSocketData::StopAfter(int seq) {
516   SetStop(sequence_number_ + seq);
517 }
518 
GetNextRead()519 MockRead DeterministicSocketData::GetNextRead() {
520   current_read_ = StaticSocketDataProvider::PeekRead();
521 
522   // Synchronous read while stopped is an error
523   if (stopped() && current_read_.mode == SYNCHRONOUS) {
524     LOG(ERROR) << "Unable to perform synchronous IO while stopped";
525     return MockRead(SYNCHRONOUS, ERR_UNEXPECTED);
526   }
527 
528   // Async read which will be called back in a future step.
529   if (sequence_number_ < current_read_.sequence_number) {
530     NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
531                               << ": I/O Pending";
532     MockRead result = MockRead(SYNCHRONOUS, ERR_IO_PENDING);
533     if (current_read_.mode == SYNCHRONOUS) {
534       LOG(ERROR) << "Unable to perform synchronous read: "
535           << current_read_.sequence_number
536           << " at stage: " << sequence_number_;
537       result = MockRead(SYNCHRONOUS, ERR_UNEXPECTED);
538     }
539     if (print_debug_)
540       DumpMockReadWrite(result);
541     return result;
542   }
543 
544   NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
545                             << ": Read " << read_index();
546   if (print_debug_)
547     DumpMockReadWrite(current_read_);
548 
549   // Increment the sequence number if IO is complete
550   if (current_read_.mode == SYNCHRONOUS)
551     NextStep();
552 
553   DCHECK_NE(ERR_IO_PENDING, current_read_.result);
554   StaticSocketDataProvider::GetNextRead();
555 
556   return current_read_;
557 }
558 
OnWrite(const std::string & data)559 MockWriteResult DeterministicSocketData::OnWrite(const std::string& data) {
560   const MockWrite& next_write = StaticSocketDataProvider::PeekWrite();
561   current_write_ = next_write;
562 
563   // Synchronous write while stopped is an error
564   if (stopped() && next_write.mode == SYNCHRONOUS) {
565     LOG(ERROR) << "Unable to perform synchronous IO while stopped";
566     return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
567   }
568 
569   // Async write which will be called back in a future step.
570   if (sequence_number_ < next_write.sequence_number) {
571     NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
572                               << ": I/O Pending";
573     if (next_write.mode == SYNCHRONOUS) {
574       LOG(ERROR) << "Unable to perform synchronous write: "
575           << next_write.sequence_number << " at stage: " << sequence_number_;
576       return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
577     }
578   } else {
579     NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
580                               << ": Write " << write_index();
581   }
582 
583   if (print_debug_)
584     DumpMockReadWrite(next_write);
585 
586   // Move to the next step if I/O is synchronous, since the operation will
587   // complete when this method returns.
588   if (next_write.mode == SYNCHRONOUS)
589     NextStep();
590 
591   // This is either a sync write for this step, or an async write.
592   return StaticSocketDataProvider::OnWrite(data);
593 }
594 
Reset()595 void DeterministicSocketData::Reset() {
596   NET_TRACE(INFO, "  *** ") << "Stage "
597                             << sequence_number_ << ": Reset()";
598   sequence_number_ = 0;
599   StaticSocketDataProvider::Reset();
600   NOTREACHED();
601 }
602 
InvokeCallbacks()603 void DeterministicSocketData::InvokeCallbacks() {
604   if (delegate_.get() && delegate_->WritePending() &&
605       (current_write().sequence_number == sequence_number())) {
606     NextStep();
607     delegate_->CompleteWrite();
608     return;
609   }
610   if (delegate_.get() && delegate_->ReadPending() &&
611       (current_read().sequence_number == sequence_number())) {
612     NextStep();
613     delegate_->CompleteRead();
614     return;
615   }
616 }
617 
NextStep()618 void DeterministicSocketData::NextStep() {
619   // Invariant: Can never move *past* the stopping step.
620   DCHECK_LT(sequence_number_, stopping_sequence_number_);
621   sequence_number_++;
622   if (sequence_number_ == stopping_sequence_number_)
623     SetStopped(true);
624 }
625 
VerifyCorrectSequenceNumbers(MockRead * reads,size_t reads_count,MockWrite * writes,size_t writes_count)626 void DeterministicSocketData::VerifyCorrectSequenceNumbers(
627     MockRead* reads, size_t reads_count,
628     MockWrite* writes, size_t writes_count) {
629   size_t read = 0;
630   size_t write = 0;
631   int expected = 0;
632   while (read < reads_count || write < writes_count) {
633     // Check to see that we have a read or write at the expected
634     // state.
635     if (read < reads_count  && reads[read].sequence_number == expected) {
636       ++read;
637       ++expected;
638       continue;
639     }
640     if (write < writes_count && writes[write].sequence_number == expected) {
641       ++write;
642       ++expected;
643       continue;
644     }
645     NOTREACHED() << "Missing sequence number: " << expected;
646     return;
647   }
648   DCHECK_EQ(read, reads_count);
649   DCHECK_EQ(write, writes_count);
650 }
651 
MockClientSocketFactory()652 MockClientSocketFactory::MockClientSocketFactory() {}
653 
~MockClientSocketFactory()654 MockClientSocketFactory::~MockClientSocketFactory() {}
655 
AddSocketDataProvider(SocketDataProvider * data)656 void MockClientSocketFactory::AddSocketDataProvider(
657     SocketDataProvider* data) {
658   mock_data_.Add(data);
659 }
660 
AddSSLSocketDataProvider(SSLSocketDataProvider * data)661 void MockClientSocketFactory::AddSSLSocketDataProvider(
662     SSLSocketDataProvider* data) {
663   mock_ssl_data_.Add(data);
664 }
665 
ResetNextMockIndexes()666 void MockClientSocketFactory::ResetNextMockIndexes() {
667   mock_data_.ResetNextIndex();
668   mock_ssl_data_.ResetNextIndex();
669 }
670 
671 scoped_ptr<DatagramClientSocket>
CreateDatagramClientSocket(DatagramSocket::BindType bind_type,const RandIntCallback & rand_int_cb,net::NetLog * net_log,const net::NetLog::Source & source)672 MockClientSocketFactory::CreateDatagramClientSocket(
673     DatagramSocket::BindType bind_type,
674     const RandIntCallback& rand_int_cb,
675     net::NetLog* net_log,
676     const net::NetLog::Source& source) {
677   SocketDataProvider* data_provider = mock_data_.GetNext();
678   scoped_ptr<MockUDPClientSocket> socket(
679       new MockUDPClientSocket(data_provider, net_log));
680   data_provider->set_socket(socket.get());
681   if (bind_type == DatagramSocket::RANDOM_BIND)
682     socket->set_source_port(rand_int_cb.Run(1025, 65535));
683   return socket.PassAs<DatagramClientSocket>();
684 }
685 
CreateTransportClientSocket(const AddressList & addresses,net::NetLog * net_log,const net::NetLog::Source & source)686 scoped_ptr<StreamSocket> MockClientSocketFactory::CreateTransportClientSocket(
687     const AddressList& addresses,
688     net::NetLog* net_log,
689     const net::NetLog::Source& source) {
690   SocketDataProvider* data_provider = mock_data_.GetNext();
691   scoped_ptr<MockTCPClientSocket> socket(
692       new MockTCPClientSocket(addresses, net_log, data_provider));
693   data_provider->set_socket(socket.get());
694   return socket.PassAs<StreamSocket>();
695 }
696 
CreateSSLClientSocket(scoped_ptr<ClientSocketHandle> transport_socket,const HostPortPair & host_and_port,const SSLConfig & ssl_config,const SSLClientSocketContext & context)697 scoped_ptr<SSLClientSocket> MockClientSocketFactory::CreateSSLClientSocket(
698     scoped_ptr<ClientSocketHandle> transport_socket,
699     const HostPortPair& host_and_port,
700     const SSLConfig& ssl_config,
701     const SSLClientSocketContext& context) {
702   return scoped_ptr<SSLClientSocket>(
703       new MockSSLClientSocket(transport_socket.Pass(),
704                               host_and_port, ssl_config,
705                               mock_ssl_data_.GetNext()));
706 }
707 
ClearSSLSessionCache()708 void MockClientSocketFactory::ClearSSLSessionCache() {
709 }
710 
711 const char MockClientSocket::kTlsUnique[] = "MOCK_TLSUNIQ";
712 
MockClientSocket(const BoundNetLog & net_log)713 MockClientSocket::MockClientSocket(const BoundNetLog& net_log)
714     : connected_(false),
715       net_log_(net_log),
716       weak_factory_(this) {
717   IPAddressNumber ip;
718   CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
719   peer_addr_ = IPEndPoint(ip, 0);
720 }
721 
SetReceiveBufferSize(int32 size)722 int MockClientSocket::SetReceiveBufferSize(int32 size) {
723   return OK;
724 }
725 
SetSendBufferSize(int32 size)726 int MockClientSocket::SetSendBufferSize(int32 size) {
727   return OK;
728 }
729 
Disconnect()730 void MockClientSocket::Disconnect() {
731   connected_ = false;
732 }
733 
IsConnected() const734 bool MockClientSocket::IsConnected() const {
735   return connected_;
736 }
737 
IsConnectedAndIdle() const738 bool MockClientSocket::IsConnectedAndIdle() const {
739   return connected_;
740 }
741 
GetPeerAddress(IPEndPoint * address) const742 int MockClientSocket::GetPeerAddress(IPEndPoint* address) const {
743   if (!IsConnected())
744     return ERR_SOCKET_NOT_CONNECTED;
745   *address = peer_addr_;
746   return OK;
747 }
748 
GetLocalAddress(IPEndPoint * address) const749 int MockClientSocket::GetLocalAddress(IPEndPoint* address) const {
750   IPAddressNumber ip;
751   bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip);
752   CHECK(rv);
753   *address = IPEndPoint(ip, 123);
754   return OK;
755 }
756 
NetLog() const757 const BoundNetLog& MockClientSocket::NetLog() const {
758   return net_log_;
759 }
760 
GetSSLCertRequestInfo(SSLCertRequestInfo * cert_request_info)761 void MockClientSocket::GetSSLCertRequestInfo(
762   SSLCertRequestInfo* cert_request_info) {
763 }
764 
ExportKeyingMaterial(const base::StringPiece & label,bool has_context,const base::StringPiece & context,unsigned char * out,unsigned int outlen)765 int MockClientSocket::ExportKeyingMaterial(const base::StringPiece& label,
766                                            bool has_context,
767                                            const base::StringPiece& context,
768                                            unsigned char* out,
769                                            unsigned int outlen) {
770   memset(out, 'A', outlen);
771   return OK;
772 }
773 
GetTLSUniqueChannelBinding(std::string * out)774 int MockClientSocket::GetTLSUniqueChannelBinding(std::string* out) {
775   out->assign(MockClientSocket::kTlsUnique);
776   return OK;
777 }
778 
GetServerBoundCertService() const779 ServerBoundCertService* MockClientSocket::GetServerBoundCertService() const {
780   NOTREACHED();
781   return NULL;
782 }
783 
784 SSLClientSocket::NextProtoStatus
GetNextProto(std::string * proto,std::string * server_protos)785 MockClientSocket::GetNextProto(std::string* proto, std::string* server_protos) {
786   proto->clear();
787   server_protos->clear();
788   return SSLClientSocket::kNextProtoUnsupported;
789 }
790 
791 scoped_refptr<X509Certificate>
GetUnverifiedServerCertificateChain() const792 MockClientSocket::GetUnverifiedServerCertificateChain() const {
793   NOTREACHED();
794   return NULL;
795 }
796 
~MockClientSocket()797 MockClientSocket::~MockClientSocket() {}
798 
RunCallbackAsync(const CompletionCallback & callback,int result)799 void MockClientSocket::RunCallbackAsync(const CompletionCallback& callback,
800                                         int result) {
801   base::MessageLoop::current()->PostTask(
802       FROM_HERE,
803       base::Bind(&MockClientSocket::RunCallback,
804                  weak_factory_.GetWeakPtr(),
805                  callback,
806                  result));
807 }
808 
RunCallback(const net::CompletionCallback & callback,int result)809 void MockClientSocket::RunCallback(const net::CompletionCallback& callback,
810                                    int result) {
811   if (!callback.is_null())
812     callback.Run(result);
813 }
814 
MockTCPClientSocket(const AddressList & addresses,net::NetLog * net_log,SocketDataProvider * data)815 MockTCPClientSocket::MockTCPClientSocket(const AddressList& addresses,
816                                          net::NetLog* net_log,
817                                          SocketDataProvider* data)
818     : MockClientSocket(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)),
819       addresses_(addresses),
820       data_(data),
821       read_offset_(0),
822       read_data_(SYNCHRONOUS, ERR_UNEXPECTED),
823       need_read_data_(true),
824       peer_closed_connection_(false),
825       pending_buf_(NULL),
826       pending_buf_len_(0),
827       was_used_to_convey_data_(false) {
828   DCHECK(data_);
829   peer_addr_ = data->connect_data().peer_addr;
830   data_->Reset();
831 }
832 
~MockTCPClientSocket()833 MockTCPClientSocket::~MockTCPClientSocket() {}
834 
Read(IOBuffer * buf,int buf_len,const CompletionCallback & callback)835 int MockTCPClientSocket::Read(IOBuffer* buf, int buf_len,
836                               const CompletionCallback& callback) {
837   if (!connected_)
838     return ERR_UNEXPECTED;
839 
840   // If the buffer is already in use, a read is already in progress!
841   DCHECK(pending_buf_ == NULL);
842 
843   // Store our async IO data.
844   pending_buf_ = buf;
845   pending_buf_len_ = buf_len;
846   pending_callback_ = callback;
847 
848   if (need_read_data_) {
849     read_data_ = data_->GetNextRead();
850     if (read_data_.result == ERR_CONNECTION_CLOSED) {
851       // This MockRead is just a marker to instruct us to set
852       // peer_closed_connection_.
853       peer_closed_connection_ = true;
854     }
855     if (read_data_.result == ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ) {
856       // This MockRead is just a marker to instruct us to set
857       // peer_closed_connection_.  Skip it and get the next one.
858       read_data_ = data_->GetNextRead();
859       peer_closed_connection_ = true;
860     }
861     // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility
862     // to complete the async IO manually later (via OnReadComplete).
863     if (read_data_.result == ERR_IO_PENDING) {
864       // We need to be using async IO in this case.
865       DCHECK(!callback.is_null());
866       return ERR_IO_PENDING;
867     }
868     need_read_data_ = false;
869   }
870 
871   return CompleteRead();
872 }
873 
Write(IOBuffer * buf,int buf_len,const CompletionCallback & callback)874 int MockTCPClientSocket::Write(IOBuffer* buf, int buf_len,
875                                const CompletionCallback& callback) {
876   DCHECK(buf);
877   DCHECK_GT(buf_len, 0);
878 
879   if (!connected_)
880     return ERR_UNEXPECTED;
881 
882   std::string data(buf->data(), buf_len);
883   MockWriteResult write_result = data_->OnWrite(data);
884 
885   was_used_to_convey_data_ = true;
886 
887   if (write_result.mode == ASYNC) {
888     RunCallbackAsync(callback, write_result.result);
889     return ERR_IO_PENDING;
890   }
891 
892   return write_result.result;
893 }
894 
Connect(const CompletionCallback & callback)895 int MockTCPClientSocket::Connect(const CompletionCallback& callback) {
896   if (connected_)
897     return OK;
898   connected_ = true;
899   peer_closed_connection_ = false;
900   if (data_->connect_data().mode == ASYNC) {
901     if (data_->connect_data().result == ERR_IO_PENDING)
902       pending_callback_ = callback;
903     else
904       RunCallbackAsync(callback, data_->connect_data().result);
905     return ERR_IO_PENDING;
906   }
907   return data_->connect_data().result;
908 }
909 
Disconnect()910 void MockTCPClientSocket::Disconnect() {
911   MockClientSocket::Disconnect();
912   pending_callback_.Reset();
913 }
914 
IsConnected() const915 bool MockTCPClientSocket::IsConnected() const {
916   return connected_ && !peer_closed_connection_;
917 }
918 
IsConnectedAndIdle() const919 bool MockTCPClientSocket::IsConnectedAndIdle() const {
920   return IsConnected();
921 }
922 
GetPeerAddress(IPEndPoint * address) const923 int MockTCPClientSocket::GetPeerAddress(IPEndPoint* address) const {
924   if (addresses_.empty())
925     return MockClientSocket::GetPeerAddress(address);
926 
927   *address = addresses_[0];
928   return OK;
929 }
930 
WasEverUsed() const931 bool MockTCPClientSocket::WasEverUsed() const {
932   return was_used_to_convey_data_;
933 }
934 
UsingTCPFastOpen() const935 bool MockTCPClientSocket::UsingTCPFastOpen() const {
936   return false;
937 }
938 
WasNpnNegotiated() const939 bool MockTCPClientSocket::WasNpnNegotiated() const {
940   return false;
941 }
942 
GetSSLInfo(SSLInfo * ssl_info)943 bool MockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
944   return false;
945 }
946 
OnReadComplete(const MockRead & data)947 void MockTCPClientSocket::OnReadComplete(const MockRead& data) {
948   // There must be a read pending.
949   DCHECK(pending_buf_);
950   // You can't complete a read with another ERR_IO_PENDING status code.
951   DCHECK_NE(ERR_IO_PENDING, data.result);
952   // Since we've been waiting for data, need_read_data_ should be true.
953   DCHECK(need_read_data_);
954 
955   read_data_ = data;
956   need_read_data_ = false;
957 
958   // The caller is simulating that this IO completes right now.  Don't
959   // let CompleteRead() schedule a callback.
960   read_data_.mode = SYNCHRONOUS;
961 
962   CompletionCallback callback = pending_callback_;
963   int rv = CompleteRead();
964   RunCallback(callback, rv);
965 }
966 
OnConnectComplete(const MockConnect & data)967 void MockTCPClientSocket::OnConnectComplete(const MockConnect& data) {
968   CompletionCallback callback = pending_callback_;
969   RunCallback(callback, data.result);
970 }
971 
CompleteRead()972 int MockTCPClientSocket::CompleteRead() {
973   DCHECK(pending_buf_);
974   DCHECK(pending_buf_len_ > 0);
975 
976   was_used_to_convey_data_ = true;
977 
978   // Save the pending async IO data and reset our |pending_| state.
979   scoped_refptr<IOBuffer> buf = pending_buf_;
980   int buf_len = pending_buf_len_;
981   CompletionCallback callback = pending_callback_;
982   pending_buf_ = NULL;
983   pending_buf_len_ = 0;
984   pending_callback_.Reset();
985 
986   int result = read_data_.result;
987   DCHECK(result != ERR_IO_PENDING);
988 
989   if (read_data_.data) {
990     if (read_data_.data_len - read_offset_ > 0) {
991       result = std::min(buf_len, read_data_.data_len - read_offset_);
992       memcpy(buf->data(), read_data_.data + read_offset_, result);
993       read_offset_ += result;
994       if (read_offset_ == read_data_.data_len) {
995         need_read_data_ = true;
996         read_offset_ = 0;
997       }
998     } else {
999       result = 0;  // EOF
1000     }
1001   }
1002 
1003   if (read_data_.mode == ASYNC) {
1004     DCHECK(!callback.is_null());
1005     RunCallbackAsync(callback, result);
1006     return ERR_IO_PENDING;
1007   }
1008   return result;
1009 }
1010 
DeterministicSocketHelper(net::NetLog * net_log,DeterministicSocketData * data)1011 DeterministicSocketHelper::DeterministicSocketHelper(
1012     net::NetLog* net_log,
1013     DeterministicSocketData* data)
1014     : write_pending_(false),
1015       write_result_(0),
1016       read_data_(),
1017       read_buf_(NULL),
1018       read_buf_len_(0),
1019       read_pending_(false),
1020       data_(data),
1021       was_used_to_convey_data_(false),
1022       peer_closed_connection_(false),
1023       net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)) {
1024 }
1025 
~DeterministicSocketHelper()1026 DeterministicSocketHelper::~DeterministicSocketHelper() {}
1027 
CompleteWrite()1028 void DeterministicSocketHelper::CompleteWrite() {
1029   was_used_to_convey_data_ = true;
1030   write_pending_ = false;
1031   write_callback_.Run(write_result_);
1032 }
1033 
CompleteRead()1034 int DeterministicSocketHelper::CompleteRead() {
1035   DCHECK_GT(read_buf_len_, 0);
1036   DCHECK_LE(read_data_.data_len, read_buf_len_);
1037   DCHECK(read_buf_);
1038 
1039   was_used_to_convey_data_ = true;
1040 
1041   if (read_data_.result == ERR_IO_PENDING)
1042     read_data_ = data_->GetNextRead();
1043   DCHECK_NE(ERR_IO_PENDING, read_data_.result);
1044   // If read_data_.mode is ASYNC, we do not need to wait, since this is already
1045   // the callback. Therefore we don't even bother to check it.
1046   int result = read_data_.result;
1047 
1048   if (read_data_.data_len > 0) {
1049     DCHECK(read_data_.data);
1050     result = std::min(read_buf_len_, read_data_.data_len);
1051     memcpy(read_buf_->data(), read_data_.data, result);
1052   }
1053 
1054   if (read_pending_) {
1055     read_pending_ = false;
1056     read_callback_.Run(result);
1057   }
1058 
1059   return result;
1060 }
1061 
Write(IOBuffer * buf,int buf_len,const CompletionCallback & callback)1062 int DeterministicSocketHelper::Write(
1063     IOBuffer* buf, int buf_len, const CompletionCallback& callback) {
1064   DCHECK(buf);
1065   DCHECK_GT(buf_len, 0);
1066 
1067   std::string data(buf->data(), buf_len);
1068   MockWriteResult write_result = data_->OnWrite(data);
1069 
1070   if (write_result.mode == ASYNC) {
1071     write_callback_ = callback;
1072     write_result_ = write_result.result;
1073     DCHECK(!write_callback_.is_null());
1074     write_pending_ = true;
1075     return ERR_IO_PENDING;
1076   }
1077 
1078   was_used_to_convey_data_ = true;
1079   write_pending_ = false;
1080   return write_result.result;
1081 }
1082 
Read(IOBuffer * buf,int buf_len,const CompletionCallback & callback)1083 int DeterministicSocketHelper::Read(
1084     IOBuffer* buf, int buf_len, const CompletionCallback& callback) {
1085 
1086   read_data_ = data_->GetNextRead();
1087   // The buffer should always be big enough to contain all the MockRead data. To
1088   // use small buffers, split the data into multiple MockReads.
1089   DCHECK_LE(read_data_.data_len, buf_len);
1090 
1091   if (read_data_.result == ERR_CONNECTION_CLOSED) {
1092     // This MockRead is just a marker to instruct us to set
1093     // peer_closed_connection_.
1094     peer_closed_connection_ = true;
1095   }
1096   if (read_data_.result == ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ) {
1097     // This MockRead is just a marker to instruct us to set
1098     // peer_closed_connection_.  Skip it and get the next one.
1099     read_data_ = data_->GetNextRead();
1100     peer_closed_connection_ = true;
1101   }
1102 
1103   read_buf_ = buf;
1104   read_buf_len_ = buf_len;
1105   read_callback_ = callback;
1106 
1107   if (read_data_.mode == ASYNC || (read_data_.result == ERR_IO_PENDING)) {
1108     read_pending_ = true;
1109     DCHECK(!read_callback_.is_null());
1110     return ERR_IO_PENDING;
1111   }
1112 
1113   was_used_to_convey_data_ = true;
1114   return CompleteRead();
1115 }
1116 
DeterministicMockUDPClientSocket(net::NetLog * net_log,DeterministicSocketData * data)1117 DeterministicMockUDPClientSocket::DeterministicMockUDPClientSocket(
1118     net::NetLog* net_log,
1119     DeterministicSocketData* data)
1120     : connected_(false),
1121       helper_(net_log, data),
1122       source_port_(123) {
1123 }
1124 
~DeterministicMockUDPClientSocket()1125 DeterministicMockUDPClientSocket::~DeterministicMockUDPClientSocket() {}
1126 
WritePending() const1127 bool DeterministicMockUDPClientSocket::WritePending() const {
1128   return helper_.write_pending();
1129 }
1130 
ReadPending() const1131 bool DeterministicMockUDPClientSocket::ReadPending() const {
1132   return helper_.read_pending();
1133 }
1134 
CompleteWrite()1135 void DeterministicMockUDPClientSocket::CompleteWrite() {
1136   helper_.CompleteWrite();
1137 }
1138 
CompleteRead()1139 int DeterministicMockUDPClientSocket::CompleteRead() {
1140   return helper_.CompleteRead();
1141 }
1142 
Connect(const IPEndPoint & address)1143 int DeterministicMockUDPClientSocket::Connect(const IPEndPoint& address) {
1144   if (connected_)
1145     return OK;
1146   connected_ = true;
1147   peer_address_ = address;
1148   return helper_.data()->connect_data().result;
1149 };
1150 
Write(IOBuffer * buf,int buf_len,const CompletionCallback & callback)1151 int DeterministicMockUDPClientSocket::Write(
1152     IOBuffer* buf,
1153     int buf_len,
1154     const CompletionCallback& callback) {
1155   if (!connected_)
1156     return ERR_UNEXPECTED;
1157 
1158   return helper_.Write(buf, buf_len, callback);
1159 }
1160 
Read(IOBuffer * buf,int buf_len,const CompletionCallback & callback)1161 int DeterministicMockUDPClientSocket::Read(
1162     IOBuffer* buf,
1163     int buf_len,
1164     const CompletionCallback& callback) {
1165   if (!connected_)
1166     return ERR_UNEXPECTED;
1167 
1168   return helper_.Read(buf, buf_len, callback);
1169 }
1170 
SetReceiveBufferSize(int32 size)1171 int DeterministicMockUDPClientSocket::SetReceiveBufferSize(int32 size) {
1172   return OK;
1173 }
1174 
SetSendBufferSize(int32 size)1175 int DeterministicMockUDPClientSocket::SetSendBufferSize(int32 size) {
1176   return OK;
1177 }
1178 
Close()1179 void DeterministicMockUDPClientSocket::Close() {
1180   connected_ = false;
1181 }
1182 
GetPeerAddress(IPEndPoint * address) const1183 int DeterministicMockUDPClientSocket::GetPeerAddress(
1184     IPEndPoint* address) const {
1185   *address = peer_address_;
1186   return OK;
1187 }
1188 
GetLocalAddress(IPEndPoint * address) const1189 int DeterministicMockUDPClientSocket::GetLocalAddress(
1190     IPEndPoint* address) const {
1191   IPAddressNumber ip;
1192   bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip);
1193   CHECK(rv);
1194   *address = IPEndPoint(ip, source_port_);
1195   return OK;
1196 }
1197 
NetLog() const1198 const BoundNetLog& DeterministicMockUDPClientSocket::NetLog() const {
1199   return helper_.net_log();
1200 }
1201 
OnReadComplete(const MockRead & data)1202 void DeterministicMockUDPClientSocket::OnReadComplete(const MockRead& data) {}
1203 
OnConnectComplete(const MockConnect & data)1204 void DeterministicMockUDPClientSocket::OnConnectComplete(
1205     const MockConnect& data) {
1206   NOTIMPLEMENTED();
1207 }
1208 
DeterministicMockTCPClientSocket(net::NetLog * net_log,DeterministicSocketData * data)1209 DeterministicMockTCPClientSocket::DeterministicMockTCPClientSocket(
1210     net::NetLog* net_log,
1211     DeterministicSocketData* data)
1212     : MockClientSocket(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)),
1213       helper_(net_log, data) {
1214   peer_addr_ = data->connect_data().peer_addr;
1215 }
1216 
~DeterministicMockTCPClientSocket()1217 DeterministicMockTCPClientSocket::~DeterministicMockTCPClientSocket() {}
1218 
WritePending() const1219 bool DeterministicMockTCPClientSocket::WritePending() const {
1220   return helper_.write_pending();
1221 }
1222 
ReadPending() const1223 bool DeterministicMockTCPClientSocket::ReadPending() const {
1224   return helper_.read_pending();
1225 }
1226 
CompleteWrite()1227 void DeterministicMockTCPClientSocket::CompleteWrite() {
1228   helper_.CompleteWrite();
1229 }
1230 
CompleteRead()1231 int DeterministicMockTCPClientSocket::CompleteRead() {
1232   return helper_.CompleteRead();
1233 }
1234 
Write(IOBuffer * buf,int buf_len,const CompletionCallback & callback)1235 int DeterministicMockTCPClientSocket::Write(
1236     IOBuffer* buf,
1237     int buf_len,
1238     const CompletionCallback& callback) {
1239   if (!connected_)
1240     return ERR_UNEXPECTED;
1241 
1242   return helper_.Write(buf, buf_len, callback);
1243 }
1244 
Read(IOBuffer * buf,int buf_len,const CompletionCallback & callback)1245 int DeterministicMockTCPClientSocket::Read(
1246     IOBuffer* buf,
1247     int buf_len,
1248     const CompletionCallback& callback) {
1249   if (!connected_)
1250     return ERR_UNEXPECTED;
1251 
1252   return helper_.Read(buf, buf_len, callback);
1253 }
1254 
1255 // TODO(erikchen): Support connect sequencing.
Connect(const CompletionCallback & callback)1256 int DeterministicMockTCPClientSocket::Connect(
1257     const CompletionCallback& callback) {
1258   if (connected_)
1259     return OK;
1260   connected_ = true;
1261   if (helper_.data()->connect_data().mode == ASYNC) {
1262     RunCallbackAsync(callback, helper_.data()->connect_data().result);
1263     return ERR_IO_PENDING;
1264   }
1265   return helper_.data()->connect_data().result;
1266 }
1267 
Disconnect()1268 void DeterministicMockTCPClientSocket::Disconnect() {
1269   MockClientSocket::Disconnect();
1270 }
1271 
IsConnected() const1272 bool DeterministicMockTCPClientSocket::IsConnected() const {
1273   return connected_ && !helper_.peer_closed_connection();
1274 }
1275 
IsConnectedAndIdle() const1276 bool DeterministicMockTCPClientSocket::IsConnectedAndIdle() const {
1277   return IsConnected();
1278 }
1279 
WasEverUsed() const1280 bool DeterministicMockTCPClientSocket::WasEverUsed() const {
1281   return helper_.was_used_to_convey_data();
1282 }
1283 
UsingTCPFastOpen() const1284 bool DeterministicMockTCPClientSocket::UsingTCPFastOpen() const {
1285   return false;
1286 }
1287 
WasNpnNegotiated() const1288 bool DeterministicMockTCPClientSocket::WasNpnNegotiated() const {
1289   return false;
1290 }
1291 
GetSSLInfo(SSLInfo * ssl_info)1292 bool DeterministicMockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
1293   return false;
1294 }
1295 
OnReadComplete(const MockRead & data)1296 void DeterministicMockTCPClientSocket::OnReadComplete(const MockRead& data) {}
1297 
OnConnectComplete(const MockConnect & data)1298 void DeterministicMockTCPClientSocket::OnConnectComplete(
1299     const MockConnect& data) {}
1300 
1301 // static
ConnectCallback(MockSSLClientSocket * ssl_client_socket,const CompletionCallback & callback,int rv)1302 void MockSSLClientSocket::ConnectCallback(
1303     MockSSLClientSocket* ssl_client_socket,
1304     const CompletionCallback& callback,
1305     int rv) {
1306   if (rv == OK)
1307     ssl_client_socket->connected_ = true;
1308   callback.Run(rv);
1309 }
1310 
MockSSLClientSocket(scoped_ptr<ClientSocketHandle> transport_socket,const HostPortPair & host_port_pair,const SSLConfig & ssl_config,SSLSocketDataProvider * data)1311 MockSSLClientSocket::MockSSLClientSocket(
1312     scoped_ptr<ClientSocketHandle> transport_socket,
1313     const HostPortPair& host_port_pair,
1314     const SSLConfig& ssl_config,
1315     SSLSocketDataProvider* data)
1316     : MockClientSocket(
1317          // Have to use the right BoundNetLog for LoadTimingInfo regression
1318          // tests.
1319          transport_socket->socket()->NetLog()),
1320       transport_(transport_socket.Pass()),
1321       data_(data),
1322       is_npn_state_set_(false),
1323       new_npn_value_(false),
1324       is_protocol_negotiated_set_(false),
1325       protocol_negotiated_(kProtoUnknown) {
1326   DCHECK(data_);
1327   peer_addr_ = data->connect.peer_addr;
1328 }
1329 
~MockSSLClientSocket()1330 MockSSLClientSocket::~MockSSLClientSocket() {
1331   Disconnect();
1332 }
1333 
Read(IOBuffer * buf,int buf_len,const CompletionCallback & callback)1334 int MockSSLClientSocket::Read(IOBuffer* buf, int buf_len,
1335                               const CompletionCallback& callback) {
1336   return transport_->socket()->Read(buf, buf_len, callback);
1337 }
1338 
Write(IOBuffer * buf,int buf_len,const CompletionCallback & callback)1339 int MockSSLClientSocket::Write(IOBuffer* buf, int buf_len,
1340                                const CompletionCallback& callback) {
1341   return transport_->socket()->Write(buf, buf_len, callback);
1342 }
1343 
Connect(const CompletionCallback & callback)1344 int MockSSLClientSocket::Connect(const CompletionCallback& callback) {
1345   int rv = transport_->socket()->Connect(
1346       base::Bind(&ConnectCallback, base::Unretained(this), callback));
1347   if (rv == OK) {
1348     if (data_->connect.result == OK)
1349       connected_ = true;
1350     if (data_->connect.mode == ASYNC) {
1351       RunCallbackAsync(callback, data_->connect.result);
1352       return ERR_IO_PENDING;
1353     }
1354     return data_->connect.result;
1355   }
1356   return rv;
1357 }
1358 
Disconnect()1359 void MockSSLClientSocket::Disconnect() {
1360   MockClientSocket::Disconnect();
1361   if (transport_->socket() != NULL)
1362     transport_->socket()->Disconnect();
1363 }
1364 
IsConnected() const1365 bool MockSSLClientSocket::IsConnected() const {
1366   return transport_->socket()->IsConnected();
1367 }
1368 
WasEverUsed() const1369 bool MockSSLClientSocket::WasEverUsed() const {
1370   return transport_->socket()->WasEverUsed();
1371 }
1372 
UsingTCPFastOpen() const1373 bool MockSSLClientSocket::UsingTCPFastOpen() const {
1374   return transport_->socket()->UsingTCPFastOpen();
1375 }
1376 
GetPeerAddress(IPEndPoint * address) const1377 int MockSSLClientSocket::GetPeerAddress(IPEndPoint* address) const {
1378   return transport_->socket()->GetPeerAddress(address);
1379 }
1380 
GetSSLInfo(SSLInfo * ssl_info)1381 bool MockSSLClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
1382   ssl_info->Reset();
1383   ssl_info->cert = data_->cert;
1384   ssl_info->client_cert_sent = data_->client_cert_sent;
1385   ssl_info->channel_id_sent = data_->channel_id_sent;
1386   ssl_info->connection_status = data_->connection_status;
1387   return true;
1388 }
1389 
GetSSLCertRequestInfo(SSLCertRequestInfo * cert_request_info)1390 void MockSSLClientSocket::GetSSLCertRequestInfo(
1391     SSLCertRequestInfo* cert_request_info) {
1392   DCHECK(cert_request_info);
1393   if (data_->cert_request_info) {
1394     cert_request_info->host_and_port =
1395         data_->cert_request_info->host_and_port;
1396     cert_request_info->client_certs = data_->cert_request_info->client_certs;
1397   } else {
1398     cert_request_info->Reset();
1399   }
1400 }
1401 
GetNextProto(std::string * proto,std::string * server_protos)1402 SSLClientSocket::NextProtoStatus MockSSLClientSocket::GetNextProto(
1403     std::string* proto, std::string* server_protos) {
1404   *proto = data_->next_proto;
1405   *server_protos = data_->server_protos;
1406   return data_->next_proto_status;
1407 }
1408 
set_was_npn_negotiated(bool negotiated)1409 bool MockSSLClientSocket::set_was_npn_negotiated(bool negotiated) {
1410   is_npn_state_set_ = true;
1411   return new_npn_value_ = negotiated;
1412 }
1413 
WasNpnNegotiated() const1414 bool MockSSLClientSocket::WasNpnNegotiated() const {
1415   if (is_npn_state_set_)
1416     return new_npn_value_;
1417   return data_->was_npn_negotiated;
1418 }
1419 
GetNegotiatedProtocol() const1420 NextProto MockSSLClientSocket::GetNegotiatedProtocol() const {
1421   if (is_protocol_negotiated_set_)
1422     return protocol_negotiated_;
1423   return data_->protocol_negotiated;
1424 }
1425 
set_protocol_negotiated(NextProto protocol_negotiated)1426 void MockSSLClientSocket::set_protocol_negotiated(
1427     NextProto protocol_negotiated) {
1428   is_protocol_negotiated_set_ = true;
1429   protocol_negotiated_ = protocol_negotiated;
1430 }
1431 
WasChannelIDSent() const1432 bool MockSSLClientSocket::WasChannelIDSent() const {
1433   return data_->channel_id_sent;
1434 }
1435 
set_channel_id_sent(bool channel_id_sent)1436 void MockSSLClientSocket::set_channel_id_sent(bool channel_id_sent) {
1437   data_->channel_id_sent = channel_id_sent;
1438 }
1439 
GetServerBoundCertService() const1440 ServerBoundCertService* MockSSLClientSocket::GetServerBoundCertService() const {
1441   return data_->server_bound_cert_service;
1442 }
1443 
OnReadComplete(const MockRead & data)1444 void MockSSLClientSocket::OnReadComplete(const MockRead& data) {
1445   NOTIMPLEMENTED();
1446 }
1447 
OnConnectComplete(const MockConnect & data)1448 void MockSSLClientSocket::OnConnectComplete(const MockConnect& data) {
1449   NOTIMPLEMENTED();
1450 }
1451 
MockUDPClientSocket(SocketDataProvider * data,net::NetLog * net_log)1452 MockUDPClientSocket::MockUDPClientSocket(SocketDataProvider* data,
1453                                          net::NetLog* net_log)
1454     : connected_(false),
1455       data_(data),
1456       read_offset_(0),
1457       read_data_(SYNCHRONOUS, ERR_UNEXPECTED),
1458       need_read_data_(true),
1459       source_port_(123),
1460       pending_buf_(NULL),
1461       pending_buf_len_(0),
1462       net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)),
1463       weak_factory_(this) {
1464   DCHECK(data_);
1465   data_->Reset();
1466   peer_addr_ = data->connect_data().peer_addr;
1467 }
1468 
~MockUDPClientSocket()1469 MockUDPClientSocket::~MockUDPClientSocket() {}
1470 
Read(IOBuffer * buf,int buf_len,const CompletionCallback & callback)1471 int MockUDPClientSocket::Read(IOBuffer* buf,
1472                               int buf_len,
1473                               const CompletionCallback& callback) {
1474   if (!connected_)
1475     return ERR_UNEXPECTED;
1476 
1477   // If the buffer is already in use, a read is already in progress!
1478   DCHECK(pending_buf_ == NULL);
1479 
1480   // Store our async IO data.
1481   pending_buf_ = buf;
1482   pending_buf_len_ = buf_len;
1483   pending_callback_ = callback;
1484 
1485   if (need_read_data_) {
1486     read_data_ = data_->GetNextRead();
1487     // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility
1488     // to complete the async IO manually later (via OnReadComplete).
1489     if (read_data_.result == ERR_IO_PENDING) {
1490       // We need to be using async IO in this case.
1491       DCHECK(!callback.is_null());
1492       return ERR_IO_PENDING;
1493     }
1494     need_read_data_ = false;
1495   }
1496 
1497   return CompleteRead();
1498 }
1499 
Write(IOBuffer * buf,int buf_len,const CompletionCallback & callback)1500 int MockUDPClientSocket::Write(IOBuffer* buf, int buf_len,
1501                                const CompletionCallback& callback) {
1502   DCHECK(buf);
1503   DCHECK_GT(buf_len, 0);
1504 
1505   if (!connected_)
1506     return ERR_UNEXPECTED;
1507 
1508   std::string data(buf->data(), buf_len);
1509   MockWriteResult write_result = data_->OnWrite(data);
1510 
1511   if (write_result.mode == ASYNC) {
1512     RunCallbackAsync(callback, write_result.result);
1513     return ERR_IO_PENDING;
1514   }
1515   return write_result.result;
1516 }
1517 
SetReceiveBufferSize(int32 size)1518 int MockUDPClientSocket::SetReceiveBufferSize(int32 size) {
1519   return OK;
1520 }
1521 
SetSendBufferSize(int32 size)1522 int MockUDPClientSocket::SetSendBufferSize(int32 size) {
1523   return OK;
1524 }
1525 
Close()1526 void MockUDPClientSocket::Close() {
1527   connected_ = false;
1528 }
1529 
GetPeerAddress(IPEndPoint * address) const1530 int MockUDPClientSocket::GetPeerAddress(IPEndPoint* address) const {
1531   *address = peer_addr_;
1532   return OK;
1533 }
1534 
GetLocalAddress(IPEndPoint * address) const1535 int MockUDPClientSocket::GetLocalAddress(IPEndPoint* address) const {
1536   IPAddressNumber ip;
1537   bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip);
1538   CHECK(rv);
1539   *address = IPEndPoint(ip, source_port_);
1540   return OK;
1541 }
1542 
NetLog() const1543 const BoundNetLog& MockUDPClientSocket::NetLog() const {
1544   return net_log_;
1545 }
1546 
Connect(const IPEndPoint & address)1547 int MockUDPClientSocket::Connect(const IPEndPoint& address) {
1548   connected_ = true;
1549   peer_addr_ = address;
1550   return data_->connect_data().result;
1551 }
1552 
OnReadComplete(const MockRead & data)1553 void MockUDPClientSocket::OnReadComplete(const MockRead& data) {
1554   // There must be a read pending.
1555   DCHECK(pending_buf_);
1556   // You can't complete a read with another ERR_IO_PENDING status code.
1557   DCHECK_NE(ERR_IO_PENDING, data.result);
1558   // Since we've been waiting for data, need_read_data_ should be true.
1559   DCHECK(need_read_data_);
1560 
1561   read_data_ = data;
1562   need_read_data_ = false;
1563 
1564   // The caller is simulating that this IO completes right now.  Don't
1565   // let CompleteRead() schedule a callback.
1566   read_data_.mode = SYNCHRONOUS;
1567 
1568   net::CompletionCallback callback = pending_callback_;
1569   int rv = CompleteRead();
1570   RunCallback(callback, rv);
1571 }
1572 
OnConnectComplete(const MockConnect & data)1573 void MockUDPClientSocket::OnConnectComplete(const MockConnect& data) {
1574   NOTIMPLEMENTED();
1575 }
1576 
CompleteRead()1577 int MockUDPClientSocket::CompleteRead() {
1578   DCHECK(pending_buf_);
1579   DCHECK(pending_buf_len_ > 0);
1580 
1581   // Save the pending async IO data and reset our |pending_| state.
1582   scoped_refptr<IOBuffer> buf = pending_buf_;
1583   int buf_len = pending_buf_len_;
1584   CompletionCallback callback = pending_callback_;
1585   pending_buf_ = NULL;
1586   pending_buf_len_ = 0;
1587   pending_callback_.Reset();
1588 
1589   int result = read_data_.result;
1590   DCHECK(result != ERR_IO_PENDING);
1591 
1592   if (read_data_.data) {
1593     if (read_data_.data_len - read_offset_ > 0) {
1594       result = std::min(buf_len, read_data_.data_len - read_offset_);
1595       memcpy(buf->data(), read_data_.data + read_offset_, result);
1596       read_offset_ += result;
1597       if (read_offset_ == read_data_.data_len) {
1598         need_read_data_ = true;
1599         read_offset_ = 0;
1600       }
1601     } else {
1602       result = 0;  // EOF
1603     }
1604   }
1605 
1606   if (read_data_.mode == ASYNC) {
1607     DCHECK(!callback.is_null());
1608     RunCallbackAsync(callback, result);
1609     return ERR_IO_PENDING;
1610   }
1611   return result;
1612 }
1613 
RunCallbackAsync(const CompletionCallback & callback,int result)1614 void MockUDPClientSocket::RunCallbackAsync(const CompletionCallback& callback,
1615                                            int result) {
1616   base::MessageLoop::current()->PostTask(
1617       FROM_HERE,
1618       base::Bind(&MockUDPClientSocket::RunCallback,
1619                  weak_factory_.GetWeakPtr(),
1620                  callback,
1621                  result));
1622 }
1623 
RunCallback(const CompletionCallback & callback,int result)1624 void MockUDPClientSocket::RunCallback(const CompletionCallback& callback,
1625                                       int result) {
1626   if (!callback.is_null())
1627     callback.Run(result);
1628 }
1629 
TestSocketRequest(std::vector<TestSocketRequest * > * request_order,size_t * completion_count)1630 TestSocketRequest::TestSocketRequest(
1631     std::vector<TestSocketRequest*>* request_order, size_t* completion_count)
1632     : request_order_(request_order),
1633       completion_count_(completion_count),
1634       callback_(base::Bind(&TestSocketRequest::OnComplete,
1635                            base::Unretained(this))) {
1636   DCHECK(request_order);
1637   DCHECK(completion_count);
1638 }
1639 
~TestSocketRequest()1640 TestSocketRequest::~TestSocketRequest() {
1641 }
1642 
OnComplete(int result)1643 void TestSocketRequest::OnComplete(int result) {
1644   SetResult(result);
1645   (*completion_count_)++;
1646   request_order_->push_back(this);
1647 }
1648 
1649 // static
1650 const int ClientSocketPoolTest::kIndexOutOfBounds = -1;
1651 
1652 // static
1653 const int ClientSocketPoolTest::kRequestNotFound = -2;
1654 
ClientSocketPoolTest()1655 ClientSocketPoolTest::ClientSocketPoolTest() : completion_count_(0) {}
~ClientSocketPoolTest()1656 ClientSocketPoolTest::~ClientSocketPoolTest() {}
1657 
GetOrderOfRequest(size_t index) const1658 int ClientSocketPoolTest::GetOrderOfRequest(size_t index) const {
1659   index--;
1660   if (index >= requests_.size())
1661     return kIndexOutOfBounds;
1662 
1663   for (size_t i = 0; i < request_order_.size(); i++)
1664     if (requests_[index] == request_order_[i])
1665       return i + 1;
1666 
1667   return kRequestNotFound;
1668 }
1669 
ReleaseOneConnection(KeepAlive keep_alive)1670 bool ClientSocketPoolTest::ReleaseOneConnection(KeepAlive keep_alive) {
1671   ScopedVector<TestSocketRequest>::iterator i;
1672   for (i = requests_.begin(); i != requests_.end(); ++i) {
1673     if ((*i)->handle()->is_initialized()) {
1674       if (keep_alive == NO_KEEP_ALIVE)
1675         (*i)->handle()->socket()->Disconnect();
1676       (*i)->handle()->Reset();
1677       base::RunLoop().RunUntilIdle();
1678       return true;
1679     }
1680   }
1681   return false;
1682 }
1683 
ReleaseAllConnections(KeepAlive keep_alive)1684 void ClientSocketPoolTest::ReleaseAllConnections(KeepAlive keep_alive) {
1685   bool released_one;
1686   do {
1687     released_one = ReleaseOneConnection(keep_alive);
1688   } while (released_one);
1689 }
1690 
MockConnectJob(scoped_ptr<StreamSocket> socket,ClientSocketHandle * handle,const CompletionCallback & callback)1691 MockTransportClientSocketPool::MockConnectJob::MockConnectJob(
1692     scoped_ptr<StreamSocket> socket,
1693     ClientSocketHandle* handle,
1694     const CompletionCallback& callback)
1695     : socket_(socket.Pass()),
1696       handle_(handle),
1697       user_callback_(callback) {
1698 }
1699 
~MockConnectJob()1700 MockTransportClientSocketPool::MockConnectJob::~MockConnectJob() {}
1701 
Connect()1702 int MockTransportClientSocketPool::MockConnectJob::Connect() {
1703   int rv = socket_->Connect(base::Bind(&MockConnectJob::OnConnect,
1704                                        base::Unretained(this)));
1705   if (rv == OK) {
1706     user_callback_.Reset();
1707     OnConnect(OK);
1708   }
1709   return rv;
1710 }
1711 
CancelHandle(const ClientSocketHandle * handle)1712 bool MockTransportClientSocketPool::MockConnectJob::CancelHandle(
1713     const ClientSocketHandle* handle) {
1714   if (handle != handle_)
1715     return false;
1716   socket_.reset();
1717   handle_ = NULL;
1718   user_callback_.Reset();
1719   return true;
1720 }
1721 
OnConnect(int rv)1722 void MockTransportClientSocketPool::MockConnectJob::OnConnect(int rv) {
1723   if (!socket_.get())
1724     return;
1725   if (rv == OK) {
1726     handle_->SetSocket(socket_.Pass());
1727 
1728     // Needed for socket pool tests that layer other sockets on top of mock
1729     // sockets.
1730     LoadTimingInfo::ConnectTiming connect_timing;
1731     base::TimeTicks now = base::TimeTicks::Now();
1732     connect_timing.dns_start = now;
1733     connect_timing.dns_end = now;
1734     connect_timing.connect_start = now;
1735     connect_timing.connect_end = now;
1736     handle_->set_connect_timing(connect_timing);
1737   } else {
1738     socket_.reset();
1739   }
1740 
1741   handle_ = NULL;
1742 
1743   if (!user_callback_.is_null()) {
1744     CompletionCallback callback = user_callback_;
1745     user_callback_.Reset();
1746     callback.Run(rv);
1747   }
1748 }
1749 
MockTransportClientSocketPool(int max_sockets,int max_sockets_per_group,ClientSocketPoolHistograms * histograms,ClientSocketFactory * socket_factory)1750 MockTransportClientSocketPool::MockTransportClientSocketPool(
1751     int max_sockets,
1752     int max_sockets_per_group,
1753     ClientSocketPoolHistograms* histograms,
1754     ClientSocketFactory* socket_factory)
1755     : TransportClientSocketPool(max_sockets, max_sockets_per_group, histograms,
1756                                 NULL, NULL, NULL),
1757       client_socket_factory_(socket_factory),
1758       last_request_priority_(DEFAULT_PRIORITY),
1759       release_count_(0),
1760       cancel_count_(0) {
1761 }
1762 
~MockTransportClientSocketPool()1763 MockTransportClientSocketPool::~MockTransportClientSocketPool() {}
1764 
RequestSocket(const std::string & group_name,const void * socket_params,RequestPriority priority,ClientSocketHandle * handle,const CompletionCallback & callback,const BoundNetLog & net_log)1765 int MockTransportClientSocketPool::RequestSocket(
1766     const std::string& group_name, const void* socket_params,
1767     RequestPriority priority, ClientSocketHandle* handle,
1768     const CompletionCallback& callback, const BoundNetLog& net_log) {
1769   last_request_priority_ = priority;
1770   scoped_ptr<StreamSocket> socket =
1771       client_socket_factory_->CreateTransportClientSocket(
1772           AddressList(), net_log.net_log(), net::NetLog::Source());
1773   MockConnectJob* job = new MockConnectJob(socket.Pass(), handle, callback);
1774   job_list_.push_back(job);
1775   handle->set_pool_id(1);
1776   return job->Connect();
1777 }
1778 
CancelRequest(const std::string & group_name,ClientSocketHandle * handle)1779 void MockTransportClientSocketPool::CancelRequest(const std::string& group_name,
1780                                                   ClientSocketHandle* handle) {
1781   std::vector<MockConnectJob*>::iterator i;
1782   for (i = job_list_.begin(); i != job_list_.end(); ++i) {
1783     if ((*i)->CancelHandle(handle)) {
1784       cancel_count_++;
1785       break;
1786     }
1787   }
1788 }
1789 
ReleaseSocket(const std::string & group_name,scoped_ptr<StreamSocket> socket,int id)1790 void MockTransportClientSocketPool::ReleaseSocket(
1791     const std::string& group_name,
1792     scoped_ptr<StreamSocket> socket,
1793     int id) {
1794   EXPECT_EQ(1, id);
1795   release_count_++;
1796 }
1797 
DeterministicMockClientSocketFactory()1798 DeterministicMockClientSocketFactory::DeterministicMockClientSocketFactory() {}
1799 
~DeterministicMockClientSocketFactory()1800 DeterministicMockClientSocketFactory::~DeterministicMockClientSocketFactory() {}
1801 
AddSocketDataProvider(DeterministicSocketData * data)1802 void DeterministicMockClientSocketFactory::AddSocketDataProvider(
1803     DeterministicSocketData* data) {
1804   mock_data_.Add(data);
1805 }
1806 
AddSSLSocketDataProvider(SSLSocketDataProvider * data)1807 void DeterministicMockClientSocketFactory::AddSSLSocketDataProvider(
1808     SSLSocketDataProvider* data) {
1809   mock_ssl_data_.Add(data);
1810 }
1811 
ResetNextMockIndexes()1812 void DeterministicMockClientSocketFactory::ResetNextMockIndexes() {
1813   mock_data_.ResetNextIndex();
1814   mock_ssl_data_.ResetNextIndex();
1815 }
1816 
1817 MockSSLClientSocket* DeterministicMockClientSocketFactory::
GetMockSSLClientSocket(size_t index) const1818     GetMockSSLClientSocket(size_t index) const {
1819   DCHECK_LT(index, ssl_client_sockets_.size());
1820   return ssl_client_sockets_[index];
1821 }
1822 
1823 scoped_ptr<DatagramClientSocket>
CreateDatagramClientSocket(DatagramSocket::BindType bind_type,const RandIntCallback & rand_int_cb,net::NetLog * net_log,const NetLog::Source & source)1824 DeterministicMockClientSocketFactory::CreateDatagramClientSocket(
1825     DatagramSocket::BindType bind_type,
1826     const RandIntCallback& rand_int_cb,
1827     net::NetLog* net_log,
1828     const NetLog::Source& source) {
1829   DeterministicSocketData* data_provider = mock_data().GetNext();
1830   scoped_ptr<DeterministicMockUDPClientSocket> socket(
1831       new DeterministicMockUDPClientSocket(net_log, data_provider));
1832   data_provider->set_delegate(socket->AsWeakPtr());
1833   udp_client_sockets().push_back(socket.get());
1834   if (bind_type == DatagramSocket::RANDOM_BIND)
1835     socket->set_source_port(rand_int_cb.Run(1025, 65535));
1836   return socket.PassAs<DatagramClientSocket>();
1837 }
1838 
1839 scoped_ptr<StreamSocket>
CreateTransportClientSocket(const AddressList & addresses,net::NetLog * net_log,const net::NetLog::Source & source)1840 DeterministicMockClientSocketFactory::CreateTransportClientSocket(
1841     const AddressList& addresses,
1842     net::NetLog* net_log,
1843     const net::NetLog::Source& source) {
1844   DeterministicSocketData* data_provider = mock_data().GetNext();
1845   scoped_ptr<DeterministicMockTCPClientSocket> socket(
1846       new DeterministicMockTCPClientSocket(net_log, data_provider));
1847   data_provider->set_delegate(socket->AsWeakPtr());
1848   tcp_client_sockets().push_back(socket.get());
1849   return socket.PassAs<StreamSocket>();
1850 }
1851 
1852 scoped_ptr<SSLClientSocket>
CreateSSLClientSocket(scoped_ptr<ClientSocketHandle> transport_socket,const HostPortPair & host_and_port,const SSLConfig & ssl_config,const SSLClientSocketContext & context)1853 DeterministicMockClientSocketFactory::CreateSSLClientSocket(
1854     scoped_ptr<ClientSocketHandle> transport_socket,
1855     const HostPortPair& host_and_port,
1856     const SSLConfig& ssl_config,
1857     const SSLClientSocketContext& context) {
1858   scoped_ptr<MockSSLClientSocket> socket(
1859       new MockSSLClientSocket(transport_socket.Pass(),
1860                               host_and_port, ssl_config,
1861                               mock_ssl_data_.GetNext()));
1862   ssl_client_sockets_.push_back(socket.get());
1863   return socket.PassAs<SSLClientSocket>();
1864 }
1865 
ClearSSLSessionCache()1866 void DeterministicMockClientSocketFactory::ClearSSLSessionCache() {
1867 }
1868 
MockSOCKSClientSocketPool(int max_sockets,int max_sockets_per_group,ClientSocketPoolHistograms * histograms,TransportClientSocketPool * transport_pool)1869 MockSOCKSClientSocketPool::MockSOCKSClientSocketPool(
1870     int max_sockets,
1871     int max_sockets_per_group,
1872     ClientSocketPoolHistograms* histograms,
1873     TransportClientSocketPool* transport_pool)
1874     : SOCKSClientSocketPool(max_sockets, max_sockets_per_group, histograms,
1875                             NULL, transport_pool, NULL),
1876       transport_pool_(transport_pool) {
1877 }
1878 
~MockSOCKSClientSocketPool()1879 MockSOCKSClientSocketPool::~MockSOCKSClientSocketPool() {}
1880 
RequestSocket(const std::string & group_name,const void * socket_params,RequestPriority priority,ClientSocketHandle * handle,const CompletionCallback & callback,const BoundNetLog & net_log)1881 int MockSOCKSClientSocketPool::RequestSocket(
1882     const std::string& group_name, const void* socket_params,
1883     RequestPriority priority, ClientSocketHandle* handle,
1884     const CompletionCallback& callback, const BoundNetLog& net_log) {
1885   return transport_pool_->RequestSocket(
1886       group_name, socket_params, priority, handle, callback, net_log);
1887 }
1888 
CancelRequest(const std::string & group_name,ClientSocketHandle * handle)1889 void MockSOCKSClientSocketPool::CancelRequest(
1890     const std::string& group_name,
1891     ClientSocketHandle* handle) {
1892   return transport_pool_->CancelRequest(group_name, handle);
1893 }
1894 
ReleaseSocket(const std::string & group_name,scoped_ptr<StreamSocket> socket,int id)1895 void MockSOCKSClientSocketPool::ReleaseSocket(const std::string& group_name,
1896                                               scoped_ptr<StreamSocket> socket,
1897                                               int id) {
1898   return transport_pool_->ReleaseSocket(group_name, socket.Pass(), id);
1899 }
1900 
1901 const char kSOCKS5GreetRequest[] = { 0x05, 0x01, 0x00 };
1902 const int kSOCKS5GreetRequestLength = arraysize(kSOCKS5GreetRequest);
1903 
1904 const char kSOCKS5GreetResponse[] = { 0x05, 0x00 };
1905 const int kSOCKS5GreetResponseLength = arraysize(kSOCKS5GreetResponse);
1906 
1907 const char kSOCKS5OkRequest[] =
1908     { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 };
1909 const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest);
1910 
1911 const char kSOCKS5OkResponse[] =
1912     { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 };
1913 const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse);
1914 
1915 }  // namespace net
1916