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

Side by Side Diff: net/socket/websocket_transport_client_socket_pool_unittest.cc

Issue 2109503009: Refactor net tests to use GMock matchers for checking net::Error results (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Revert changes to contents.txt files Created 4 years, 5 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/socket/websocket_transport_client_socket_pool.h" 5 #include "net/socket/websocket_transport_client_socket_pool.h"
6 6
7 #include <queue> 7 #include <queue>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 11 matching lines...) Expand all
22 #include "net/base/load_timing_info_test_util.h" 22 #include "net/base/load_timing_info_test_util.h"
23 #include "net/base/net_errors.h" 23 #include "net/base/net_errors.h"
24 #include "net/base/test_completion_callback.h" 24 #include "net/base/test_completion_callback.h"
25 #include "net/dns/mock_host_resolver.h" 25 #include "net/dns/mock_host_resolver.h"
26 #include "net/log/test_net_log.h" 26 #include "net/log/test_net_log.h"
27 #include "net/socket/client_socket_handle.h" 27 #include "net/socket/client_socket_handle.h"
28 #include "net/socket/socket_test_util.h" 28 #include "net/socket/socket_test_util.h"
29 #include "net/socket/stream_socket.h" 29 #include "net/socket/stream_socket.h"
30 #include "net/socket/transport_client_socket_pool_test_util.h" 30 #include "net/socket/transport_client_socket_pool_test_util.h"
31 #include "net/socket/websocket_endpoint_lock_manager.h" 31 #include "net/socket/websocket_endpoint_lock_manager.h"
32 #include "net/test/gtest_util.h"
33 #include "testing/gmock/include/gmock/gmock.h"
32 #include "testing/gtest/include/gtest/gtest.h" 34 #include "testing/gtest/include/gtest/gtest.h"
33 35
36 using net::test::IsError;
37 using net::test::IsOk;
38
34 namespace net { 39 namespace net {
35 40
36 namespace { 41 namespace {
37 42
38 const int kMaxSockets = 32; 43 const int kMaxSockets = 32;
39 const int kMaxSocketsPerGroup = 6; 44 const int kMaxSocketsPerGroup = 6;
40 const RequestPriority kDefaultPriority = LOW; 45 const RequestPriority kDefaultPriority = LOW;
41 46
42 // RunLoop doesn't support this natively but it is easy to emulate. 47 // RunLoop doesn't support this natively but it is easy to emulate.
43 void RunLoopForTimePeriod(base::TimeDelta period) { 48 void RunLoopForTimePeriod(base::TimeDelta period) {
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 private: 121 private:
117 DISALLOW_COPY_AND_ASSIGN(WebSocketTransportClientSocketPoolTest); 122 DISALLOW_COPY_AND_ASSIGN(WebSocketTransportClientSocketPoolTest);
118 }; 123 };
119 124
120 TEST_F(WebSocketTransportClientSocketPoolTest, Basic) { 125 TEST_F(WebSocketTransportClientSocketPoolTest, Basic) {
121 TestCompletionCallback callback; 126 TestCompletionCallback callback;
122 ClientSocketHandle handle; 127 ClientSocketHandle handle;
123 int rv = 128 int rv =
124 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, 129 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED,
125 callback.callback(), &pool_, BoundNetLog()); 130 callback.callback(), &pool_, BoundNetLog());
126 EXPECT_EQ(ERR_IO_PENDING, rv); 131 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
127 EXPECT_FALSE(handle.is_initialized()); 132 EXPECT_FALSE(handle.is_initialized());
128 EXPECT_FALSE(handle.socket()); 133 EXPECT_FALSE(handle.socket());
129 134
130 EXPECT_EQ(OK, callback.WaitForResult()); 135 EXPECT_THAT(callback.WaitForResult(), IsOk());
131 EXPECT_TRUE(handle.is_initialized()); 136 EXPECT_TRUE(handle.is_initialized());
132 EXPECT_TRUE(handle.socket()); 137 EXPECT_TRUE(handle.socket());
133 TestLoadTimingInfoConnectedNotReused(handle); 138 TestLoadTimingInfoConnectedNotReused(handle);
134 } 139 }
135 140
136 // Make sure that WebSocketTransportConnectJob passes on its priority to its 141 // Make sure that WebSocketTransportConnectJob passes on its priority to its
137 // HostResolver request on Init. 142 // HostResolver request on Init.
138 TEST_F(WebSocketTransportClientSocketPoolTest, SetResolvePriorityOnInit) { 143 TEST_F(WebSocketTransportClientSocketPoolTest, SetResolvePriorityOnInit) {
139 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { 144 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) {
140 RequestPriority priority = static_cast<RequestPriority>(i); 145 RequestPriority priority = static_cast<RequestPriority>(i);
(...skipping 12 matching lines...) Expand all
153 TestCompletionCallback callback; 158 TestCompletionCallback callback;
154 ClientSocketHandle handle; 159 ClientSocketHandle handle;
155 HostPortPair host_port_pair("unresolvable.host.name", 80); 160 HostPortPair host_port_pair("unresolvable.host.name", 80);
156 scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( 161 scoped_refptr<TransportSocketParams> dest(new TransportSocketParams(
157 host_port_pair, false, OnHostResolutionCallback(), 162 host_port_pair, false, OnHostResolutionCallback(),
158 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); 163 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT));
159 EXPECT_EQ(ERR_IO_PENDING, 164 EXPECT_EQ(ERR_IO_PENDING,
160 handle.Init("a", dest, kDefaultPriority, 165 handle.Init("a", dest, kDefaultPriority,
161 ClientSocketPool::RespectLimits::ENABLED, 166 ClientSocketPool::RespectLimits::ENABLED,
162 callback.callback(), &pool_, BoundNetLog())); 167 callback.callback(), &pool_, BoundNetLog()));
163 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback.WaitForResult()); 168 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
164 } 169 }
165 170
166 TEST_F(WebSocketTransportClientSocketPoolTest, InitConnectionFailure) { 171 TEST_F(WebSocketTransportClientSocketPoolTest, InitConnectionFailure) {
167 client_socket_factory_.set_default_client_socket_type( 172 client_socket_factory_.set_default_client_socket_type(
168 MockTransportClientSocketFactory::MOCK_FAILING_CLIENT_SOCKET); 173 MockTransportClientSocketFactory::MOCK_FAILING_CLIENT_SOCKET);
169 TestCompletionCallback callback; 174 TestCompletionCallback callback;
170 ClientSocketHandle handle; 175 ClientSocketHandle handle;
171 EXPECT_EQ(ERR_IO_PENDING, 176 EXPECT_EQ(ERR_IO_PENDING,
172 handle.Init("a", params_, kDefaultPriority, 177 handle.Init("a", params_, kDefaultPriority,
173 ClientSocketPool::RespectLimits::ENABLED, 178 ClientSocketPool::RespectLimits::ENABLED,
174 callback.callback(), &pool_, BoundNetLog())); 179 callback.callback(), &pool_, BoundNetLog()));
175 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); 180 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
176 181
177 // Make the host resolutions complete synchronously this time. 182 // Make the host resolutions complete synchronously this time.
178 host_resolver_->set_synchronous_mode(true); 183 host_resolver_->set_synchronous_mode(true);
179 EXPECT_EQ(ERR_CONNECTION_FAILED, 184 EXPECT_EQ(ERR_CONNECTION_FAILED,
180 handle.Init("a", params_, kDefaultPriority, 185 handle.Init("a", params_, kDefaultPriority,
181 ClientSocketPool::RespectLimits::ENABLED, 186 ClientSocketPool::RespectLimits::ENABLED,
182 callback.callback(), &pool_, BoundNetLog())); 187 callback.callback(), &pool_, BoundNetLog()));
183 } 188 }
184 189
185 TEST_F(WebSocketTransportClientSocketPoolTest, PendingRequestsFinishFifo) { 190 TEST_F(WebSocketTransportClientSocketPoolTest, PendingRequestsFinishFifo) {
186 // First request finishes asynchronously. 191 // First request finishes asynchronously.
187 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 192 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
188 EXPECT_EQ(OK, request(0)->WaitForResult()); 193 EXPECT_THAT(request(0)->WaitForResult(), IsOk());
189 194
190 // Make all subsequent host resolutions complete synchronously. 195 // Make all subsequent host resolutions complete synchronously.
191 host_resolver_->set_synchronous_mode(true); 196 host_resolver_->set_synchronous_mode(true);
192 197
193 // Rest of them wait for the first socket to be released. 198 // Rest of them wait for the first socket to be released.
194 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 199 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
195 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 200 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
196 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 201 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
197 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 202 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
198 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 203 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
199 204
200 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); 205 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
201 206
202 EXPECT_EQ(6, client_socket_factory_.allocation_count()); 207 EXPECT_EQ(6, client_socket_factory_.allocation_count());
203 208
204 // One initial asynchronous request and then 5 pending requests. 209 // One initial asynchronous request and then 5 pending requests.
205 EXPECT_EQ(6U, completion_count()); 210 EXPECT_EQ(6U, completion_count());
206 211
207 // The requests finish in FIFO order. 212 // The requests finish in FIFO order.
208 EXPECT_EQ(1, GetOrderOfRequest(1)); 213 EXPECT_EQ(1, GetOrderOfRequest(1));
209 EXPECT_EQ(2, GetOrderOfRequest(2)); 214 EXPECT_EQ(2, GetOrderOfRequest(2));
210 EXPECT_EQ(3, GetOrderOfRequest(3)); 215 EXPECT_EQ(3, GetOrderOfRequest(3));
211 EXPECT_EQ(4, GetOrderOfRequest(4)); 216 EXPECT_EQ(4, GetOrderOfRequest(4));
212 EXPECT_EQ(5, GetOrderOfRequest(5)); 217 EXPECT_EQ(5, GetOrderOfRequest(5));
213 EXPECT_EQ(6, GetOrderOfRequest(6)); 218 EXPECT_EQ(6, GetOrderOfRequest(6));
214 219
215 // Make sure we test order of all requests made. 220 // Make sure we test order of all requests made.
216 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(7)); 221 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(7));
217 } 222 }
218 223
219 TEST_F(WebSocketTransportClientSocketPoolTest, PendingRequests_NoKeepAlive) { 224 TEST_F(WebSocketTransportClientSocketPoolTest, PendingRequests_NoKeepAlive) {
220 // First request finishes asynchronously. 225 // First request finishes asynchronously.
221 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 226 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
222 EXPECT_EQ(OK, request(0)->WaitForResult()); 227 EXPECT_THAT(request(0)->WaitForResult(), IsOk());
223 228
224 // Make all subsequent host resolutions complete synchronously. 229 // Make all subsequent host resolutions complete synchronously.
225 host_resolver_->set_synchronous_mode(true); 230 host_resolver_->set_synchronous_mode(true);
226 231
227 // Rest of them wait for the first socket to be released. 232 // Rest of them wait for the first socket to be released.
228 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 233 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
229 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 234 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
230 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 235 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
231 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 236 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
232 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 237 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
233 238
234 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 239 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
235 240
236 // The pending requests should finish successfully. 241 // The pending requests should finish successfully.
237 EXPECT_EQ(OK, request(1)->WaitForResult()); 242 EXPECT_THAT(request(1)->WaitForResult(), IsOk());
238 EXPECT_EQ(OK, request(2)->WaitForResult()); 243 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
239 EXPECT_EQ(OK, request(3)->WaitForResult()); 244 EXPECT_THAT(request(3)->WaitForResult(), IsOk());
240 EXPECT_EQ(OK, request(4)->WaitForResult()); 245 EXPECT_THAT(request(4)->WaitForResult(), IsOk());
241 EXPECT_EQ(OK, request(5)->WaitForResult()); 246 EXPECT_THAT(request(5)->WaitForResult(), IsOk());
242 247
243 EXPECT_EQ(static_cast<int>(requests()->size()), 248 EXPECT_EQ(static_cast<int>(requests()->size()),
244 client_socket_factory_.allocation_count()); 249 client_socket_factory_.allocation_count());
245 250
246 // First asynchronous request, and then last 5 pending requests. 251 // First asynchronous request, and then last 5 pending requests.
247 EXPECT_EQ(6U, completion_count()); 252 EXPECT_EQ(6U, completion_count());
248 } 253 }
249 254
250 // This test will start up a RequestSocket() and then immediately Cancel() it. 255 // This test will start up a RequestSocket() and then immediately Cancel() it.
251 // The pending host resolution will eventually complete, and destroy the 256 // The pending host resolution will eventually complete, and destroy the
(...skipping 18 matching lines...) Expand all
270 handle.Init("a", params_, kDefaultPriority, 275 handle.Init("a", params_, kDefaultPriority,
271 ClientSocketPool::RespectLimits::ENABLED, 276 ClientSocketPool::RespectLimits::ENABLED,
272 callback.callback(), &pool_, BoundNetLog())); 277 callback.callback(), &pool_, BoundNetLog()));
273 EXPECT_EQ(ERR_IO_PENDING, 278 EXPECT_EQ(ERR_IO_PENDING,
274 handle2.Init("a", params_, kDefaultPriority, 279 handle2.Init("a", params_, kDefaultPriority,
275 ClientSocketPool::RespectLimits::ENABLED, 280 ClientSocketPool::RespectLimits::ENABLED,
276 callback2.callback(), &pool_, BoundNetLog())); 281 callback2.callback(), &pool_, BoundNetLog()));
277 282
278 handle.Reset(); 283 handle.Reset();
279 284
280 EXPECT_EQ(OK, callback2.WaitForResult()); 285 EXPECT_THAT(callback2.WaitForResult(), IsOk());
281 handle2.Reset(); 286 handle2.Reset();
282 } 287 }
283 288
284 TEST_F(WebSocketTransportClientSocketPoolTest, ConnectCancelConnect) { 289 TEST_F(WebSocketTransportClientSocketPoolTest, ConnectCancelConnect) {
285 client_socket_factory_.set_default_client_socket_type( 290 client_socket_factory_.set_default_client_socket_type(
286 MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET); 291 MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET);
287 ClientSocketHandle handle; 292 ClientSocketHandle handle;
288 TestCompletionCallback callback; 293 TestCompletionCallback callback;
289 EXPECT_EQ(ERR_IO_PENDING, 294 EXPECT_EQ(ERR_IO_PENDING,
290 handle.Init("a", params_, kDefaultPriority, 295 handle.Init("a", params_, kDefaultPriority,
(...skipping 11 matching lines...) Expand all
302 host_resolver_->set_synchronous_mode(true); 307 host_resolver_->set_synchronous_mode(true);
303 // At this point, handle has two ConnectingSockets out for it. Due to the 308 // At this point, handle has two ConnectingSockets out for it. Due to the
304 // setting the mock resolver into synchronous mode, the host resolution for 309 // setting the mock resolver into synchronous mode, the host resolution for
305 // both will return in the same loop of the MessageLoop. The client socket 310 // both will return in the same loop of the MessageLoop. The client socket
306 // is a pending socket, so the Connect() will asynchronously complete on the 311 // is a pending socket, so the Connect() will asynchronously complete on the
307 // next loop of the MessageLoop. That means that the first 312 // next loop of the MessageLoop. That means that the first
308 // ConnectingSocket will enter OnIOComplete, and then the second one will. 313 // ConnectingSocket will enter OnIOComplete, and then the second one will.
309 // If the first one is not cancelled, it will advance the load state, and 314 // If the first one is not cancelled, it will advance the load state, and
310 // then the second one will crash. 315 // then the second one will crash.
311 316
312 EXPECT_EQ(OK, callback2.WaitForResult()); 317 EXPECT_THAT(callback2.WaitForResult(), IsOk());
313 EXPECT_FALSE(callback.have_result()); 318 EXPECT_FALSE(callback.have_result());
314 319
315 handle.Reset(); 320 handle.Reset();
316 } 321 }
317 322
318 TEST_F(WebSocketTransportClientSocketPoolTest, CancelRequest) { 323 TEST_F(WebSocketTransportClientSocketPoolTest, CancelRequest) {
319 // First request finishes asynchronously. 324 // First request finishes asynchronously.
320 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 325 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
321 EXPECT_EQ(OK, request(0)->WaitForResult()); 326 EXPECT_THAT(request(0)->WaitForResult(), IsOk());
322 327
323 // Make all subsequent host resolutions complete synchronously. 328 // Make all subsequent host resolutions complete synchronously.
324 host_resolver_->set_synchronous_mode(true); 329 host_resolver_->set_synchronous_mode(true);
325 330
326 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 331 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
327 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 332 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
328 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 333 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
329 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 334 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
330 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 335 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
331 336
332 // Cancel a request. 337 // Cancel a request.
333 const size_t index_to_cancel = 2; 338 const size_t index_to_cancel = 2;
334 EXPECT_FALSE(request(index_to_cancel)->handle()->is_initialized()); 339 EXPECT_FALSE(request(index_to_cancel)->handle()->is_initialized());
335 request(index_to_cancel)->handle()->Reset(); 340 request(index_to_cancel)->handle()->Reset();
336 341
337 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); 342 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
338 343
339 EXPECT_EQ(5, client_socket_factory_.allocation_count()); 344 EXPECT_EQ(5, client_socket_factory_.allocation_count());
340 345
(...skipping 12 matching lines...) Expand all
353 // Function to be used as a callback on socket request completion. It first 358 // Function to be used as a callback on socket request completion. It first
354 // disconnects the successfully connected socket from the first request, and 359 // disconnects the successfully connected socket from the first request, and
355 // then reuses the ClientSocketHandle to request another socket. The second 360 // then reuses the ClientSocketHandle to request another socket. The second
356 // request is expected to succeed asynchronously. 361 // request is expected to succeed asynchronously.
357 // 362 //
358 // |nested_callback| is called with the result of the second socket request. 363 // |nested_callback| is called with the result of the second socket request.
359 void RequestSocketOnComplete(ClientSocketHandle* handle, 364 void RequestSocketOnComplete(ClientSocketHandle* handle,
360 WebSocketTransportClientSocketPool* pool, 365 WebSocketTransportClientSocketPool* pool,
361 const CompletionCallback& nested_callback, 366 const CompletionCallback& nested_callback,
362 int first_request_result) { 367 int first_request_result) {
363 EXPECT_EQ(OK, first_request_result); 368 EXPECT_THAT(first_request_result, IsOk());
364 369
365 // Don't allow reuse of the socket. Disconnect it and then release it. 370 // Don't allow reuse of the socket. Disconnect it and then release it.
366 handle->socket()->Disconnect(); 371 handle->socket()->Disconnect();
367 handle->Reset(); 372 handle->Reset();
368 373
369 scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( 374 scoped_refptr<TransportSocketParams> dest(new TransportSocketParams(
370 HostPortPair("www.google.com", 80), false, OnHostResolutionCallback(), 375 HostPortPair("www.google.com", 80), false, OnHostResolutionCallback(),
371 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); 376 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT));
372 int rv = 377 int rv =
373 handle->Init("a", dest, LOWEST, ClientSocketPool::RespectLimits::ENABLED, 378 handle->Init("a", dest, LOWEST, ClientSocketPool::RespectLimits::ENABLED,
374 nested_callback, pool, BoundNetLog()); 379 nested_callback, pool, BoundNetLog());
375 EXPECT_EQ(ERR_IO_PENDING, rv); 380 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
376 if (ERR_IO_PENDING != rv) 381 if (ERR_IO_PENDING != rv)
377 nested_callback.Run(rv); 382 nested_callback.Run(rv);
378 } 383 }
379 384
380 // Tests the case where a second socket is requested in a completion callback, 385 // Tests the case where a second socket is requested in a completion callback,
381 // and the second socket connects asynchronously. Reuses the same 386 // and the second socket connects asynchronously. Reuses the same
382 // ClientSocketHandle for the second socket, after disconnecting the first. 387 // ClientSocketHandle for the second socket, after disconnecting the first.
383 TEST_F(WebSocketTransportClientSocketPoolTest, RequestTwice) { 388 TEST_F(WebSocketTransportClientSocketPoolTest, RequestTwice) {
384 ClientSocketHandle handle; 389 ClientSocketHandle handle;
385 scoped_refptr<TransportSocketParams> dest( 390 scoped_refptr<TransportSocketParams> dest(
386 new TransportSocketParams( 391 new TransportSocketParams(
387 HostPortPair("www.google.com", 80), 392 HostPortPair("www.google.com", 80),
388 false, 393 false,
389 OnHostResolutionCallback(), 394 OnHostResolutionCallback(),
390 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); 395 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT));
391 TestCompletionCallback second_result_callback; 396 TestCompletionCallback second_result_callback;
392 int rv = 397 int rv =
393 handle.Init("a", dest, LOWEST, ClientSocketPool::RespectLimits::ENABLED, 398 handle.Init("a", dest, LOWEST, ClientSocketPool::RespectLimits::ENABLED,
394 base::Bind(&RequestSocketOnComplete, &handle, &pool_, 399 base::Bind(&RequestSocketOnComplete, &handle, &pool_,
395 second_result_callback.callback()), 400 second_result_callback.callback()),
396 &pool_, BoundNetLog()); 401 &pool_, BoundNetLog());
397 ASSERT_EQ(ERR_IO_PENDING, rv); 402 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
398 EXPECT_EQ(OK, second_result_callback.WaitForResult()); 403 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
399 404
400 handle.Reset(); 405 handle.Reset();
401 } 406 }
402 407
403 // Make sure that pending requests get serviced after active requests get 408 // Make sure that pending requests get serviced after active requests get
404 // cancelled. 409 // cancelled.
405 TEST_F(WebSocketTransportClientSocketPoolTest, 410 TEST_F(WebSocketTransportClientSocketPoolTest,
406 CancelActiveRequestWithPendingRequests) { 411 CancelActiveRequestWithPendingRequests) {
407 client_socket_factory_.set_default_client_socket_type( 412 client_socket_factory_.set_default_client_socket_type(
408 MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET); 413 MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET);
409 414
410 // Queue up all the requests 415 // Queue up all the requests
411 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 416 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
412 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 417 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
413 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 418 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
414 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 419 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
415 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 420 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
416 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 421 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
417 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 422 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
418 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 423 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
419 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 424 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
420 425
421 // Now, kMaxSocketsPerGroup requests should be active. Let's cancel them. 426 // Now, kMaxSocketsPerGroup requests should be active. Let's cancel them.
422 ASSERT_LE(kMaxSocketsPerGroup, static_cast<int>(requests()->size())); 427 ASSERT_LE(kMaxSocketsPerGroup, static_cast<int>(requests()->size()));
423 for (int i = 0; i < kMaxSocketsPerGroup; i++) 428 for (int i = 0; i < kMaxSocketsPerGroup; i++)
424 request(i)->handle()->Reset(); 429 request(i)->handle()->Reset();
425 430
426 // Let's wait for the rest to complete now. 431 // Let's wait for the rest to complete now.
427 for (size_t i = kMaxSocketsPerGroup; i < requests()->size(); ++i) { 432 for (size_t i = kMaxSocketsPerGroup; i < requests()->size(); ++i) {
428 EXPECT_EQ(OK, request(i)->WaitForResult()); 433 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
429 request(i)->handle()->Reset(); 434 request(i)->handle()->Reset();
430 } 435 }
431 436
432 EXPECT_EQ(requests()->size() - kMaxSocketsPerGroup, completion_count()); 437 EXPECT_EQ(requests()->size() - kMaxSocketsPerGroup, completion_count());
433 } 438 }
434 439
435 // Make sure that pending requests get serviced after active requests fail. 440 // Make sure that pending requests get serviced after active requests fail.
436 TEST_F(WebSocketTransportClientSocketPoolTest, 441 TEST_F(WebSocketTransportClientSocketPoolTest,
437 FailingActiveRequestWithPendingRequests) { 442 FailingActiveRequestWithPendingRequests) {
438 client_socket_factory_.set_default_client_socket_type( 443 client_socket_factory_.set_default_client_socket_type(
439 MockTransportClientSocketFactory::MOCK_PENDING_FAILING_CLIENT_SOCKET); 444 MockTransportClientSocketFactory::MOCK_PENDING_FAILING_CLIENT_SOCKET);
440 445
441 const int kNumRequests = 2 * kMaxSocketsPerGroup + 1; 446 const int kNumRequests = 2 * kMaxSocketsPerGroup + 1;
442 ASSERT_LE(kNumRequests, kMaxSockets); // Otherwise the test will hang. 447 ASSERT_LE(kNumRequests, kMaxSockets); // Otherwise the test will hang.
443 448
444 // Queue up all the requests 449 // Queue up all the requests
445 for (int i = 0; i < kNumRequests; i++) 450 for (int i = 0; i < kNumRequests; i++)
446 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 451 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
447 452
448 for (int i = 0; i < kNumRequests; i++) 453 for (int i = 0; i < kNumRequests; i++)
449 EXPECT_EQ(ERR_CONNECTION_FAILED, request(i)->WaitForResult()); 454 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
450 } 455 }
451 456
452 // The lock on the endpoint is released when a ClientSocketHandle is reset. 457 // The lock on the endpoint is released when a ClientSocketHandle is reset.
453 TEST_F(WebSocketTransportClientSocketPoolTest, LockReleasedOnHandleReset) { 458 TEST_F(WebSocketTransportClientSocketPoolTest, LockReleasedOnHandleReset) {
454 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 459 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
455 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 460 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
456 EXPECT_EQ(OK, request(0)->WaitForResult()); 461 EXPECT_THAT(request(0)->WaitForResult(), IsOk());
457 EXPECT_FALSE(request(1)->handle()->is_initialized()); 462 EXPECT_FALSE(request(1)->handle()->is_initialized());
458 request(0)->handle()->Reset(); 463 request(0)->handle()->Reset();
459 RunUntilIdle(); 464 RunUntilIdle();
460 EXPECT_TRUE(request(1)->handle()->is_initialized()); 465 EXPECT_TRUE(request(1)->handle()->is_initialized());
461 } 466 }
462 467
463 // The lock on the endpoint is released when a ClientSocketHandle is deleted. 468 // The lock on the endpoint is released when a ClientSocketHandle is deleted.
464 TEST_F(WebSocketTransportClientSocketPoolTest, LockReleasedOnHandleDelete) { 469 TEST_F(WebSocketTransportClientSocketPoolTest, LockReleasedOnHandleDelete) {
465 TestCompletionCallback callback; 470 TestCompletionCallback callback;
466 std::unique_ptr<ClientSocketHandle> handle(new ClientSocketHandle); 471 std::unique_ptr<ClientSocketHandle> handle(new ClientSocketHandle);
467 int rv = 472 int rv =
468 handle->Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, 473 handle->Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED,
469 callback.callback(), &pool_, BoundNetLog()); 474 callback.callback(), &pool_, BoundNetLog());
470 EXPECT_EQ(ERR_IO_PENDING, rv); 475 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
471 476
472 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 477 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
473 EXPECT_EQ(OK, callback.WaitForResult()); 478 EXPECT_THAT(callback.WaitForResult(), IsOk());
474 EXPECT_FALSE(request(0)->handle()->is_initialized()); 479 EXPECT_FALSE(request(0)->handle()->is_initialized());
475 handle.reset(); 480 handle.reset();
476 RunUntilIdle(); 481 RunUntilIdle();
477 EXPECT_TRUE(request(0)->handle()->is_initialized()); 482 EXPECT_TRUE(request(0)->handle()->is_initialized());
478 } 483 }
479 484
480 // A new connection is performed when the lock on the previous connection is 485 // A new connection is performed when the lock on the previous connection is
481 // explicitly released. 486 // explicitly released.
482 TEST_F(WebSocketTransportClientSocketPoolTest, 487 TEST_F(WebSocketTransportClientSocketPoolTest,
483 ConnectionProceedsOnExplicitRelease) { 488 ConnectionProceedsOnExplicitRelease) {
484 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 489 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
485 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 490 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
486 EXPECT_EQ(OK, request(0)->WaitForResult()); 491 EXPECT_THAT(request(0)->WaitForResult(), IsOk());
487 EXPECT_FALSE(request(1)->handle()->is_initialized()); 492 EXPECT_FALSE(request(1)->handle()->is_initialized());
488 WebSocketTransportClientSocketPool::UnlockEndpoint(request(0)->handle()); 493 WebSocketTransportClientSocketPool::UnlockEndpoint(request(0)->handle());
489 RunUntilIdle(); 494 RunUntilIdle();
490 EXPECT_TRUE(request(1)->handle()->is_initialized()); 495 EXPECT_TRUE(request(1)->handle()->is_initialized());
491 } 496 }
492 497
493 // A connection which is cancelled before completion does not block subsequent 498 // A connection which is cancelled before completion does not block subsequent
494 // connections. 499 // connections.
495 TEST_F(WebSocketTransportClientSocketPoolTest, 500 TEST_F(WebSocketTransportClientSocketPoolTest,
496 CancelDuringConnectionReleasesLock) { 501 CancelDuringConnectionReleasesLock) {
497 MockTransportClientSocketFactory::ClientSocketType case_types[] = { 502 MockTransportClientSocketFactory::ClientSocketType case_types[] = {
498 MockTransportClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET, 503 MockTransportClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET,
499 MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET}; 504 MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET};
500 505
501 client_socket_factory_.set_client_socket_types(case_types, 506 client_socket_factory_.set_client_socket_types(case_types,
502 arraysize(case_types)); 507 arraysize(case_types));
503 508
504 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 509 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
505 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 510 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
506 RunUntilIdle(); 511 RunUntilIdle();
507 pool_.CancelRequest("a", request(0)->handle()); 512 pool_.CancelRequest("a", request(0)->handle());
508 EXPECT_EQ(OK, request(1)->WaitForResult()); 513 EXPECT_THAT(request(1)->WaitForResult(), IsOk());
509 } 514 }
510 515
511 // Test the case of the IPv6 address stalling, and falling back to the IPv4 516 // Test the case of the IPv6 address stalling, and falling back to the IPv4
512 // socket which finishes first. 517 // socket which finishes first.
513 TEST_F(WebSocketTransportClientSocketPoolTest, 518 TEST_F(WebSocketTransportClientSocketPoolTest,
514 IPv6FallbackSocketIPv4FinishesFirst) { 519 IPv6FallbackSocketIPv4FinishesFirst) {
515 WebSocketTransportClientSocketPool pool(kMaxSockets, 520 WebSocketTransportClientSocketPool pool(kMaxSockets,
516 kMaxSocketsPerGroup, 521 kMaxSocketsPerGroup,
517 host_resolver_.get(), 522 host_resolver_.get(),
518 &client_socket_factory_, 523 &client_socket_factory_,
519 NULL); 524 NULL);
520 525
521 MockTransportClientSocketFactory::ClientSocketType case_types[] = { 526 MockTransportClientSocketFactory::ClientSocketType case_types[] = {
522 // This is the IPv6 socket. 527 // This is the IPv6 socket.
523 MockTransportClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET, 528 MockTransportClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET,
524 // This is the IPv4 socket. 529 // This is the IPv4 socket.
525 MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET}; 530 MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET};
526 531
527 client_socket_factory_.set_client_socket_types(case_types, 2); 532 client_socket_factory_.set_client_socket_types(case_types, 2);
528 533
529 // Resolve an AddressList with an IPv6 address first and then an IPv4 address. 534 // Resolve an AddressList with an IPv6 address first and then an IPv4 address.
530 host_resolver_->rules()->AddIPLiteralRule( 535 host_resolver_->rules()->AddIPLiteralRule(
531 "*", "2:abcd::3:4:ff,2.2.2.2", std::string()); 536 "*", "2:abcd::3:4:ff,2.2.2.2", std::string());
532 537
533 TestCompletionCallback callback; 538 TestCompletionCallback callback;
534 ClientSocketHandle handle; 539 ClientSocketHandle handle;
535 int rv = 540 int rv =
536 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, 541 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED,
537 callback.callback(), &pool, BoundNetLog()); 542 callback.callback(), &pool, BoundNetLog());
538 EXPECT_EQ(ERR_IO_PENDING, rv); 543 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
539 EXPECT_FALSE(handle.is_initialized()); 544 EXPECT_FALSE(handle.is_initialized());
540 EXPECT_FALSE(handle.socket()); 545 EXPECT_FALSE(handle.socket());
541 546
542 EXPECT_EQ(OK, callback.WaitForResult()); 547 EXPECT_THAT(callback.WaitForResult(), IsOk());
543 EXPECT_TRUE(handle.is_initialized()); 548 EXPECT_TRUE(handle.is_initialized());
544 EXPECT_TRUE(handle.socket()); 549 EXPECT_TRUE(handle.socket());
545 IPEndPoint endpoint; 550 IPEndPoint endpoint;
546 handle.socket()->GetLocalAddress(&endpoint); 551 handle.socket()->GetLocalAddress(&endpoint);
547 EXPECT_TRUE(endpoint.address().IsIPv4()); 552 EXPECT_TRUE(endpoint.address().IsIPv4());
548 EXPECT_EQ(2, client_socket_factory_.allocation_count()); 553 EXPECT_EQ(2, client_socket_factory_.allocation_count());
549 } 554 }
550 555
551 // Test the case of the IPv6 address being slow, thus falling back to trying to 556 // Test the case of the IPv6 address being slow, thus falling back to trying to
552 // connect to the IPv4 address, but having the connect to the IPv6 address 557 // connect to the IPv4 address, but having the connect to the IPv6 address
(...skipping 18 matching lines...) Expand all
571 576
572 // Resolve an AddressList with an IPv6 address first and then an IPv4 address. 577 // Resolve an AddressList with an IPv6 address first and then an IPv4 address.
573 host_resolver_->rules()->AddIPLiteralRule( 578 host_resolver_->rules()->AddIPLiteralRule(
574 "*", "2:abcd::3:4:ff,2.2.2.2", std::string()); 579 "*", "2:abcd::3:4:ff,2.2.2.2", std::string());
575 580
576 TestCompletionCallback callback; 581 TestCompletionCallback callback;
577 ClientSocketHandle handle; 582 ClientSocketHandle handle;
578 int rv = 583 int rv =
579 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, 584 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED,
580 callback.callback(), &pool, BoundNetLog()); 585 callback.callback(), &pool, BoundNetLog());
581 EXPECT_EQ(ERR_IO_PENDING, rv); 586 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
582 EXPECT_FALSE(handle.is_initialized()); 587 EXPECT_FALSE(handle.is_initialized());
583 EXPECT_FALSE(handle.socket()); 588 EXPECT_FALSE(handle.socket());
584 589
585 EXPECT_EQ(OK, callback.WaitForResult()); 590 EXPECT_THAT(callback.WaitForResult(), IsOk());
586 EXPECT_TRUE(handle.is_initialized()); 591 EXPECT_TRUE(handle.is_initialized());
587 EXPECT_TRUE(handle.socket()); 592 EXPECT_TRUE(handle.socket());
588 IPEndPoint endpoint; 593 IPEndPoint endpoint;
589 handle.socket()->GetLocalAddress(&endpoint); 594 handle.socket()->GetLocalAddress(&endpoint);
590 EXPECT_TRUE(endpoint.address().IsIPv6()); 595 EXPECT_TRUE(endpoint.address().IsIPv6());
591 EXPECT_EQ(2, client_socket_factory_.allocation_count()); 596 EXPECT_EQ(2, client_socket_factory_.allocation_count());
592 } 597 }
593 598
594 TEST_F(WebSocketTransportClientSocketPoolTest, 599 TEST_F(WebSocketTransportClientSocketPoolTest,
595 IPv6NoIPv4AddressesToFallbackTo) { 600 IPv6NoIPv4AddressesToFallbackTo) {
596 WebSocketTransportClientSocketPool pool(kMaxSockets, 601 WebSocketTransportClientSocketPool pool(kMaxSockets,
597 kMaxSocketsPerGroup, 602 kMaxSocketsPerGroup,
598 host_resolver_.get(), 603 host_resolver_.get(),
599 &client_socket_factory_, 604 &client_socket_factory_,
600 NULL); 605 NULL);
601 606
602 client_socket_factory_.set_default_client_socket_type( 607 client_socket_factory_.set_default_client_socket_type(
603 MockTransportClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET); 608 MockTransportClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET);
604 609
605 // Resolve an AddressList with only IPv6 addresses. 610 // Resolve an AddressList with only IPv6 addresses.
606 host_resolver_->rules()->AddIPLiteralRule( 611 host_resolver_->rules()->AddIPLiteralRule(
607 "*", "2:abcd::3:4:ff,3:abcd::3:4:ff", std::string()); 612 "*", "2:abcd::3:4:ff,3:abcd::3:4:ff", std::string());
608 613
609 TestCompletionCallback callback; 614 TestCompletionCallback callback;
610 ClientSocketHandle handle; 615 ClientSocketHandle handle;
611 int rv = 616 int rv =
612 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, 617 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED,
613 callback.callback(), &pool, BoundNetLog()); 618 callback.callback(), &pool, BoundNetLog());
614 EXPECT_EQ(ERR_IO_PENDING, rv); 619 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
615 EXPECT_FALSE(handle.is_initialized()); 620 EXPECT_FALSE(handle.is_initialized());
616 EXPECT_FALSE(handle.socket()); 621 EXPECT_FALSE(handle.socket());
617 622
618 EXPECT_EQ(OK, callback.WaitForResult()); 623 EXPECT_THAT(callback.WaitForResult(), IsOk());
619 EXPECT_TRUE(handle.is_initialized()); 624 EXPECT_TRUE(handle.is_initialized());
620 EXPECT_TRUE(handle.socket()); 625 EXPECT_TRUE(handle.socket());
621 IPEndPoint endpoint; 626 IPEndPoint endpoint;
622 handle.socket()->GetLocalAddress(&endpoint); 627 handle.socket()->GetLocalAddress(&endpoint);
623 EXPECT_TRUE(endpoint.address().IsIPv6()); 628 EXPECT_TRUE(endpoint.address().IsIPv6());
624 EXPECT_EQ(1, client_socket_factory_.allocation_count()); 629 EXPECT_EQ(1, client_socket_factory_.allocation_count());
625 } 630 }
626 631
627 TEST_F(WebSocketTransportClientSocketPoolTest, IPv4HasNoFallback) { 632 TEST_F(WebSocketTransportClientSocketPoolTest, IPv4HasNoFallback) {
628 WebSocketTransportClientSocketPool pool(kMaxSockets, 633 WebSocketTransportClientSocketPool pool(kMaxSockets,
629 kMaxSocketsPerGroup, 634 kMaxSocketsPerGroup,
630 host_resolver_.get(), 635 host_resolver_.get(),
631 &client_socket_factory_, 636 &client_socket_factory_,
632 NULL); 637 NULL);
633 638
634 client_socket_factory_.set_default_client_socket_type( 639 client_socket_factory_.set_default_client_socket_type(
635 MockTransportClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET); 640 MockTransportClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET);
636 641
637 // Resolve an AddressList with only IPv4 addresses. 642 // Resolve an AddressList with only IPv4 addresses.
638 host_resolver_->rules()->AddIPLiteralRule("*", "1.1.1.1", std::string()); 643 host_resolver_->rules()->AddIPLiteralRule("*", "1.1.1.1", std::string());
639 644
640 TestCompletionCallback callback; 645 TestCompletionCallback callback;
641 ClientSocketHandle handle; 646 ClientSocketHandle handle;
642 int rv = 647 int rv =
643 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, 648 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED,
644 callback.callback(), &pool, BoundNetLog()); 649 callback.callback(), &pool, BoundNetLog());
645 EXPECT_EQ(ERR_IO_PENDING, rv); 650 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
646 EXPECT_FALSE(handle.is_initialized()); 651 EXPECT_FALSE(handle.is_initialized());
647 EXPECT_FALSE(handle.socket()); 652 EXPECT_FALSE(handle.socket());
648 653
649 EXPECT_EQ(OK, callback.WaitForResult()); 654 EXPECT_THAT(callback.WaitForResult(), IsOk());
650 EXPECT_TRUE(handle.is_initialized()); 655 EXPECT_TRUE(handle.is_initialized());
651 EXPECT_TRUE(handle.socket()); 656 EXPECT_TRUE(handle.socket());
652 IPEndPoint endpoint; 657 IPEndPoint endpoint;
653 handle.socket()->GetLocalAddress(&endpoint); 658 handle.socket()->GetLocalAddress(&endpoint);
654 EXPECT_TRUE(endpoint.address().IsIPv4()); 659 EXPECT_TRUE(endpoint.address().IsIPv4());
655 EXPECT_EQ(1, client_socket_factory_.allocation_count()); 660 EXPECT_EQ(1, client_socket_factory_.allocation_count());
656 } 661 }
657 662
658 // If all IPv6 addresses fail to connect synchronously, then IPv4 connections 663 // If all IPv6 addresses fail to connect synchronously, then IPv4 connections
659 // proceeed immediately. 664 // proceeed immediately.
(...skipping 17 matching lines...) Expand all
677 682
678 // Resolve an AddressList with two IPv6 addresses and then an IPv4 address. 683 // Resolve an AddressList with two IPv6 addresses and then an IPv4 address.
679 host_resolver_->rules()->AddIPLiteralRule( 684 host_resolver_->rules()->AddIPLiteralRule(
680 "*", "2:abcd::3:4:ff,2:abcd::3:5:ff,2.2.2.2", std::string()); 685 "*", "2:abcd::3:4:ff,2:abcd::3:5:ff,2.2.2.2", std::string());
681 host_resolver_->set_synchronous_mode(true); 686 host_resolver_->set_synchronous_mode(true);
682 TestCompletionCallback callback; 687 TestCompletionCallback callback;
683 ClientSocketHandle handle; 688 ClientSocketHandle handle;
684 int rv = 689 int rv =
685 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, 690 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED,
686 callback.callback(), &pool, BoundNetLog()); 691 callback.callback(), &pool, BoundNetLog());
687 EXPECT_EQ(OK, rv); 692 EXPECT_THAT(rv, IsOk());
688 ASSERT_TRUE(handle.socket()); 693 ASSERT_TRUE(handle.socket());
689 694
690 IPEndPoint endpoint; 695 IPEndPoint endpoint;
691 handle.socket()->GetPeerAddress(&endpoint); 696 handle.socket()->GetPeerAddress(&endpoint);
692 EXPECT_EQ("2.2.2.2", endpoint.ToStringWithoutPort()); 697 EXPECT_EQ("2.2.2.2", endpoint.ToStringWithoutPort());
693 } 698 }
694 699
695 // If all IPv6 addresses fail before the IPv4 fallback timeout, then the IPv4 700 // If all IPv6 addresses fail before the IPv4 fallback timeout, then the IPv4
696 // connections proceed immediately. 701 // connections proceed immediately.
697 TEST_F(WebSocketTransportClientSocketPoolTest, IPv6RapidFail) { 702 TEST_F(WebSocketTransportClientSocketPoolTest, IPv6RapidFail) {
(...skipping 16 matching lines...) Expand all
714 719
715 // Resolve an AddressList with two IPv6 addresses and then an IPv4 address. 720 // Resolve an AddressList with two IPv6 addresses and then an IPv4 address.
716 host_resolver_->rules()->AddIPLiteralRule( 721 host_resolver_->rules()->AddIPLiteralRule(
717 "*", "2:abcd::3:4:ff,2:abcd::3:5:ff,2.2.2.2", std::string()); 722 "*", "2:abcd::3:4:ff,2:abcd::3:5:ff,2.2.2.2", std::string());
718 723
719 TestCompletionCallback callback; 724 TestCompletionCallback callback;
720 ClientSocketHandle handle; 725 ClientSocketHandle handle;
721 int rv = 726 int rv =
722 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, 727 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED,
723 callback.callback(), &pool, BoundNetLog()); 728 callback.callback(), &pool, BoundNetLog());
724 EXPECT_EQ(ERR_IO_PENDING, rv); 729 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
725 EXPECT_FALSE(handle.socket()); 730 EXPECT_FALSE(handle.socket());
726 731
727 base::TimeTicks start(base::TimeTicks::Now()); 732 base::TimeTicks start(base::TimeTicks::Now());
728 EXPECT_EQ(OK, callback.WaitForResult()); 733 EXPECT_THAT(callback.WaitForResult(), IsOk());
729 EXPECT_LT(base::TimeTicks::Now() - start, 734 EXPECT_LT(base::TimeTicks::Now() - start,
730 base::TimeDelta::FromMilliseconds( 735 base::TimeDelta::FromMilliseconds(
731 TransportConnectJob::kIPv6FallbackTimerInMs)); 736 TransportConnectJob::kIPv6FallbackTimerInMs));
732 ASSERT_TRUE(handle.socket()); 737 ASSERT_TRUE(handle.socket());
733 738
734 IPEndPoint endpoint; 739 IPEndPoint endpoint;
735 handle.socket()->GetPeerAddress(&endpoint); 740 handle.socket()->GetPeerAddress(&endpoint);
736 EXPECT_EQ("2.2.2.2", endpoint.ToStringWithoutPort()); 741 EXPECT_EQ("2.2.2.2", endpoint.ToStringWithoutPort());
737 } 742 }
738 743
(...skipping 12 matching lines...) Expand all
751 756
752 // Resolve an AddressList with an IPv6 addresses and an IPv4 address. 757 // Resolve an AddressList with an IPv6 addresses and an IPv4 address.
753 host_resolver_->rules()->AddIPLiteralRule( 758 host_resolver_->rules()->AddIPLiteralRule(
754 "*", "2:abcd::3:4:ff,2.2.2.2", std::string()); 759 "*", "2:abcd::3:4:ff,2.2.2.2", std::string());
755 760
756 TestCompletionCallback callback; 761 TestCompletionCallback callback;
757 ClientSocketHandle handle; 762 ClientSocketHandle handle;
758 int rv = 763 int rv =
759 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, 764 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED,
760 callback.callback(), &pool, BoundNetLog()); 765 callback.callback(), &pool, BoundNetLog());
761 EXPECT_EQ(ERR_IO_PENDING, rv); 766 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
762 ASSERT_FALSE(handle.socket()); 767 ASSERT_FALSE(handle.socket());
763 768
764 base::Closure ipv6_connect_trigger = 769 base::Closure ipv6_connect_trigger =
765 client_socket_factory_.WaitForTriggerableSocketCreation(); 770 client_socket_factory_.WaitForTriggerableSocketCreation();
766 base::Closure ipv4_connect_trigger = 771 base::Closure ipv4_connect_trigger =
767 client_socket_factory_.WaitForTriggerableSocketCreation(); 772 client_socket_factory_.WaitForTriggerableSocketCreation();
768 773
769 ipv4_connect_trigger.Run(); 774 ipv4_connect_trigger.Run();
770 ipv6_connect_trigger.Run(); 775 ipv6_connect_trigger.Run();
771 776
772 EXPECT_EQ(OK, callback.WaitForResult()); 777 EXPECT_THAT(callback.WaitForResult(), IsOk());
773 ASSERT_TRUE(handle.socket()); 778 ASSERT_TRUE(handle.socket());
774 779
775 IPEndPoint endpoint; 780 IPEndPoint endpoint;
776 handle.socket()->GetPeerAddress(&endpoint); 781 handle.socket()->GetPeerAddress(&endpoint);
777 EXPECT_EQ("2.2.2.2", endpoint.ToStringWithoutPort()); 782 EXPECT_EQ("2.2.2.2", endpoint.ToStringWithoutPort());
778 } 783 }
779 784
780 // We should not report failure until all connections have failed. 785 // We should not report failure until all connections have failed.
781 TEST_F(WebSocketTransportClientSocketPoolTest, LastFailureWins) { 786 TEST_F(WebSocketTransportClientSocketPoolTest, LastFailureWins) {
782 WebSocketTransportClientSocketPool pool(kMaxSockets, 787 WebSocketTransportClientSocketPool pool(kMaxSockets,
(...skipping 21 matching lines...) Expand all
804 // After 300ms: Connect to 3:abcd::3:4:ff times out, IPv4 fallback starts 809 // After 300ms: Connect to 3:abcd::3:4:ff times out, IPv4 fallback starts
805 // After 400ms: Connect to 4:abcd::3:4:ff and 1.1.1.1 time out 810 // After 400ms: Connect to 4:abcd::3:4:ff and 1.1.1.1 time out
806 // After 500ms: Connect to 2.2.2.2 times out 811 // After 500ms: Connect to 2.2.2.2 times out
807 812
808 TestCompletionCallback callback; 813 TestCompletionCallback callback;
809 ClientSocketHandle handle; 814 ClientSocketHandle handle;
810 base::TimeTicks start(base::TimeTicks::Now()); 815 base::TimeTicks start(base::TimeTicks::Now());
811 int rv = 816 int rv =
812 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, 817 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED,
813 callback.callback(), &pool, BoundNetLog()); 818 callback.callback(), &pool, BoundNetLog());
814 EXPECT_EQ(ERR_IO_PENDING, rv); 819 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
815 820
816 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); 821 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
817 822
818 EXPECT_GE(base::TimeTicks::Now() - start, delay * 5); 823 EXPECT_GE(base::TimeTicks::Now() - start, delay * 5);
819 } 824 }
820 825
821 // Global timeout for all connects applies. This test is disabled by default 826 // Global timeout for all connects applies. This test is disabled by default
822 // because it takes 4 minutes. Run with --gtest_also_run_disabled_tests if you 827 // because it takes 4 minutes. Run with --gtest_also_run_disabled_tests if you
823 // want to run it. 828 // want to run it.
824 TEST_F(WebSocketTransportClientSocketPoolTest, DISABLED_OverallTimeoutApplies) { 829 TEST_F(WebSocketTransportClientSocketPoolTest, DISABLED_OverallTimeoutApplies) {
825 WebSocketTransportClientSocketPool pool(kMaxSockets, 830 WebSocketTransportClientSocketPool pool(kMaxSockets,
826 kMaxSocketsPerGroup, 831 kMaxSocketsPerGroup,
(...skipping 15 matching lines...) Expand all
842 "1.1.1.1,2.2.2.2,3.3.3.3," 847 "1.1.1.1,2.2.2.2,3.3.3.3,"
843 "4.4.4.4,5.5.5.5,6.6.6.6", 848 "4.4.4.4,5.5.5.5,6.6.6.6",
844 std::string()); 849 std::string());
845 850
846 TestCompletionCallback callback; 851 TestCompletionCallback callback;
847 ClientSocketHandle handle; 852 ClientSocketHandle handle;
848 853
849 int rv = 854 int rv =
850 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, 855 handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED,
851 callback.callback(), &pool, BoundNetLog()); 856 callback.callback(), &pool, BoundNetLog());
852 EXPECT_EQ(ERR_IO_PENDING, rv); 857 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
853 858
854 EXPECT_EQ(ERR_TIMED_OUT, callback.WaitForResult()); 859 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_TIMED_OUT));
855 } 860 }
856 861
857 TEST_F(WebSocketTransportClientSocketPoolTest, MaxSocketsEnforced) { 862 TEST_F(WebSocketTransportClientSocketPoolTest, MaxSocketsEnforced) {
858 host_resolver_->set_synchronous_mode(true); 863 host_resolver_->set_synchronous_mode(true);
859 for (int i = 0; i < kMaxSockets; ++i) { 864 for (int i = 0; i < kMaxSockets; ++i) {
860 ASSERT_EQ(OK, StartRequest("a", kDefaultPriority)); 865 ASSERT_THAT(StartRequest("a", kDefaultPriority), IsOk());
861 WebSocketTransportClientSocketPool::UnlockEndpoint(request(i)->handle()); 866 WebSocketTransportClientSocketPool::UnlockEndpoint(request(i)->handle());
862 RunUntilIdle(); 867 RunUntilIdle();
863 } 868 }
864 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 869 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
865 } 870 }
866 871
867 TEST_F(WebSocketTransportClientSocketPoolTest, MaxSocketsEnforcedWhenPending) { 872 TEST_F(WebSocketTransportClientSocketPoolTest, MaxSocketsEnforcedWhenPending) {
868 for (int i = 0; i < kMaxSockets + 1; ++i) { 873 for (int i = 0; i < kMaxSockets + 1; ++i) {
869 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 874 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
870 } 875 }
871 // Now there are 32 sockets waiting to connect, and one stalled. 876 // Now there are 32 sockets waiting to connect, and one stalled.
872 for (int i = 0; i < kMaxSockets; ++i) { 877 for (int i = 0; i < kMaxSockets; ++i) {
873 RunUntilIdle(); 878 RunUntilIdle();
874 EXPECT_TRUE(request(i)->handle()->is_initialized()); 879 EXPECT_TRUE(request(i)->handle()->is_initialized());
875 EXPECT_TRUE(request(i)->handle()->socket()); 880 EXPECT_TRUE(request(i)->handle()->socket());
876 WebSocketTransportClientSocketPool::UnlockEndpoint(request(i)->handle()); 881 WebSocketTransportClientSocketPool::UnlockEndpoint(request(i)->handle());
877 } 882 }
878 // Now there are 32 sockets connected, and one stalled. 883 // Now there are 32 sockets connected, and one stalled.
879 RunUntilIdle(); 884 RunUntilIdle();
880 EXPECT_FALSE(request(kMaxSockets)->handle()->is_initialized()); 885 EXPECT_FALSE(request(kMaxSockets)->handle()->is_initialized());
881 EXPECT_FALSE(request(kMaxSockets)->handle()->socket()); 886 EXPECT_FALSE(request(kMaxSockets)->handle()->socket());
882 } 887 }
883 888
884 TEST_F(WebSocketTransportClientSocketPoolTest, StalledSocketReleased) { 889 TEST_F(WebSocketTransportClientSocketPoolTest, StalledSocketReleased) {
885 host_resolver_->set_synchronous_mode(true); 890 host_resolver_->set_synchronous_mode(true);
886 for (int i = 0; i < kMaxSockets; ++i) { 891 for (int i = 0; i < kMaxSockets; ++i) {
887 ASSERT_EQ(OK, StartRequest("a", kDefaultPriority)); 892 ASSERT_THAT(StartRequest("a", kDefaultPriority), IsOk());
888 WebSocketTransportClientSocketPool::UnlockEndpoint(request(i)->handle()); 893 WebSocketTransportClientSocketPool::UnlockEndpoint(request(i)->handle());
889 RunUntilIdle(); 894 RunUntilIdle();
890 } 895 }
891 896
892 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 897 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
893 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE); 898 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
894 EXPECT_TRUE(request(kMaxSockets)->handle()->is_initialized()); 899 EXPECT_TRUE(request(kMaxSockets)->handle()->is_initialized());
895 EXPECT_TRUE(request(kMaxSockets)->handle()->socket()); 900 EXPECT_TRUE(request(kMaxSockets)->handle()->socket());
896 } 901 }
897 902
898 TEST_F(WebSocketTransportClientSocketPoolTest, IsStalledTrueWhenStalled) { 903 TEST_F(WebSocketTransportClientSocketPoolTest, IsStalledTrueWhenStalled) {
899 for (int i = 0; i < kMaxSockets + 1; ++i) { 904 for (int i = 0; i < kMaxSockets + 1; ++i) {
900 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 905 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
901 } 906 }
902 EXPECT_EQ(OK, request(0)->WaitForResult()); 907 EXPECT_THAT(request(0)->WaitForResult(), IsOk());
903 EXPECT_TRUE(pool_.IsStalled()); 908 EXPECT_TRUE(pool_.IsStalled());
904 } 909 }
905 910
906 TEST_F(WebSocketTransportClientSocketPoolTest, 911 TEST_F(WebSocketTransportClientSocketPoolTest,
907 CancellingPendingSocketUnstallsStalledSocket) { 912 CancellingPendingSocketUnstallsStalledSocket) {
908 for (int i = 0; i < kMaxSockets + 1; ++i) { 913 for (int i = 0; i < kMaxSockets + 1; ++i) {
909 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 914 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
910 } 915 }
911 EXPECT_EQ(OK, request(0)->WaitForResult()); 916 EXPECT_THAT(request(0)->WaitForResult(), IsOk());
912 request(1)->handle()->Reset(); 917 request(1)->handle()->Reset();
913 RunUntilIdle(); 918 RunUntilIdle();
914 EXPECT_FALSE(pool_.IsStalled()); 919 EXPECT_FALSE(pool_.IsStalled());
915 } 920 }
916 921
917 TEST_F(WebSocketTransportClientSocketPoolTest, 922 TEST_F(WebSocketTransportClientSocketPoolTest,
918 LoadStateOfStalledSocketIsWaitingForAvailableSocket) { 923 LoadStateOfStalledSocketIsWaitingForAvailableSocket) {
919 for (int i = 0; i < kMaxSockets + 1; ++i) { 924 for (int i = 0; i < kMaxSockets + 1; ++i) {
920 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 925 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
921 } 926 }
922 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, 927 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET,
923 pool_.GetLoadState("a", request(kMaxSockets)->handle())); 928 pool_.GetLoadState("a", request(kMaxSockets)->handle()));
924 } 929 }
925 930
926 TEST_F(WebSocketTransportClientSocketPoolTest, 931 TEST_F(WebSocketTransportClientSocketPoolTest,
927 CancellingStalledSocketUnstallsPool) { 932 CancellingStalledSocketUnstallsPool) {
928 for (int i = 0; i < kMaxSockets + 1; ++i) { 933 for (int i = 0; i < kMaxSockets + 1; ++i) {
929 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 934 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
930 } 935 }
931 request(kMaxSockets)->handle()->Reset(); 936 request(kMaxSockets)->handle()->Reset();
932 RunUntilIdle(); 937 RunUntilIdle();
933 EXPECT_FALSE(pool_.IsStalled()); 938 EXPECT_FALSE(pool_.IsStalled());
934 } 939 }
935 940
936 TEST_F(WebSocketTransportClientSocketPoolTest, 941 TEST_F(WebSocketTransportClientSocketPoolTest,
937 FlushWithErrorFlushesPendingConnections) { 942 FlushWithErrorFlushesPendingConnections) {
938 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 943 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
939 pool_.FlushWithError(ERR_FAILED); 944 pool_.FlushWithError(ERR_FAILED);
940 EXPECT_EQ(ERR_FAILED, request(0)->WaitForResult()); 945 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_FAILED));
941 } 946 }
942 947
943 TEST_F(WebSocketTransportClientSocketPoolTest, 948 TEST_F(WebSocketTransportClientSocketPoolTest,
944 FlushWithErrorFlushesStalledConnections) { 949 FlushWithErrorFlushesStalledConnections) {
945 for (int i = 0; i < kMaxSockets + 1; ++i) { 950 for (int i = 0; i < kMaxSockets + 1; ++i) {
946 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 951 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
947 } 952 }
948 pool_.FlushWithError(ERR_FAILED); 953 pool_.FlushWithError(ERR_FAILED);
949 EXPECT_EQ(ERR_FAILED, request(kMaxSockets)->WaitForResult()); 954 EXPECT_THAT(request(kMaxSockets)->WaitForResult(), IsError(ERR_FAILED));
950 } 955 }
951 956
952 TEST_F(WebSocketTransportClientSocketPoolTest, 957 TEST_F(WebSocketTransportClientSocketPoolTest,
953 AfterFlushWithErrorCanMakeNewConnections) { 958 AfterFlushWithErrorCanMakeNewConnections) {
954 for (int i = 0; i < kMaxSockets + 1; ++i) { 959 for (int i = 0; i < kMaxSockets + 1; ++i) {
955 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 960 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
956 } 961 }
957 pool_.FlushWithError(ERR_FAILED); 962 pool_.FlushWithError(ERR_FAILED);
958 host_resolver_->set_synchronous_mode(true); 963 host_resolver_->set_synchronous_mode(true);
959 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 964 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsOk());
960 } 965 }
961 966
962 // Deleting pending connections can release the lock on the endpoint, which can 967 // Deleting pending connections can release the lock on the endpoint, which can
963 // in principle lead to other pending connections succeeding. However, when we 968 // in principle lead to other pending connections succeeding. However, when we
964 // call FlushWithError(), everything should fail. 969 // call FlushWithError(), everything should fail.
965 TEST_F(WebSocketTransportClientSocketPoolTest, 970 TEST_F(WebSocketTransportClientSocketPoolTest,
966 FlushWithErrorDoesNotCauseSuccessfulConnections) { 971 FlushWithErrorDoesNotCauseSuccessfulConnections) {
967 host_resolver_->set_synchronous_mode(true); 972 host_resolver_->set_synchronous_mode(true);
968 MockTransportClientSocketFactory::ClientSocketType first_type[] = { 973 MockTransportClientSocketFactory::ClientSocketType first_type[] = {
969 // First socket 974 // First socket
970 MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET 975 MockTransportClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET
971 }; 976 };
972 client_socket_factory_.set_client_socket_types(first_type, 977 client_socket_factory_.set_client_socket_types(first_type,
973 arraysize(first_type)); 978 arraysize(first_type));
974 // The rest of the sockets will connect synchronously. 979 // The rest of the sockets will connect synchronously.
975 client_socket_factory_.set_default_client_socket_type( 980 client_socket_factory_.set_default_client_socket_type(
976 MockTransportClientSocketFactory::MOCK_CLIENT_SOCKET); 981 MockTransportClientSocketFactory::MOCK_CLIENT_SOCKET);
977 for (int i = 0; i < kMaxSockets; ++i) { 982 for (int i = 0; i < kMaxSockets; ++i) {
978 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 983 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
979 } 984 }
980 // Now we have one socket in STATE_TRANSPORT_CONNECT and the rest in 985 // Now we have one socket in STATE_TRANSPORT_CONNECT and the rest in
981 // STATE_OBTAIN_LOCK. If any of the sockets in STATE_OBTAIN_LOCK is given the 986 // STATE_OBTAIN_LOCK. If any of the sockets in STATE_OBTAIN_LOCK is given the
982 // lock, they will synchronously connect. 987 // lock, they will synchronously connect.
983 pool_.FlushWithError(ERR_FAILED); 988 pool_.FlushWithError(ERR_FAILED);
984 for (int i = 0; i < kMaxSockets; ++i) { 989 for (int i = 0; i < kMaxSockets; ++i) {
985 EXPECT_EQ(ERR_FAILED, request(i)->WaitForResult()); 990 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_FAILED));
986 } 991 }
987 } 992 }
988 993
989 // This is a regression test for the first attempted fix for 994 // This is a regression test for the first attempted fix for
990 // FlushWithErrorDoesNotCauseSuccessfulConnections. Because a ConnectJob can 995 // FlushWithErrorDoesNotCauseSuccessfulConnections. Because a ConnectJob can
991 // have both IPv4 and IPv6 subjobs, it can be both connecting and waiting for 996 // have both IPv4 and IPv6 subjobs, it can be both connecting and waiting for
992 // the lock at the same time. 997 // the lock at the same time.
993 TEST_F(WebSocketTransportClientSocketPoolTest, 998 TEST_F(WebSocketTransportClientSocketPoolTest,
994 FlushWithErrorDoesNotCauseSuccessfulConnectionsMultipleAddressTypes) { 999 FlushWithErrorDoesNotCauseSuccessfulConnectionsMultipleAddressTypes) {
995 host_resolver_->set_synchronous_mode(true); 1000 host_resolver_->set_synchronous_mode(true);
(...skipping 11 matching lines...) Expand all
1007 host_resolver_->rules()->ClearRules(); 1012 host_resolver_->rules()->ClearRules();
1008 // Each connect job has a different IPv6 address but the same IPv4 address. 1013 // Each connect job has a different IPv6 address but the same IPv4 address.
1009 // So the IPv6 connections happen in parallel but the IPv4 ones are 1014 // So the IPv6 connections happen in parallel but the IPv4 ones are
1010 // serialised. 1015 // serialised.
1011 host_resolver_->rules()->AddIPLiteralRule("*", 1016 host_resolver_->rules()->AddIPLiteralRule("*",
1012 base::StringPrintf( 1017 base::StringPrintf(
1013 "%x:abcd::3:4:ff," 1018 "%x:abcd::3:4:ff,"
1014 "1.1.1.1", 1019 "1.1.1.1",
1015 i + 1), 1020 i + 1),
1016 std::string()); 1021 std::string());
1017 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1022 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
1018 } 1023 }
1019 // Now we have |kMaxSockets| IPv6 sockets stalled in connect. No IPv4 sockets 1024 // Now we have |kMaxSockets| IPv6 sockets stalled in connect. No IPv4 sockets
1020 // are started yet. 1025 // are started yet.
1021 RunLoopForTimePeriod(base::TimeDelta::FromMilliseconds( 1026 RunLoopForTimePeriod(base::TimeDelta::FromMilliseconds(
1022 TransportConnectJob::kIPv6FallbackTimerInMs)); 1027 TransportConnectJob::kIPv6FallbackTimerInMs));
1023 // Now we have |kMaxSockets| IPv6 sockets and one IPv4 socket stalled in 1028 // Now we have |kMaxSockets| IPv6 sockets and one IPv4 socket stalled in
1024 // connect, and |kMaxSockets - 1| IPv4 sockets waiting for the endpoint lock. 1029 // connect, and |kMaxSockets - 1| IPv4 sockets waiting for the endpoint lock.
1025 pool_.FlushWithError(ERR_FAILED); 1030 pool_.FlushWithError(ERR_FAILED);
1026 for (int i = 0; i < kMaxSockets; ++i) { 1031 for (int i = 0; i < kMaxSockets; ++i) {
1027 EXPECT_EQ(ERR_FAILED, request(i)->WaitForResult()); 1032 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_FAILED));
1028 } 1033 }
1029 } 1034 }
1030 1035
1031 // Sockets that have had ownership transferred to a ClientSocketHandle should 1036 // Sockets that have had ownership transferred to a ClientSocketHandle should
1032 // not be affected by FlushWithError. 1037 // not be affected by FlushWithError.
1033 TEST_F(WebSocketTransportClientSocketPoolTest, 1038 TEST_F(WebSocketTransportClientSocketPoolTest,
1034 FlushWithErrorDoesNotAffectHandedOutSockets) { 1039 FlushWithErrorDoesNotAffectHandedOutSockets) {
1035 host_resolver_->set_synchronous_mode(true); 1040 host_resolver_->set_synchronous_mode(true);
1036 MockTransportClientSocketFactory::ClientSocketType socket_types[] = { 1041 MockTransportClientSocketFactory::ClientSocketType socket_types[] = {
1037 MockTransportClientSocketFactory::MOCK_CLIENT_SOCKET, 1042 MockTransportClientSocketFactory::MOCK_CLIENT_SOCKET,
1038 MockTransportClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET}; 1043 MockTransportClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET};
1039 client_socket_factory_.set_client_socket_types(socket_types, 1044 client_socket_factory_.set_client_socket_types(socket_types,
1040 arraysize(socket_types)); 1045 arraysize(socket_types));
1041 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1046 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsOk());
1042 // Socket has been "handed out". 1047 // Socket has been "handed out".
1043 EXPECT_TRUE(request(0)->handle()->socket()); 1048 EXPECT_TRUE(request(0)->handle()->socket());
1044 1049
1045 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1050 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
1046 // Now we have one socket handed out, and one pending. 1051 // Now we have one socket handed out, and one pending.
1047 pool_.FlushWithError(ERR_FAILED); 1052 pool_.FlushWithError(ERR_FAILED);
1048 EXPECT_EQ(ERR_FAILED, request(1)->WaitForResult()); 1053 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_FAILED));
1049 // Socket owned by ClientSocketHandle is unaffected: 1054 // Socket owned by ClientSocketHandle is unaffected:
1050 EXPECT_TRUE(request(0)->handle()->socket()); 1055 EXPECT_TRUE(request(0)->handle()->socket());
1051 // Return it to the pool (which deletes it). 1056 // Return it to the pool (which deletes it).
1052 request(0)->handle()->Reset(); 1057 request(0)->handle()->Reset();
1053 } 1058 }
1054 1059
1055 // Sockets should not be leaked if CancelRequest() is called in between 1060 // Sockets should not be leaked if CancelRequest() is called in between
1056 // SetSocket() being called on the ClientSocketHandle and InvokeUserCallback(). 1061 // SetSocket() being called on the ClientSocketHandle and InvokeUserCallback().
1057 TEST_F(WebSocketTransportClientSocketPoolTest, CancelRequestReclaimsSockets) { 1062 TEST_F(WebSocketTransportClientSocketPoolTest, CancelRequestReclaimsSockets) {
1058 host_resolver_->set_synchronous_mode(true); 1063 host_resolver_->set_synchronous_mode(true);
1059 MockTransportClientSocketFactory::ClientSocketType socket_types[] = { 1064 MockTransportClientSocketFactory::ClientSocketType socket_types[] = {
1060 MockTransportClientSocketFactory::MOCK_TRIGGERABLE_CLIENT_SOCKET, 1065 MockTransportClientSocketFactory::MOCK_TRIGGERABLE_CLIENT_SOCKET,
1061 MockTransportClientSocketFactory::MOCK_CLIENT_SOCKET}; 1066 MockTransportClientSocketFactory::MOCK_CLIENT_SOCKET};
1062 1067
1063 client_socket_factory_.set_client_socket_types(socket_types, 1068 client_socket_factory_.set_client_socket_types(socket_types,
1064 arraysize(socket_types)); 1069 arraysize(socket_types));
1065 1070
1066 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1071 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
1067 1072
1068 base::Closure connect_trigger = 1073 base::Closure connect_trigger =
1069 client_socket_factory_.WaitForTriggerableSocketCreation(); 1074 client_socket_factory_.WaitForTriggerableSocketCreation();
1070 1075
1071 connect_trigger.Run(); // Calls InvokeUserCallbackLater() 1076 connect_trigger.Run(); // Calls InvokeUserCallbackLater()
1072 1077
1073 request(0)->handle()->Reset(); // calls CancelRequest() 1078 request(0)->handle()->Reset(); // calls CancelRequest()
1074 1079
1075 RunUntilIdle(); 1080 RunUntilIdle();
1076 // We should now be able to create a new connection without blocking on the 1081 // We should now be able to create a new connection without blocking on the
1077 // endpoint lock. 1082 // endpoint lock.
1078 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1083 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsOk());
1079 } 1084 }
1080 1085
1081 // A handshake completing and then the WebSocket closing should only release one 1086 // A handshake completing and then the WebSocket closing should only release one
1082 // Endpoint, not two. 1087 // Endpoint, not two.
1083 TEST_F(WebSocketTransportClientSocketPoolTest, EndpointLockIsOnlyReleasedOnce) { 1088 TEST_F(WebSocketTransportClientSocketPoolTest, EndpointLockIsOnlyReleasedOnce) {
1084 host_resolver_->set_synchronous_mode(true); 1089 host_resolver_->set_synchronous_mode(true);
1085 ASSERT_EQ(OK, StartRequest("a", kDefaultPriority)); 1090 ASSERT_THAT(StartRequest("a", kDefaultPriority), IsOk());
1086 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1091 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
1087 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1092 EXPECT_THAT(StartRequest("a", kDefaultPriority), IsError(ERR_IO_PENDING));
1088 // First socket completes handshake. 1093 // First socket completes handshake.
1089 WebSocketTransportClientSocketPool::UnlockEndpoint(request(0)->handle()); 1094 WebSocketTransportClientSocketPool::UnlockEndpoint(request(0)->handle());
1090 RunUntilIdle(); 1095 RunUntilIdle();
1091 // First socket is closed. 1096 // First socket is closed.
1092 request(0)->handle()->Reset(); 1097 request(0)->handle()->Reset();
1093 // Second socket should have been released. 1098 // Second socket should have been released.
1094 EXPECT_EQ(OK, request(1)->WaitForResult()); 1099 EXPECT_THAT(request(1)->WaitForResult(), IsOk());
1095 // Third socket should still be waiting for endpoint. 1100 // Third socket should still be waiting for endpoint.
1096 ASSERT_FALSE(request(2)->handle()->is_initialized()); 1101 ASSERT_FALSE(request(2)->handle()->is_initialized());
1097 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, 1102 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET,
1098 request(2)->handle()->GetLoadState()); 1103 request(2)->handle()->GetLoadState());
1099 } 1104 }
1100 1105
1101 } // namespace 1106 } // namespace
1102 1107
1103 } // namespace net 1108 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/websocket_endpoint_lock_manager_unittest.cc ('k') | net/spdy/bidirectional_stream_spdy_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698