Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: net/base/socket_test_util.h

Issue 144009: Move socket related files from net/base to net/socket. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/base/socket.h ('k') | net/base/socket_test_util.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2009 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_BASE_SOCKET_TEST_UTIL_H_
6 #define NET_BASE_SOCKET_TEST_UTIL_H_
7
8 #include <string>
9 #include <vector>
10
11 #include "base/basictypes.h"
12 #include "base/logging.h"
13 #include "net/base/address_list.h"
14 #include "net/base/client_socket_factory.h"
15 #include "net/base/net_errors.h"
16 #include "net/base/ssl_config_service.h"
17
18 namespace net {
19
20 class ClientSocket;
21 class SSLClientSocket;
22
23 struct MockConnect {
24 // Asynchronous connection success.
25 MockConnect() : async(true), result(OK) { }
26 MockConnect(bool a, int r) : async(a), result(r) { }
27
28 bool async;
29 int result;
30 };
31
32 struct MockRead {
33 // Read failure (no data).
34 MockRead(bool async, int result) : async(async) , result(result), data(NULL),
35 data_len(0) { }
36
37 // Asynchronous read success (inferred data length).
38 explicit MockRead(const char* data) : async(true), result(0), data(data),
39 data_len(strlen(data)) { }
40
41 // Read success (inferred data length).
42 MockRead(bool async, const char* data) : async(async), result(0), data(data),
43 data_len(strlen(data)) { }
44
45 // Read success.
46 MockRead(bool async, const char* data, int data_len) : async(async),
47 result(0), data(data), data_len(data_len) { }
48
49 bool async;
50 int result;
51 const char* data;
52 int data_len;
53 };
54
55 // MockWrite uses the same member fields as MockRead, but with different
56 // meanings. The expected input to MockTCPClientSocket::Write() is given
57 // by {data, data_len}, and the return value of Write() is controlled by
58 // {async, result}.
59 typedef MockRead MockWrite;
60
61 struct MockWriteResult {
62 MockWriteResult(bool async, int result) : async(async), result(result) {}
63
64 bool async;
65 int result;
66 };
67
68 class MockSocket {
69 public:
70 MockSocket() : unexpected_read_(true, ERR_UNEXPECTED) {
71 }
72
73 virtual ~MockSocket() {}
74 virtual MockRead* GetNextRead() = 0;
75 virtual MockWriteResult OnWrite(const std::string& data) = 0;
76 virtual void Reset() = 0;
77
78 MockConnect connect_data() const { return connect_; }
79
80 protected:
81 MockRead* unexpected_read() { return &unexpected_read_; }
82
83 private:
84 MockRead unexpected_read_;
85 MockConnect connect_;
86
87 DISALLOW_COPY_AND_ASSIGN(MockSocket);
88 };
89
90 // MockSocket which responds based on static tables of mock reads and writes.
91 class StaticMockSocket : public MockSocket {
92 public:
93 StaticMockSocket() : reads_(NULL), read_index_(0),
94 writes_(NULL), write_index_(0) {}
95 StaticMockSocket(MockRead* r, MockWrite* w) : reads_(r), read_index_(0),
96 writes_(w), write_index_(0) {}
97
98 // MockSocket methods:
99 virtual MockRead* GetNextRead();
100 virtual MockWriteResult OnWrite(const std::string& data);
101 virtual void Reset();
102
103 private:
104 MockRead* reads_;
105 int read_index_;
106 MockWrite* writes_;
107 int write_index_;
108
109 DISALLOW_COPY_AND_ASSIGN(StaticMockSocket);
110 };
111
112 // MockSocket which can make decisions about next mock reads based on
113 // received writes. It can also be used to enforce order of operations,
114 // for example that tested code must send the "Hello!" message before
115 // receiving response. This is useful for testing conversation-like
116 // protocols like FTP.
117 class DynamicMockSocket : public MockSocket {
118 public:
119 DynamicMockSocket();
120
121 // MockSocket methods:
122 virtual MockRead* GetNextRead();
123 virtual MockWriteResult OnWrite(const std::string& data) = 0;
124 virtual void Reset();
125
126 protected:
127 // The next time there is a read from this socket, it will return |data|.
128 // Before calling SimulateRead next time, the previous data must be consumed.
129 void SimulateRead(const char* data);
130
131 private:
132 MockRead read_;
133 bool has_read_;
134 bool consumed_read_;
135
136 DISALLOW_COPY_AND_ASSIGN(DynamicMockSocket);
137 };
138
139 // MockSSLSockets only need to keep track of the return code from calls to
140 // Connect().
141 struct MockSSLSocket {
142 MockSSLSocket(bool async, int result) : connect(async, result) { }
143
144 MockConnect connect;
145 };
146
147 // Holds an array of Mock{SSL,}Socket elements. As Mock{TCP,SSL}ClientSocket
148 // objects get instantiated, they take their data from the i'th element of this
149 // array.
150 template<typename T>
151 class MockSocketArray {
152 public:
153 MockSocketArray() : next_index_(0) {
154 }
155
156 T* GetNext() {
157 DCHECK(next_index_ < sockets_.size());
158 return sockets_[next_index_++];
159 }
160
161 void Add(T* socket) {
162 DCHECK(socket);
163 sockets_.push_back(socket);
164 }
165
166 void ResetNextIndex() {
167 next_index_ = 0;
168 }
169
170 private:
171 // Index of the next |sockets| element to use. Not an iterator because those
172 // are invalidated on vector reallocation.
173 size_t next_index_;
174
175 // Mock sockets to be returned.
176 std::vector<T*> sockets_;
177 };
178
179 // ClientSocketFactory which contains arrays of sockets of each type.
180 // You should first fill the arrays using AddMock{SSL,}Socket. When the factory
181 // is asked to create a socket, it takes next entry from appropriate array.
182 // You can use ResetNextMockIndexes to reset that next entry index for all mock
183 // socket types.
184 class MockClientSocketFactory : public ClientSocketFactory {
185 public:
186 void AddMockSocket(MockSocket* socket);
187 void AddMockSSLSocket(MockSSLSocket* socket);
188 void ResetNextMockIndexes();
189
190 // ClientSocketFactory
191 virtual ClientSocket* CreateTCPClientSocket(const AddressList& addresses);
192 virtual SSLClientSocket* CreateSSLClientSocket(
193 ClientSocket* transport_socket,
194 const std::string& hostname,
195 const SSLConfig& ssl_config);
196
197 private:
198 MockSocketArray<MockSocket> mock_sockets_;
199 MockSocketArray<MockSSLSocket> mock_ssl_sockets_;
200 };
201
202 } // namespace net
203
204 #endif // NET_BASE_SOCKET_TEST_UTIL_H_
OLDNEW
« no previous file with comments | « net/base/socket.h ('k') | net/base/socket_test_util.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698