Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / net / socket / socket_test_util.h
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 #ifndef NET_SOCKET_SOCKET_TEST_UTIL_H_
6 #define NET_SOCKET_SOCKET_TEST_UTIL_H_
7
8 #include <cstring>
9 #include <deque>
10 #include <string>
11 #include <vector>
12
13 #include "base/basictypes.h"
14 #include "base/callback.h"
15 #include "base/logging.h"
16 #include "base/memory/ref_counted.h"
17 #include "base/memory/scoped_ptr.h"
18 #include "base/memory/scoped_vector.h"
19 #include "base/memory/weak_ptr.h"
20 #include "base/strings/string16.h"
21 #include "net/base/address_list.h"
22 #include "net/base/io_buffer.h"
23 #include "net/base/net_errors.h"
24 #include "net/base/net_log.h"
25 #include "net/base/test_completion_callback.h"
26 #include "net/http/http_auth_controller.h"
27 #include "net/http/http_proxy_client_socket_pool.h"
28 #include "net/socket/client_socket_factory.h"
29 #include "net/socket/client_socket_handle.h"
30 #include "net/socket/socks_client_socket_pool.h"
31 #include "net/socket/ssl_client_socket.h"
32 #include "net/socket/ssl_client_socket_pool.h"
33 #include "net/socket/transport_client_socket_pool.h"
34 #include "net/ssl/ssl_config_service.h"
35 #include "net/udp/datagram_client_socket.h"
36 #include "testing/gtest/include/gtest/gtest.h"
37
38 namespace net {
39
40 enum {
41   // A private network error code used by the socket test utility classes.
42   // If the |result| member of a MockRead is
43   // ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ, that MockRead is just a
44   // marker that indicates the peer will close the connection after the next
45   // MockRead.  The other members of that MockRead are ignored.
46   ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ = -10000,
47 };
48
49 class AsyncSocket;
50 class MockClientSocket;
51 class ServerBoundCertService;
52 class SSLClientSocket;
53 class StreamSocket;
54
55 enum IoMode {
56   ASYNC,
57   SYNCHRONOUS
58 };
59
60 struct MockConnect {
61   // Asynchronous connection success.
62   // Creates a MockConnect with |mode| ASYC, |result| OK, and
63   // |peer_addr| 192.0.2.33.
64   MockConnect();
65   // Creates a MockConnect with the specified mode and result, with
66   // |peer_addr| 192.0.2.33.
67   MockConnect(IoMode io_mode, int r);
68   MockConnect(IoMode io_mode, int r, IPEndPoint addr);
69   ~MockConnect();
70
71   IoMode mode;
72   int result;
73   IPEndPoint peer_addr;
74 };
75
76 // MockRead and MockWrite shares the same interface and members, but we'd like
77 // to have distinct types because we don't want to have them used
78 // interchangably. To do this, a struct template is defined, and MockRead and
79 // MockWrite are instantiated by using this template. Template parameter |type|
80 // is not used in the struct definition (it purely exists for creating a new
81 // type).
82 //
83 // |data| in MockRead and MockWrite has different meanings: |data| in MockRead
84 // is the data returned from the socket when MockTCPClientSocket::Read() is
85 // attempted, while |data| in MockWrite is the expected data that should be
86 // given in MockTCPClientSocket::Write().
87 enum MockReadWriteType {
88   MOCK_READ,
89   MOCK_WRITE
90 };
91
92 template <MockReadWriteType type>
93 struct MockReadWrite {
94   // Flag to indicate that the message loop should be terminated.
95   enum {
96     STOPLOOP = 1 << 31
97   };
98
99   // Default
100   MockReadWrite()
101       : mode(SYNCHRONOUS),
102         result(0),
103         data(NULL),
104         data_len(0),
105         sequence_number(0),
106         time_stamp(base::Time::Now()) {}
107
108   // Read/write failure (no data).
109   MockReadWrite(IoMode io_mode, int result)
110       : mode(io_mode),
111         result(result),
112         data(NULL),
113         data_len(0),
114         sequence_number(0),
115         time_stamp(base::Time::Now()) {}
116
117   // Read/write failure (no data), with sequence information.
118   MockReadWrite(IoMode io_mode, int result, int seq)
119       : mode(io_mode),
120         result(result),
121         data(NULL),
122         data_len(0),
123         sequence_number(seq),
124         time_stamp(base::Time::Now()) {}
125
126   // Asynchronous read/write success (inferred data length).
127   explicit MockReadWrite(const char* data)
128       : mode(ASYNC),
129         result(0),
130         data(data),
131         data_len(strlen(data)),
132         sequence_number(0),
133         time_stamp(base::Time::Now()) {}
134
135   // Read/write success (inferred data length).
136   MockReadWrite(IoMode io_mode, const char* data)
137       : mode(io_mode),
138         result(0),
139         data(data),
140         data_len(strlen(data)),
141         sequence_number(0),
142         time_stamp(base::Time::Now()) {}
143
144   // Read/write success.
145   MockReadWrite(IoMode io_mode, const char* data, int data_len)
146       : mode(io_mode),
147         result(0),
148         data(data),
149         data_len(data_len),
150         sequence_number(0),
151         time_stamp(base::Time::Now()) {}
152
153   // Read/write success (inferred data length) with sequence information.
154   MockReadWrite(IoMode io_mode, int seq, const char* data)
155       : mode(io_mode),
156         result(0),
157         data(data),
158         data_len(strlen(data)),
159         sequence_number(seq),
160         time_stamp(base::Time::Now()) {}
161
162   // Read/write success with sequence information.
163   MockReadWrite(IoMode io_mode, const char* data, int data_len, int seq)
164       : mode(io_mode),
165         result(0),
166         data(data),
167         data_len(data_len),
168         sequence_number(seq),
169         time_stamp(base::Time::Now()) {}
170
171   IoMode mode;
172   int result;
173   const char* data;
174   int data_len;
175
176   // For OrderedSocketData, which only allows reads to occur in a particular
177   // sequence.  If a read occurs before the given |sequence_number| is reached,
178   // an ERR_IO_PENDING is returned.
179   int sequence_number;    // The sequence number at which a read is allowed
180                           // to occur.
181   base::Time time_stamp;  // The time stamp at which the operation occurred.
182 };
183
184 typedef MockReadWrite<MOCK_READ> MockRead;
185 typedef MockReadWrite<MOCK_WRITE> MockWrite;
186
187 struct MockWriteResult {
188   MockWriteResult(IoMode io_mode, int result) : mode(io_mode), result(result) {}
189
190   IoMode mode;
191   int result;
192 };
193
194 // The SocketDataProvider is an interface used by the MockClientSocket
195 // for getting data about individual reads and writes on the socket.
196 class SocketDataProvider {
197  public:
198   SocketDataProvider() : socket_(NULL) {}
199
200   virtual ~SocketDataProvider() {}
201
202   // Returns the buffer and result code for the next simulated read.
203   // If the |MockRead.result| is ERR_IO_PENDING, it informs the caller
204   // that it will be called via the AsyncSocket::OnReadComplete()
205   // function at a later time.
206   virtual MockRead GetNextRead() = 0;
207   virtual MockWriteResult OnWrite(const std::string& data) = 0;
208   virtual void Reset() = 0;
209
210   // Accessor for the socket which is using the SocketDataProvider.
211   AsyncSocket* socket() { return socket_; }
212   void set_socket(AsyncSocket* socket) { socket_ = socket; }
213
214   MockConnect connect_data() const { return connect_; }
215   void set_connect_data(const MockConnect& connect) { connect_ = connect; }
216
217  private:
218   MockConnect connect_;
219   AsyncSocket* socket_;
220
221   DISALLOW_COPY_AND_ASSIGN(SocketDataProvider);
222 };
223
224 // The AsyncSocket is an interface used by the SocketDataProvider to
225 // complete the asynchronous read operation.
226 class AsyncSocket {
227  public:
228   // If an async IO is pending because the SocketDataProvider returned
229   // ERR_IO_PENDING, then the AsyncSocket waits until this OnReadComplete
230   // is called to complete the asynchronous read operation.
231   // data.async is ignored, and this read is completed synchronously as
232   // part of this call.
233   virtual void OnReadComplete(const MockRead& data) = 0;
234   virtual void OnConnectComplete(const MockConnect& data) = 0;
235 };
236
237 // SocketDataProvider which responds based on static tables of mock reads and
238 // writes.
239 class StaticSocketDataProvider : public SocketDataProvider {
240  public:
241   StaticSocketDataProvider();
242   StaticSocketDataProvider(MockRead* reads,
243                            size_t reads_count,
244                            MockWrite* writes,
245                            size_t writes_count);
246   virtual ~StaticSocketDataProvider();
247
248   // These functions get access to the next available read and write data.
249   const MockRead& PeekRead() const;
250   const MockWrite& PeekWrite() const;
251   // These functions get random access to the read and write data, for timing.
252   const MockRead& PeekRead(size_t index) const;
253   const MockWrite& PeekWrite(size_t index) const;
254   size_t read_index() const { return read_index_; }
255   size_t write_index() const { return write_index_; }
256   size_t read_count() const { return read_count_; }
257   size_t write_count() const { return write_count_; }
258
259   bool at_read_eof() const { return read_index_ >= read_count_; }
260   bool at_write_eof() const { return write_index_ >= write_count_; }
261
262   virtual void CompleteRead() {}
263
264   // SocketDataProvider implementation.
265   virtual MockRead GetNextRead() OVERRIDE;
266   virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE;
267   virtual void Reset() OVERRIDE;
268
269  private:
270   MockRead* reads_;
271   size_t read_index_;
272   size_t read_count_;
273   MockWrite* writes_;
274   size_t write_index_;
275   size_t write_count_;
276
277   DISALLOW_COPY_AND_ASSIGN(StaticSocketDataProvider);
278 };
279
280 // SocketDataProvider which can make decisions about next mock reads based on
281 // received writes. It can also be used to enforce order of operations, for
282 // example that tested code must send the "Hello!" message before receiving
283 // response. This is useful for testing conversation-like protocols like FTP.
284 class DynamicSocketDataProvider : public SocketDataProvider {
285  public:
286   DynamicSocketDataProvider();
287   virtual ~DynamicSocketDataProvider();
288
289   int short_read_limit() const { return short_read_limit_; }
290   void set_short_read_limit(int limit) { short_read_limit_ = limit; }
291
292   void allow_unconsumed_reads(bool allow) { allow_unconsumed_reads_ = allow; }
293
294   // SocketDataProvider implementation.
295   virtual MockRead GetNextRead() OVERRIDE;
296   virtual MockWriteResult OnWrite(const std::string& data) = 0;
297   virtual void Reset() OVERRIDE;
298
299  protected:
300   // The next time there is a read from this socket, it will return |data|.
301   // Before calling SimulateRead next time, the previous data must be consumed.
302   void SimulateRead(const char* data, size_t length);
303   void SimulateRead(const char* data) { SimulateRead(data, std::strlen(data)); }
304
305  private:
306   std::deque<MockRead> reads_;
307
308   // Max number of bytes we will read at a time. 0 means no limit.
309   int short_read_limit_;
310
311   // If true, we'll not require the client to consume all data before we
312   // mock the next read.
313   bool allow_unconsumed_reads_;
314
315   DISALLOW_COPY_AND_ASSIGN(DynamicSocketDataProvider);
316 };
317
318 // SSLSocketDataProviders only need to keep track of the return code from calls
319 // to Connect().
320 struct SSLSocketDataProvider {
321   SSLSocketDataProvider(IoMode mode, int result);
322   ~SSLSocketDataProvider();
323
324   void SetNextProto(NextProto proto);
325
326   MockConnect connect;
327   SSLClientSocket::NextProtoStatus next_proto_status;
328   std::string next_proto;
329   std::string server_protos;
330   bool was_npn_negotiated;
331   NextProto protocol_negotiated;
332   bool client_cert_sent;
333   SSLCertRequestInfo* cert_request_info;
334   scoped_refptr<X509Certificate> cert;
335   bool channel_id_sent;
336   ServerBoundCertService* server_bound_cert_service;
337 };
338
339 // A DataProvider where the client must write a request before the reads (e.g.
340 // the response) will complete.
341 class DelayedSocketData : public StaticSocketDataProvider {
342  public:
343   // |write_delay| the number of MockWrites to complete before allowing
344   //               a MockRead to complete.
345   // |reads| the list of MockRead completions.
346   // |writes| the list of MockWrite completions.
347   // Note: For stream sockets, the MockRead list must end with a EOF, e.g., a
348   //       MockRead(true, 0, 0);
349   DelayedSocketData(int write_delay,
350                     MockRead* reads,
351                     size_t reads_count,
352                     MockWrite* writes,
353                     size_t writes_count);
354
355   // |connect| the result for the connect phase.
356   // |reads| the list of MockRead completions.
357   // |write_delay| the number of MockWrites to complete before allowing
358   //               a MockRead to complete.
359   // |writes| the list of MockWrite completions.
360   // Note: For stream sockets, the MockRead list must end with a EOF, e.g., a
361   //       MockRead(true, 0, 0);
362   DelayedSocketData(const MockConnect& connect,
363                     int write_delay,
364                     MockRead* reads,
365                     size_t reads_count,
366                     MockWrite* writes,
367                     size_t writes_count);
368   virtual ~DelayedSocketData();
369
370   void ForceNextRead();
371
372   // StaticSocketDataProvider:
373   virtual MockRead GetNextRead() OVERRIDE;
374   virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE;
375   virtual void Reset() OVERRIDE;
376   virtual void CompleteRead() OVERRIDE;
377
378  private:
379   int write_delay_;
380   bool read_in_progress_;
381
382   base::WeakPtrFactory<DelayedSocketData> weak_factory_;
383
384   DISALLOW_COPY_AND_ASSIGN(DelayedSocketData);
385 };
386
387 // A DataProvider where the reads are ordered.
388 // If a read is requested before its sequence number is reached, we return an
389 // ERR_IO_PENDING (that way we don't have to explicitly add a MockRead just to
390 // wait).
391 // The sequence number is incremented on every read and write operation.
392 // The message loop may be interrupted by setting the high bit of the sequence
393 // number in the MockRead's sequence number.  When that MockRead is reached,
394 // we post a Quit message to the loop.  This allows us to interrupt the reading
395 // of data before a complete message has arrived, and provides support for
396 // testing server push when the request is issued while the response is in the
397 // middle of being received.
398 class OrderedSocketData : public StaticSocketDataProvider {
399  public:
400   // |reads| the list of MockRead completions.
401   // |writes| the list of MockWrite completions.
402   // Note: All MockReads and MockWrites must be async.
403   // Note: For stream sockets, the MockRead list must end with a EOF, e.g., a
404   //       MockRead(true, 0, 0);
405   OrderedSocketData(MockRead* reads,
406                     size_t reads_count,
407                     MockWrite* writes,
408                     size_t writes_count);
409   virtual ~OrderedSocketData();
410
411   // |connect| the result for the connect phase.
412   // |reads| the list of MockRead completions.
413   // |writes| the list of MockWrite completions.
414   // Note: All MockReads and MockWrites must be async.
415   // Note: For stream sockets, the MockRead list must end with a EOF, e.g., a
416   //       MockRead(true, 0, 0);
417   OrderedSocketData(const MockConnect& connect,
418                     MockRead* reads,
419                     size_t reads_count,
420                     MockWrite* writes,
421                     size_t writes_count);
422
423   // Posts a quit message to the current message loop, if one is running.
424   void EndLoop();
425
426   // StaticSocketDataProvider:
427   virtual MockRead GetNextRead() OVERRIDE;
428   virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE;
429   virtual void Reset() OVERRIDE;
430   virtual void CompleteRead() OVERRIDE;
431
432  private:
433   int sequence_number_;
434   int loop_stop_stage_;
435   bool blocked_;
436
437   base::WeakPtrFactory<OrderedSocketData> weak_factory_;
438
439   DISALLOW_COPY_AND_ASSIGN(OrderedSocketData);
440 };
441
442 class DeterministicMockTCPClientSocket;
443
444 // This class gives the user full control over the network activity,
445 // specifically the timing of the COMPLETION of I/O operations.  Regardless of
446 // the order in which I/O operations are initiated, this class ensures that they
447 // complete in the correct order.
448 //
449 // Network activity is modeled as a sequence of numbered steps which is
450 // incremented whenever an I/O operation completes.  This can happen under two
451 // different circumstances:
452 //
453 // 1) Performing a synchronous I/O operation.  (Invoking Read() or Write()
454 //    when the corresponding MockRead or MockWrite is marked !async).
455 // 2) Running the Run() method of this class.  The run method will invoke
456 //    the current MessageLoop, running all pending events, and will then
457 //    invoke any pending IO callbacks.
458 //
459 // In addition, this class allows for I/O processing to "stop" at a specified
460 // step, by calling SetStop(int) or StopAfter(int).  Initiating an I/O operation
461 // by calling Read() or Write() while stopped is permitted if the operation is
462 // asynchronous.  It is an error to perform synchronous I/O while stopped.
463 //
464 // When creating the MockReads and MockWrites, note that the sequence number
465 // refers to the number of the step in which the I/O will complete.  In the
466 // case of synchronous I/O, this will be the same step as the I/O is initiated.
467 // However, in the case of asynchronous I/O, this I/O may be initiated in
468 // a much earlier step. Furthermore, when the a Read() or Write() is separated
469 // from its completion by other Read() or Writes()'s, it can not be marked
470 // synchronous.  If it is, ERR_UNUEXPECTED will be returned indicating that a
471 // synchronous Read() or Write() could not be completed synchronously because of
472 // the specific ordering constraints.
473 //
474 // Sequence numbers are preserved across both reads and writes. There should be
475 // no gaps in sequence numbers, and no repeated sequence numbers. i.e.
476 //  MockRead reads[] = {
477 //    MockRead(false, "first read", length, 0)   // sync
478 //    MockRead(true, "second read", length, 2)   // async
479 //  };
480 //  MockWrite writes[] = {
481 //    MockWrite(true, "first write", length, 1),    // async
482 //    MockWrite(false, "second write", length, 3),  // sync
483 //  };
484 //
485 // Example control flow:
486 // Read() is called.  The current step is 0.  The first available read is
487 // synchronous, so the call to Read() returns length.  The current step is
488 // now 1.  Next, Read() is called again.  The next available read can
489 // not be completed until step 2, so Read() returns ERR_IO_PENDING.  The current
490 // step is still 1.  Write is called().  The first available write is able to
491 // complete in this step, but is marked asynchronous.  Write() returns
492 // ERR_IO_PENDING.  The current step is still 1.  At this point RunFor(1) is
493 // called which will cause the write callback to be invoked, and will then
494 // stop.  The current state is now 2.  RunFor(1) is called again, which
495 // causes the read callback to be invoked, and will then stop.  Then current
496 // step is 2.  Write() is called again.  Then next available write is
497 // synchronous so the call to Write() returns length.
498 //
499 // For examples of how to use this class, see:
500 //   deterministic_socket_data_unittests.cc
501 class DeterministicSocketData : public StaticSocketDataProvider {
502  public:
503   // The Delegate is an abstract interface which handles the communication from
504   // the DeterministicSocketData to the Deterministic MockSocket.  The
505   // MockSockets directly store a pointer to the DeterministicSocketData,
506   // whereas the DeterministicSocketData only stores a pointer to the
507   // abstract Delegate interface.
508   class Delegate {
509    public:
510     // Returns true if there is currently a write pending. That is to say, if
511     // an asynchronous write has been started but the callback has not been
512     // invoked.
513     virtual bool WritePending() const = 0;
514     // Returns true if there is currently a read pending. That is to say, if
515     // an asynchronous read has been started but the callback has not been
516     // invoked.
517     virtual bool ReadPending() const = 0;
518     // Called to complete an asynchronous write to execute the write callback.
519     virtual void CompleteWrite() = 0;
520     // Called to complete an asynchronous read to execute the read callback.
521     virtual int CompleteRead() = 0;
522
523    protected:
524     virtual ~Delegate() {}
525   };
526
527   // |reads| the list of MockRead completions.
528   // |writes| the list of MockWrite completions.
529   DeterministicSocketData(MockRead* reads,
530                           size_t reads_count,
531                           MockWrite* writes,
532                           size_t writes_count);
533   virtual ~DeterministicSocketData();
534
535   // Consume all the data up to the give stop point (via SetStop()).
536   void Run();
537
538   // Set the stop point to be |steps| from now, and then invoke Run().
539   void RunFor(int steps);
540
541   // Stop at step |seq|, which must be in the future.
542   virtual void SetStop(int seq);
543
544   // Stop |seq| steps after the current step.
545   virtual void StopAfter(int seq);
546   bool stopped() const { return stopped_; }
547   void SetStopped(bool val) { stopped_ = val; }
548   MockRead& current_read() { return current_read_; }
549   MockWrite& current_write() { return current_write_; }
550   int sequence_number() const { return sequence_number_; }
551   void set_delegate(base::WeakPtr<Delegate> delegate) { delegate_ = delegate; }
552
553   // StaticSocketDataProvider:
554
555   // When the socket calls Read(), that calls GetNextRead(), and expects either
556   // ERR_IO_PENDING or data.
557   virtual MockRead GetNextRead() OVERRIDE;
558
559   // When the socket calls Write(), it always completes synchronously. OnWrite()
560   // checks to make sure the written data matches the expected data. The
561   // callback will not be invoked until its sequence number is reached.
562   virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE;
563   virtual void Reset() OVERRIDE;
564   virtual void CompleteRead() OVERRIDE {}
565
566  private:
567   // Invoke the read and write callbacks, if the timing is appropriate.
568   void InvokeCallbacks();
569
570   void NextStep();
571
572   void VerifyCorrectSequenceNumbers(MockRead* reads,
573                                     size_t reads_count,
574                                     MockWrite* writes,
575                                     size_t writes_count);
576
577   int sequence_number_;
578   MockRead current_read_;
579   MockWrite current_write_;
580   int stopping_sequence_number_;
581   bool stopped_;
582   base::WeakPtr<Delegate> delegate_;
583   bool print_debug_;
584   bool is_running_;
585 };
586
587 // Holds an array of SocketDataProvider elements.  As Mock{TCP,SSL}StreamSocket
588 // objects get instantiated, they take their data from the i'th element of this
589 // array.
590 template <typename T>
591 class SocketDataProviderArray {
592  public:
593   SocketDataProviderArray() : next_index_(0) {}
594
595   T* GetNext() {
596     DCHECK_LT(next_index_, data_providers_.size());
597     return data_providers_[next_index_++];
598   }
599
600   void Add(T* data_provider) {
601     DCHECK(data_provider);
602     data_providers_.push_back(data_provider);
603   }
604
605   size_t next_index() { return next_index_; }
606
607   void ResetNextIndex() { next_index_ = 0; }
608
609  private:
610   // Index of the next |data_providers_| element to use. Not an iterator
611   // because those are invalidated on vector reallocation.
612   size_t next_index_;
613
614   // SocketDataProviders to be returned.
615   std::vector<T*> data_providers_;
616 };
617
618 class MockUDPClientSocket;
619 class MockTCPClientSocket;
620 class MockSSLClientSocket;
621
622 // ClientSocketFactory which contains arrays of sockets of each type.
623 // You should first fill the arrays using AddMock{SSL,}Socket. When the factory
624 // is asked to create a socket, it takes next entry from appropriate array.
625 // You can use ResetNextMockIndexes to reset that next entry index for all mock
626 // socket types.
627 class MockClientSocketFactory : public ClientSocketFactory {
628  public:
629   MockClientSocketFactory();
630   virtual ~MockClientSocketFactory();
631
632   void AddSocketDataProvider(SocketDataProvider* socket);
633   void AddSSLSocketDataProvider(SSLSocketDataProvider* socket);
634   void ResetNextMockIndexes();
635
636   SocketDataProviderArray<SocketDataProvider>& mock_data() {
637     return mock_data_;
638   }
639
640   // ClientSocketFactory
641   virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
642       DatagramSocket::BindType bind_type,
643       const RandIntCallback& rand_int_cb,
644       NetLog* net_log,
645       const NetLog::Source& source) OVERRIDE;
646   virtual scoped_ptr<StreamSocket> CreateTransportClientSocket(
647       const AddressList& addresses,
648       NetLog* net_log,
649       const NetLog::Source& source) OVERRIDE;
650   virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
651       scoped_ptr<ClientSocketHandle> transport_socket,
652       const HostPortPair& host_and_port,
653       const SSLConfig& ssl_config,
654       const SSLClientSocketContext& context) OVERRIDE;
655   virtual void ClearSSLSessionCache() OVERRIDE;
656
657  private:
658   SocketDataProviderArray<SocketDataProvider> mock_data_;
659   SocketDataProviderArray<SSLSocketDataProvider> mock_ssl_data_;
660 };
661
662 class MockClientSocket : public SSLClientSocket {
663  public:
664   // Value returned by GetTLSUniqueChannelBinding().
665   static const char kTlsUnique[];
666
667   // The BoundNetLog is needed to test LoadTimingInfo, which uses NetLog IDs as
668   // unique socket IDs.
669   explicit MockClientSocket(const BoundNetLog& net_log);
670
671   // Socket implementation.
672   virtual int Read(IOBuffer* buf,
673                    int buf_len,
674                    const CompletionCallback& callback) = 0;
675   virtual int Write(IOBuffer* buf,
676                     int buf_len,
677                     const CompletionCallback& callback) = 0;
678   virtual int SetReceiveBufferSize(int32 size) OVERRIDE;
679   virtual int SetSendBufferSize(int32 size) OVERRIDE;
680
681   // StreamSocket implementation.
682   virtual int Connect(const CompletionCallback& callback) = 0;
683   virtual void Disconnect() OVERRIDE;
684   virtual bool IsConnected() const OVERRIDE;
685   virtual bool IsConnectedAndIdle() const OVERRIDE;
686   virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE;
687   virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE;
688   virtual const BoundNetLog& NetLog() const OVERRIDE;
689   virtual void SetSubresourceSpeculation() OVERRIDE {}
690   virtual void SetOmniboxSpeculation() OVERRIDE {}
691
692   // SSLClientSocket implementation.
693   virtual void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info)
694       OVERRIDE;
695   virtual int ExportKeyingMaterial(const base::StringPiece& label,
696                                    bool has_context,
697                                    const base::StringPiece& context,
698                                    unsigned char* out,
699                                    unsigned int outlen) OVERRIDE;
700   virtual int GetTLSUniqueChannelBinding(std::string* out) OVERRIDE;
701   virtual NextProtoStatus GetNextProto(std::string* proto,
702                                        std::string* server_protos) OVERRIDE;
703   virtual ServerBoundCertService* GetServerBoundCertService() const OVERRIDE;
704
705  protected:
706   virtual ~MockClientSocket();
707   void RunCallbackAsync(const CompletionCallback& callback, int result);
708   void RunCallback(const CompletionCallback& callback, int result);
709
710   // SSLClientSocket implementation.
711   virtual scoped_refptr<X509Certificate> GetUnverifiedServerCertificateChain()
712       const OVERRIDE;
713
714   // True if Connect completed successfully and Disconnect hasn't been called.
715   bool connected_;
716
717   // Address of the "remote" peer we're connected to.
718   IPEndPoint peer_addr_;
719
720   BoundNetLog net_log_;
721
722   base::WeakPtrFactory<MockClientSocket> weak_factory_;
723
724   DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
725 };
726
727 class MockTCPClientSocket : public MockClientSocket, public AsyncSocket {
728  public:
729   MockTCPClientSocket(const AddressList& addresses,
730                       net::NetLog* net_log,
731                       SocketDataProvider* socket);
732   virtual ~MockTCPClientSocket();
733
734   const AddressList& addresses() const { return addresses_; }
735
736   // Socket implementation.
737   virtual int Read(IOBuffer* buf,
738                    int buf_len,
739                    const CompletionCallback& callback) OVERRIDE;
740   virtual int Write(IOBuffer* buf,
741                     int buf_len,
742                     const CompletionCallback& callback) OVERRIDE;
743
744   // StreamSocket implementation.
745   virtual int Connect(const CompletionCallback& callback) OVERRIDE;
746   virtual void Disconnect() OVERRIDE;
747   virtual bool IsConnected() const OVERRIDE;
748   virtual bool IsConnectedAndIdle() const OVERRIDE;
749   virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE;
750   virtual bool WasEverUsed() const OVERRIDE;
751   virtual bool UsingTCPFastOpen() const OVERRIDE;
752   virtual bool WasNpnNegotiated() const OVERRIDE;
753   virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE;
754
755   // AsyncSocket:
756   virtual void OnReadComplete(const MockRead& data) OVERRIDE;
757   virtual void OnConnectComplete(const MockConnect& data) OVERRIDE;
758
759  private:
760   int CompleteRead();
761
762   AddressList addresses_;
763
764   SocketDataProvider* data_;
765   int read_offset_;
766   MockRead read_data_;
767   bool need_read_data_;
768
769   // True if the peer has closed the connection.  This allows us to simulate
770   // the recv(..., MSG_PEEK) call in the IsConnectedAndIdle method of the real
771   // TCPClientSocket.
772   bool peer_closed_connection_;
773
774   // While an asynchronous IO is pending, we save our user-buffer state.
775   scoped_refptr<IOBuffer> pending_buf_;
776   int pending_buf_len_;
777   CompletionCallback pending_callback_;
778   bool was_used_to_convey_data_;
779
780   DISALLOW_COPY_AND_ASSIGN(MockTCPClientSocket);
781 };
782
783 // DeterministicSocketHelper is a helper class that can be used
784 // to simulate net::Socket::Read() and net::Socket::Write()
785 // using deterministic |data|.
786 // Note: This is provided as a common helper class because
787 // of the inheritance hierarchy of DeterministicMock[UDP,TCP]ClientSocket and a
788 // desire not to introduce an additional common base class.
789 class DeterministicSocketHelper {
790  public:
791   DeterministicSocketHelper(net::NetLog* net_log,
792                             DeterministicSocketData* data);
793   virtual ~DeterministicSocketHelper();
794
795   bool write_pending() const { return write_pending_; }
796   bool read_pending() const { return read_pending_; }
797
798   void CompleteWrite();
799   int CompleteRead();
800
801   int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback);
802   int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback);
803
804   const BoundNetLog& net_log() const { return net_log_; }
805
806   bool was_used_to_convey_data() const { return was_used_to_convey_data_; }
807
808   bool peer_closed_connection() const { return peer_closed_connection_; }
809
810   DeterministicSocketData* data() const { return data_; }
811
812  private:
813   bool write_pending_;
814   CompletionCallback write_callback_;
815   int write_result_;
816
817   MockRead read_data_;
818
819   IOBuffer* read_buf_;
820   int read_buf_len_;
821   bool read_pending_;
822   CompletionCallback read_callback_;
823   DeterministicSocketData* data_;
824   bool was_used_to_convey_data_;
825   bool peer_closed_connection_;
826   BoundNetLog net_log_;
827 };
828
829 // Mock UDP socket to be used in conjunction with DeterministicSocketData.
830 class DeterministicMockUDPClientSocket
831     : public DatagramClientSocket,
832       public AsyncSocket,
833       public DeterministicSocketData::Delegate,
834       public base::SupportsWeakPtr<DeterministicMockUDPClientSocket> {
835  public:
836   DeterministicMockUDPClientSocket(net::NetLog* net_log,
837                                    DeterministicSocketData* data);
838   virtual ~DeterministicMockUDPClientSocket();
839
840   // DeterministicSocketData::Delegate:
841   virtual bool WritePending() const OVERRIDE;
842   virtual bool ReadPending() const OVERRIDE;
843   virtual void CompleteWrite() OVERRIDE;
844   virtual int CompleteRead() OVERRIDE;
845
846   // Socket implementation.
847   virtual int Read(IOBuffer* buf,
848                    int buf_len,
849                    const CompletionCallback& callback) OVERRIDE;
850   virtual int Write(IOBuffer* buf,
851                     int buf_len,
852                     const CompletionCallback& callback) OVERRIDE;
853   virtual int SetReceiveBufferSize(int32 size) OVERRIDE;
854   virtual int SetSendBufferSize(int32 size) OVERRIDE;
855
856   // DatagramSocket implementation.
857   virtual void Close() OVERRIDE;
858   virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE;
859   virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE;
860   virtual const BoundNetLog& NetLog() const OVERRIDE;
861
862   // DatagramClientSocket implementation.
863   virtual int Connect(const IPEndPoint& address) OVERRIDE;
864
865   // AsyncSocket implementation.
866   virtual void OnReadComplete(const MockRead& data) OVERRIDE;
867   virtual void OnConnectComplete(const MockConnect& data) OVERRIDE;
868
869   void set_source_port(int port) { source_port_ = port; }
870
871  private:
872   bool connected_;
873   IPEndPoint peer_address_;
874   DeterministicSocketHelper helper_;
875   int source_port_;  // Ephemeral source port.
876
877   DISALLOW_COPY_AND_ASSIGN(DeterministicMockUDPClientSocket);
878 };
879
880 // Mock TCP socket to be used in conjunction with DeterministicSocketData.
881 class DeterministicMockTCPClientSocket
882     : public MockClientSocket,
883       public AsyncSocket,
884       public DeterministicSocketData::Delegate,
885       public base::SupportsWeakPtr<DeterministicMockTCPClientSocket> {
886  public:
887   DeterministicMockTCPClientSocket(net::NetLog* net_log,
888                                    DeterministicSocketData* data);
889   virtual ~DeterministicMockTCPClientSocket();
890
891   // DeterministicSocketData::Delegate:
892   virtual bool WritePending() const OVERRIDE;
893   virtual bool ReadPending() const OVERRIDE;
894   virtual void CompleteWrite() OVERRIDE;
895   virtual int CompleteRead() OVERRIDE;
896
897   // Socket:
898   virtual int Write(IOBuffer* buf,
899                     int buf_len,
900                     const CompletionCallback& callback) OVERRIDE;
901   virtual int Read(IOBuffer* buf,
902                    int buf_len,
903                    const CompletionCallback& callback) OVERRIDE;
904
905   // StreamSocket:
906   virtual int Connect(const CompletionCallback& callback) OVERRIDE;
907   virtual void Disconnect() OVERRIDE;
908   virtual bool IsConnected() const OVERRIDE;
909   virtual bool IsConnectedAndIdle() const OVERRIDE;
910   virtual bool WasEverUsed() const OVERRIDE;
911   virtual bool UsingTCPFastOpen() const OVERRIDE;
912   virtual bool WasNpnNegotiated() const OVERRIDE;
913   virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE;
914
915   // AsyncSocket:
916   virtual void OnReadComplete(const MockRead& data) OVERRIDE;
917   virtual void OnConnectComplete(const MockConnect& data) OVERRIDE;
918
919  private:
920   DeterministicSocketHelper helper_;
921
922   DISALLOW_COPY_AND_ASSIGN(DeterministicMockTCPClientSocket);
923 };
924
925 class MockSSLClientSocket : public MockClientSocket, public AsyncSocket {
926  public:
927   MockSSLClientSocket(scoped_ptr<ClientSocketHandle> transport_socket,
928                       const HostPortPair& host_and_port,
929                       const SSLConfig& ssl_config,
930                       SSLSocketDataProvider* socket);
931   virtual ~MockSSLClientSocket();
932
933   // Socket implementation.
934   virtual int Read(IOBuffer* buf,
935                    int buf_len,
936                    const CompletionCallback& callback) OVERRIDE;
937   virtual int Write(IOBuffer* buf,
938                     int buf_len,
939                     const CompletionCallback& callback) OVERRIDE;
940
941   // StreamSocket implementation.
942   virtual int Connect(const CompletionCallback& callback) OVERRIDE;
943   virtual void Disconnect() OVERRIDE;
944   virtual bool IsConnected() const OVERRIDE;
945   virtual bool WasEverUsed() const OVERRIDE;
946   virtual bool UsingTCPFastOpen() const OVERRIDE;
947   virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE;
948   virtual bool WasNpnNegotiated() const OVERRIDE;
949   virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE;
950
951   // SSLClientSocket implementation.
952   virtual void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info)
953       OVERRIDE;
954   virtual NextProtoStatus GetNextProto(std::string* proto,
955                                        std::string* server_protos) OVERRIDE;
956   virtual bool set_was_npn_negotiated(bool negotiated) OVERRIDE;
957   virtual void set_protocol_negotiated(NextProto protocol_negotiated) OVERRIDE;
958   virtual NextProto GetNegotiatedProtocol() const OVERRIDE;
959
960   // This MockSocket does not implement the manual async IO feature.
961   virtual void OnReadComplete(const MockRead& data) OVERRIDE;
962   virtual void OnConnectComplete(const MockConnect& data) OVERRIDE;
963
964   virtual bool WasChannelIDSent() const OVERRIDE;
965   virtual void set_channel_id_sent(bool channel_id_sent) OVERRIDE;
966   virtual ServerBoundCertService* GetServerBoundCertService() const OVERRIDE;
967
968  private:
969   static void ConnectCallback(MockSSLClientSocket* ssl_client_socket,
970                               const CompletionCallback& callback,
971                               int rv);
972
973   scoped_ptr<ClientSocketHandle> transport_;
974   SSLSocketDataProvider* data_;
975   bool is_npn_state_set_;
976   bool new_npn_value_;
977   bool is_protocol_negotiated_set_;
978   NextProto protocol_negotiated_;
979
980   DISALLOW_COPY_AND_ASSIGN(MockSSLClientSocket);
981 };
982
983 class MockUDPClientSocket : public DatagramClientSocket, public AsyncSocket {
984  public:
985   MockUDPClientSocket(SocketDataProvider* data, net::NetLog* net_log);
986   virtual ~MockUDPClientSocket();
987
988   // Socket implementation.
989   virtual int Read(IOBuffer* buf,
990                    int buf_len,
991                    const CompletionCallback& callback) OVERRIDE;
992   virtual int Write(IOBuffer* buf,
993                     int buf_len,
994                     const CompletionCallback& callback) OVERRIDE;
995   virtual int SetReceiveBufferSize(int32 size) OVERRIDE;
996   virtual int SetSendBufferSize(int32 size) OVERRIDE;
997
998   // DatagramSocket implementation.
999   virtual void Close() OVERRIDE;
1000   virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE;
1001   virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE;
1002   virtual const BoundNetLog& NetLog() const OVERRIDE;
1003
1004   // DatagramClientSocket implementation.
1005   virtual int Connect(const IPEndPoint& address) OVERRIDE;
1006
1007   // AsyncSocket implementation.
1008   virtual void OnReadComplete(const MockRead& data) OVERRIDE;
1009   virtual void OnConnectComplete(const MockConnect& data) OVERRIDE;
1010
1011   void set_source_port(int port) { source_port_ = port;}
1012
1013  private:
1014   int CompleteRead();
1015
1016   void RunCallbackAsync(const CompletionCallback& callback, int result);
1017   void RunCallback(const CompletionCallback& callback, int result);
1018
1019   bool connected_;
1020   SocketDataProvider* data_;
1021   int read_offset_;
1022   MockRead read_data_;
1023   bool need_read_data_;
1024   int source_port_;  // Ephemeral source port.
1025
1026   // Address of the "remote" peer we're connected to.
1027   IPEndPoint peer_addr_;
1028
1029   // While an asynchronous IO is pending, we save our user-buffer state.
1030   scoped_refptr<IOBuffer> pending_buf_;
1031   int pending_buf_len_;
1032   CompletionCallback pending_callback_;
1033
1034   BoundNetLog net_log_;
1035
1036   base::WeakPtrFactory<MockUDPClientSocket> weak_factory_;
1037
1038   DISALLOW_COPY_AND_ASSIGN(MockUDPClientSocket);
1039 };
1040
1041 class TestSocketRequest : public TestCompletionCallbackBase {
1042  public:
1043   TestSocketRequest(std::vector<TestSocketRequest*>* request_order,
1044                     size_t* completion_count);
1045   virtual ~TestSocketRequest();
1046
1047   ClientSocketHandle* handle() { return &handle_; }
1048
1049   const net::CompletionCallback& callback() const { return callback_; }
1050
1051  private:
1052   void OnComplete(int result);
1053
1054   ClientSocketHandle handle_;
1055   std::vector<TestSocketRequest*>* request_order_;
1056   size_t* completion_count_;
1057   CompletionCallback callback_;
1058
1059   DISALLOW_COPY_AND_ASSIGN(TestSocketRequest);
1060 };
1061
1062 class ClientSocketPoolTest {
1063  public:
1064   enum KeepAlive {
1065     KEEP_ALIVE,
1066
1067     // A socket will be disconnected in addition to handle being reset.
1068     NO_KEEP_ALIVE,
1069   };
1070
1071   static const int kIndexOutOfBounds;
1072   static const int kRequestNotFound;
1073
1074   ClientSocketPoolTest();
1075   ~ClientSocketPoolTest();
1076
1077   template <typename PoolType>
1078   int StartRequestUsingPool(
1079       PoolType* socket_pool,
1080       const std::string& group_name,
1081       RequestPriority priority,
1082       const scoped_refptr<typename PoolType::SocketParams>& socket_params) {
1083     DCHECK(socket_pool);
1084     TestSocketRequest* request =
1085         new TestSocketRequest(&request_order_, &completion_count_);
1086     requests_.push_back(request);
1087     int rv = request->handle()->Init(group_name,
1088                                      socket_params,
1089                                      priority,
1090                                      request->callback(),
1091                                      socket_pool,
1092                                      BoundNetLog());
1093     if (rv != ERR_IO_PENDING)
1094       request_order_.push_back(request);
1095     return rv;
1096   }
1097
1098   // Provided there were n requests started, takes |index| in range 1..n
1099   // and returns order in which that request completed, in range 1..n,
1100   // or kIndexOutOfBounds if |index| is out of bounds, or kRequestNotFound
1101   // if that request did not complete (for example was canceled).
1102   int GetOrderOfRequest(size_t index) const;
1103
1104   // Resets first initialized socket handle from |requests_|. If found such
1105   // a handle, returns true.
1106   bool ReleaseOneConnection(KeepAlive keep_alive);
1107
1108   // Releases connections until there is nothing to release.
1109   void ReleaseAllConnections(KeepAlive keep_alive);
1110
1111   // Note that this uses 0-based indices, while GetOrderOfRequest takes and
1112   // returns 0-based indices.
1113   TestSocketRequest* request(int i) { return requests_[i]; }
1114
1115   size_t requests_size() const { return requests_.size(); }
1116   ScopedVector<TestSocketRequest>* requests() { return &requests_; }
1117   size_t completion_count() const { return completion_count_; }
1118
1119  private:
1120   ScopedVector<TestSocketRequest> requests_;
1121   std::vector<TestSocketRequest*> request_order_;
1122   size_t completion_count_;
1123
1124   DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolTest);
1125 };
1126
1127 class MockTransportSocketParams
1128     : public base::RefCounted<MockTransportSocketParams> {
1129  private:
1130   friend class base::RefCounted<MockTransportSocketParams>;
1131   ~MockTransportSocketParams() {}
1132
1133   DISALLOW_COPY_AND_ASSIGN(MockTransportSocketParams);
1134 };
1135
1136 class MockTransportClientSocketPool : public TransportClientSocketPool {
1137  public:
1138   typedef MockTransportSocketParams SocketParams;
1139
1140   class MockConnectJob {
1141    public:
1142     MockConnectJob(scoped_ptr<StreamSocket> socket,
1143                    ClientSocketHandle* handle,
1144                    const CompletionCallback& callback);
1145     ~MockConnectJob();
1146
1147     int Connect();
1148     bool CancelHandle(const ClientSocketHandle* handle);
1149
1150    private:
1151     void OnConnect(int rv);
1152
1153     scoped_ptr<StreamSocket> socket_;
1154     ClientSocketHandle* handle_;
1155     CompletionCallback user_callback_;
1156
1157     DISALLOW_COPY_AND_ASSIGN(MockConnectJob);
1158   };
1159
1160   MockTransportClientSocketPool(int max_sockets,
1161                                 int max_sockets_per_group,
1162                                 ClientSocketPoolHistograms* histograms,
1163                                 ClientSocketFactory* socket_factory);
1164
1165   virtual ~MockTransportClientSocketPool();
1166
1167   RequestPriority last_request_priority() const {
1168     return last_request_priority_;
1169   }
1170   int release_count() const { return release_count_; }
1171   int cancel_count() const { return cancel_count_; }
1172
1173   // TransportClientSocketPool implementation.
1174   virtual int RequestSocket(const std::string& group_name,
1175                             const void* socket_params,
1176                             RequestPriority priority,
1177                             ClientSocketHandle* handle,
1178                             const CompletionCallback& callback,
1179                             const BoundNetLog& net_log) OVERRIDE;
1180
1181   virtual void CancelRequest(const std::string& group_name,
1182                              ClientSocketHandle* handle) OVERRIDE;
1183   virtual void ReleaseSocket(const std::string& group_name,
1184                              scoped_ptr<StreamSocket> socket,
1185                              int id) OVERRIDE;
1186
1187  private:
1188   ClientSocketFactory* client_socket_factory_;
1189   ScopedVector<MockConnectJob> job_list_;
1190   RequestPriority last_request_priority_;
1191   int release_count_;
1192   int cancel_count_;
1193
1194   DISALLOW_COPY_AND_ASSIGN(MockTransportClientSocketPool);
1195 };
1196
1197 class DeterministicMockClientSocketFactory : public ClientSocketFactory {
1198  public:
1199   DeterministicMockClientSocketFactory();
1200   virtual ~DeterministicMockClientSocketFactory();
1201
1202   void AddSocketDataProvider(DeterministicSocketData* socket);
1203   void AddSSLSocketDataProvider(SSLSocketDataProvider* socket);
1204   void ResetNextMockIndexes();
1205
1206   // Return |index|-th MockSSLClientSocket (starting from 0) that the factory
1207   // created.
1208   MockSSLClientSocket* GetMockSSLClientSocket(size_t index) const;
1209
1210   SocketDataProviderArray<DeterministicSocketData>& mock_data() {
1211     return mock_data_;
1212   }
1213   std::vector<DeterministicMockTCPClientSocket*>& tcp_client_sockets() {
1214     return tcp_client_sockets_;
1215   }
1216   std::vector<DeterministicMockUDPClientSocket*>& udp_client_sockets() {
1217     return udp_client_sockets_;
1218   }
1219
1220   // ClientSocketFactory
1221   virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
1222       DatagramSocket::BindType bind_type,
1223       const RandIntCallback& rand_int_cb,
1224       NetLog* net_log,
1225       const NetLog::Source& source) OVERRIDE;
1226   virtual scoped_ptr<StreamSocket> CreateTransportClientSocket(
1227       const AddressList& addresses,
1228       NetLog* net_log,
1229       const NetLog::Source& source) OVERRIDE;
1230   virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
1231       scoped_ptr<ClientSocketHandle> transport_socket,
1232       const HostPortPair& host_and_port,
1233       const SSLConfig& ssl_config,
1234       const SSLClientSocketContext& context) OVERRIDE;
1235   virtual void ClearSSLSessionCache() OVERRIDE;
1236
1237  private:
1238   SocketDataProviderArray<DeterministicSocketData> mock_data_;
1239   SocketDataProviderArray<SSLSocketDataProvider> mock_ssl_data_;
1240
1241   // Store pointers to handed out sockets in case the test wants to get them.
1242   std::vector<DeterministicMockTCPClientSocket*> tcp_client_sockets_;
1243   std::vector<DeterministicMockUDPClientSocket*> udp_client_sockets_;
1244   std::vector<MockSSLClientSocket*> ssl_client_sockets_;
1245
1246   DISALLOW_COPY_AND_ASSIGN(DeterministicMockClientSocketFactory);
1247 };
1248
1249 class MockSOCKSClientSocketPool : public SOCKSClientSocketPool {
1250  public:
1251   MockSOCKSClientSocketPool(int max_sockets,
1252                             int max_sockets_per_group,
1253                             ClientSocketPoolHistograms* histograms,
1254                             TransportClientSocketPool* transport_pool);
1255
1256   virtual ~MockSOCKSClientSocketPool();
1257
1258   // SOCKSClientSocketPool implementation.
1259   virtual int RequestSocket(const std::string& group_name,
1260                             const void* socket_params,
1261                             RequestPriority priority,
1262                             ClientSocketHandle* handle,
1263                             const CompletionCallback& callback,
1264                             const BoundNetLog& net_log) OVERRIDE;
1265
1266   virtual void CancelRequest(const std::string& group_name,
1267                              ClientSocketHandle* handle) OVERRIDE;
1268   virtual void ReleaseSocket(const std::string& group_name,
1269                              scoped_ptr<StreamSocket> socket,
1270                              int id) OVERRIDE;
1271
1272  private:
1273   TransportClientSocketPool* const transport_pool_;
1274
1275   DISALLOW_COPY_AND_ASSIGN(MockSOCKSClientSocketPool);
1276 };
1277
1278 // Constants for a successful SOCKS v5 handshake.
1279 extern const char kSOCKS5GreetRequest[];
1280 extern const int kSOCKS5GreetRequestLength;
1281
1282 extern const char kSOCKS5GreetResponse[];
1283 extern const int kSOCKS5GreetResponseLength;
1284
1285 extern const char kSOCKS5OkRequest[];
1286 extern const int kSOCKS5OkRequestLength;
1287
1288 extern const char kSOCKS5OkResponse[];
1289 extern const int kSOCKS5OkResponseLength;
1290
1291 }  // namespace net
1292
1293 #endif  // NET_SOCKET_SOCKET_TEST_UTIL_H_