1// Copyright 2014 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// Test methods and classes common to transport_client_socket_pool_unittest.cc
6// and websocket_transport_client_socket_pool_unittest.cc. If you find you need
7// to use these for another purpose, consider moving them to socket_test_util.h.
8
9#ifndef NET_SOCKET_TRANSPORT_CLIENT_SOCKET_POOL_TEST_UTIL_H_
10#define NET_SOCKET_TRANSPORT_CLIENT_SOCKET_POOL_TEST_UTIL_H_
11
12#include <queue>
13
14#include "base/callback.h"
15#include "base/compiler_specific.h"
16#include "base/macros.h"
17#include "base/memory/scoped_ptr.h"
18#include "base/time/time.h"
19#include "net/base/address_list.h"
20#include "net/base/net_log.h"
21#include "net/socket/client_socket_factory.h"
22#include "net/socket/client_socket_handle.h"
23#include "net/socket/stream_socket.h"
24
25namespace net {
26
27class ClientSocketHandle;
28class IPEndPoint;
29
30// Make sure |handle| sets load times correctly when it has been assigned a
31// reused socket. Uses gtest expectations.
32void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle);
33
34// Make sure |handle| sets load times correctly when it has been assigned a
35// fresh socket.  Also runs TestLoadTimingInfoConnectedReused, since the owner
36// of a connection where |is_reused| is false may consider the connection
37// reused. Uses gtest expectations.
38void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle);
39
40// Set |address| to 1.1.1.1:80
41void SetIPv4Address(IPEndPoint* address);
42
43// Set |address| to [1:abcd::3:4:ff]:80
44void SetIPv6Address(IPEndPoint* address);
45
46// A ClientSocketFactory that produces sockets with the specified connection
47// behaviours.
48class MockTransportClientSocketFactory : public ClientSocketFactory {
49 public:
50  enum ClientSocketType {
51    // Connects successfully, synchronously.
52    MOCK_CLIENT_SOCKET,
53    // Fails to connect, synchronously.
54    MOCK_FAILING_CLIENT_SOCKET,
55    // Connects successfully, asynchronously.
56    MOCK_PENDING_CLIENT_SOCKET,
57    // Fails to connect, asynchronously.
58    MOCK_PENDING_FAILING_CLIENT_SOCKET,
59    // A delayed socket will pause before connecting through the message loop.
60    MOCK_DELAYED_CLIENT_SOCKET,
61    // A delayed socket that fails.
62    MOCK_DELAYED_FAILING_CLIENT_SOCKET,
63    // A stalled socket that never connects at all.
64    MOCK_STALLED_CLIENT_SOCKET,
65    // A socket that can be triggered to connect explicitly, asynchronously.
66    MOCK_TRIGGERABLE_CLIENT_SOCKET,
67  };
68
69  explicit MockTransportClientSocketFactory(NetLog* net_log);
70  virtual ~MockTransportClientSocketFactory();
71
72  virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
73      DatagramSocket::BindType bind_type,
74      const RandIntCallback& rand_int_cb,
75      NetLog* net_log,
76      const NetLog::Source& source) OVERRIDE;
77
78  virtual scoped_ptr<StreamSocket> CreateTransportClientSocket(
79      const AddressList& addresses,
80      NetLog* /* net_log */,
81      const NetLog::Source& /* source */) OVERRIDE;
82
83  virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
84      scoped_ptr<ClientSocketHandle> transport_socket,
85      const HostPortPair& host_and_port,
86      const SSLConfig& ssl_config,
87      const SSLClientSocketContext& context) OVERRIDE;
88
89  virtual void ClearSSLSessionCache() OVERRIDE;
90
91  int allocation_count() const { return allocation_count_; }
92
93  // Set the default ClientSocketType.
94  void set_default_client_socket_type(ClientSocketType type) {
95    client_socket_type_ = type;
96  }
97
98  // Set a list of ClientSocketTypes to be used.
99  void set_client_socket_types(ClientSocketType* type_list, int num_types);
100
101  void set_delay(base::TimeDelta delay) { delay_ = delay; }
102
103  // If one or more MOCK_TRIGGERABLE_CLIENT_SOCKETs has already been created,
104  // then returns a Closure that can be called to cause the first
105  // not-yet-connected one to connect. If no MOCK_TRIGGERABLE_CLIENT_SOCKETs
106  // have been created yet, wait for one to be created before returning the
107  // Closure. This method should be called the same number of times as
108  // MOCK_TRIGGERABLE_CLIENT_SOCKETs are created in the test.
109  base::Closure WaitForTriggerableSocketCreation();
110
111 private:
112  NetLog* net_log_;
113  int allocation_count_;
114  ClientSocketType client_socket_type_;
115  ClientSocketType* client_socket_types_;
116  int client_socket_index_;
117  int client_socket_index_max_;
118  base::TimeDelta delay_;
119  std::queue<base::Closure> triggerable_sockets_;
120  base::Closure run_loop_quit_closure_;
121
122  DISALLOW_COPY_AND_ASSIGN(MockTransportClientSocketFactory);
123};
124
125}  // namespace net
126
127#endif  // NET_SOCKET_TRANSPORT_CLIENT_SOCKET_POOL_TEST_UTIL_H_
128