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

Side by Side Diff: net/http/http_pipelined_network_transaction_unittest.cc

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 <string> 5 #include <string>
6 6
7 #include "base/memory/ref_counted.h" 7 #include "base/memory/ref_counted.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/memory/scoped_vector.h" 9 #include "base/memory/scoped_vector.h"
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 } 62 }
63 63
64 private: 64 private:
65 ProxyConfig config_; 65 ProxyConfig config_;
66 Observer* observer_; 66 Observer* observer_;
67 }; 67 };
68 68
69 class HttpPipelinedNetworkTransactionTest : public testing::Test { 69 class HttpPipelinedNetworkTransactionTest : public testing::Test {
70 public: 70 public:
71 HttpPipelinedNetworkTransactionTest() 71 HttpPipelinedNetworkTransactionTest()
72 : histograms_("a"), 72 : histograms_("a"), pool_(1, 1, &histograms_, &factory_) {}
73 pool_(1, 1, &histograms_, &factory_) {
74 }
75 73
76 void Initialize(bool force_http_pipelining) { 74 void Initialize(bool force_http_pipelining) {
77 // Normally, this code could just go in SetUp(). For a few of these tests, 75 // Normally, this code could just go in SetUp(). For a few of these tests,
78 // we change the default number of sockets per group. That needs to be done 76 // we change the default number of sockets per group. That needs to be done
79 // before we construct the HttpNetworkSession. 77 // before we construct the HttpNetworkSession.
80 proxy_config_service_ = new SimpleProxyConfigService(); 78 proxy_config_service_ = new SimpleProxyConfigService();
81 proxy_service_.reset(new ProxyService(proxy_config_service_, NULL, NULL)); 79 proxy_service_.reset(new ProxyService(proxy_config_service_, NULL, NULL));
82 ssl_config_ = new SSLConfigServiceDefaults; 80 ssl_config_ = new SSLConfigServiceDefaults;
83 auth_handler_factory_.reset(new HttpAuthHandlerMock::Factory()); 81 auth_handler_factory_.reset(new HttpAuthHandlerMock::Factory());
84 82
85 HttpNetworkSession::Params session_params; 83 HttpNetworkSession::Params session_params;
86 session_params.client_socket_factory = &factory_; 84 session_params.client_socket_factory = &factory_;
87 session_params.proxy_service = proxy_service_.get(); 85 session_params.proxy_service = proxy_service_.get();
88 session_params.host_resolver = &mock_resolver_; 86 session_params.host_resolver = &mock_resolver_;
89 session_params.ssl_config_service = ssl_config_.get(); 87 session_params.ssl_config_service = ssl_config_.get();
90 session_params.http_auth_handler_factory = auth_handler_factory_.get(); 88 session_params.http_auth_handler_factory = auth_handler_factory_.get();
91 session_params.http_server_properties = 89 session_params.http_server_properties =
92 http_server_properties_.GetWeakPtr(); 90 http_server_properties_.GetWeakPtr();
93 session_params.force_http_pipelining = force_http_pipelining; 91 session_params.force_http_pipelining = force_http_pipelining;
94 session_params.http_pipelining_enabled = true; 92 session_params.http_pipelining_enabled = true;
95 session_ = new HttpNetworkSession(session_params); 93 session_ = new HttpNetworkSession(session_params);
96 } 94 }
97 95
98 void AddExpectedConnection(MockRead* reads, size_t reads_count, 96 void AddExpectedConnection(MockRead* reads,
99 MockWrite* writes, size_t writes_count) { 97 size_t reads_count,
100 DeterministicSocketData* data = new DeterministicSocketData( 98 MockWrite* writes,
101 reads, reads_count, writes, writes_count); 99 size_t writes_count) {
100 DeterministicSocketData* data =
101 new DeterministicSocketData(reads, reads_count, writes, writes_count);
102 data->set_connect_data(MockConnect(SYNCHRONOUS, OK)); 102 data->set_connect_data(MockConnect(SYNCHRONOUS, OK));
103 if (reads_count || writes_count) { 103 if (reads_count || writes_count) {
104 data->StopAfter(reads_count + writes_count); 104 data->StopAfter(reads_count + writes_count);
105 } 105 }
106 factory_.AddSocketDataProvider(data); 106 factory_.AddSocketDataProvider(data);
107 data_vector_.push_back(data); 107 data_vector_.push_back(data);
108 } 108 }
109 109
110 enum RequestInfoOptions { 110 enum RequestInfoOptions {
111 REQUEST_DEFAULT, 111 REQUEST_DEFAULT,
112 REQUEST_MAIN_RESOURCE, 112 REQUEST_MAIN_RESOURCE,
113 }; 113 };
114 114
115 HttpRequestInfo* GetRequestInfo( 115 HttpRequestInfo* GetRequestInfo(
116 const char* filename, RequestInfoOptions options = REQUEST_DEFAULT) { 116 const char* filename,
117 RequestInfoOptions options = REQUEST_DEFAULT) {
117 std::string url = base::StringPrintf("http://localhost/%s", filename); 118 std::string url = base::StringPrintf("http://localhost/%s", filename);
118 HttpRequestInfo* request_info = new HttpRequestInfo; 119 HttpRequestInfo* request_info = new HttpRequestInfo;
119 request_info->url = GURL(url); 120 request_info->url = GURL(url);
120 request_info->method = "GET"; 121 request_info->method = "GET";
121 if (options == REQUEST_MAIN_RESOURCE) { 122 if (options == REQUEST_MAIN_RESOURCE) {
122 request_info->load_flags = LOAD_MAIN_FRAME; 123 request_info->load_flags = LOAD_MAIN_FRAME;
123 } 124 }
124 request_info_vector_.push_back(request_info); 125 request_info_vector_.push_back(request_info);
125 return request_info; 126 return request_info;
126 } 127 }
127 128
128 void ExpectResponse(const std::string& expected, 129 void ExpectResponse(const std::string& expected,
129 HttpNetworkTransaction& transaction, 130 HttpNetworkTransaction& transaction,
130 IoMode io_mode) { 131 IoMode io_mode) {
131 scoped_refptr<IOBuffer> buffer(new IOBuffer(expected.size())); 132 scoped_refptr<IOBuffer> buffer(new IOBuffer(expected.size()));
132 if (io_mode == ASYNC) { 133 if (io_mode == ASYNC) {
133 EXPECT_EQ(ERR_IO_PENDING, transaction.Read(buffer.get(), expected.size(), 134 EXPECT_EQ(ERR_IO_PENDING,
134 callback_.callback())); 135 transaction.Read(
136 buffer.get(), expected.size(), callback_.callback()));
135 data_vector_[0]->RunFor(1); 137 data_vector_[0]->RunFor(1);
136 EXPECT_EQ(static_cast<int>(expected.length()), callback_.WaitForResult()); 138 EXPECT_EQ(static_cast<int>(expected.length()), callback_.WaitForResult());
137 } else { 139 } else {
138 EXPECT_EQ(static_cast<int>(expected.size()), 140 EXPECT_EQ(static_cast<int>(expected.size()),
139 transaction.Read(buffer.get(), expected.size(), 141 transaction.Read(
140 callback_.callback())); 142 buffer.get(), expected.size(), callback_.callback()));
141 } 143 }
142 std::string actual(buffer->data(), expected.size()); 144 std::string actual(buffer->data(), expected.size());
143 EXPECT_THAT(actual, StrEq(expected)); 145 EXPECT_THAT(actual, StrEq(expected));
144 EXPECT_EQ(OK, transaction.Read(buffer.get(), expected.size(), 146 EXPECT_EQ(
145 callback_.callback())); 147 OK,
148 transaction.Read(buffer.get(), expected.size(), callback_.callback()));
146 } 149 }
147 150
148 void CompleteTwoRequests(int data_index, int stop_at_step) { 151 void CompleteTwoRequests(int data_index, int stop_at_step) {
149 scoped_ptr<HttpNetworkTransaction> one_transaction( 152 scoped_ptr<HttpNetworkTransaction> one_transaction(
150 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 153 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
151 TestCompletionCallback one_callback; 154 TestCompletionCallback one_callback;
152 EXPECT_EQ(ERR_IO_PENDING, 155 EXPECT_EQ(ERR_IO_PENDING,
153 one_transaction->Start(GetRequestInfo("one.html"), 156 one_transaction->Start(GetRequestInfo("one.html"),
154 one_callback.callback(), BoundNetLog())); 157 one_callback.callback(),
158 BoundNetLog()));
155 EXPECT_EQ(OK, one_callback.WaitForResult()); 159 EXPECT_EQ(OK, one_callback.WaitForResult());
156 160
157 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get()); 161 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
158 TestCompletionCallback two_callback; 162 TestCompletionCallback two_callback;
159 EXPECT_EQ(ERR_IO_PENDING, 163 EXPECT_EQ(ERR_IO_PENDING,
160 two_transaction.Start(GetRequestInfo("two.html"), 164 two_transaction.Start(GetRequestInfo("two.html"),
161 two_callback.callback(), BoundNetLog())); 165 two_callback.callback(),
166 BoundNetLog()));
162 167
163 TestCompletionCallback one_read_callback; 168 TestCompletionCallback one_read_callback;
164 scoped_refptr<IOBuffer> buffer(new IOBuffer(8)); 169 scoped_refptr<IOBuffer> buffer(new IOBuffer(8));
165 EXPECT_EQ(ERR_IO_PENDING, 170 EXPECT_EQ(
166 one_transaction->Read(buffer.get(), 8, 171 ERR_IO_PENDING,
167 one_read_callback.callback())); 172 one_transaction->Read(buffer.get(), 8, one_read_callback.callback()));
168 173
169 data_vector_[data_index]->SetStop(stop_at_step); 174 data_vector_[data_index]->SetStop(stop_at_step);
170 data_vector_[data_index]->Run(); 175 data_vector_[data_index]->Run();
171 EXPECT_EQ(8, one_read_callback.WaitForResult()); 176 EXPECT_EQ(8, one_read_callback.WaitForResult());
172 data_vector_[data_index]->SetStop(10); 177 data_vector_[data_index]->SetStop(10);
173 std::string actual(buffer->data(), 8); 178 std::string actual(buffer->data(), 8);
174 EXPECT_THAT(actual, StrEq("one.html")); 179 EXPECT_THAT(actual, StrEq("one.html"));
175 EXPECT_EQ(OK, one_transaction->Read(buffer.get(), 8, 180 EXPECT_EQ(
176 one_read_callback.callback())); 181 OK,
182 one_transaction->Read(buffer.get(), 8, one_read_callback.callback()));
177 183
178 EXPECT_EQ(OK, two_callback.WaitForResult()); 184 EXPECT_EQ(OK, two_callback.WaitForResult());
179 ExpectResponse("two.html", two_transaction, SYNCHRONOUS); 185 ExpectResponse("two.html", two_transaction, SYNCHRONOUS);
180 } 186 }
181 187
182 void CompleteFourRequests(RequestInfoOptions options) { 188 void CompleteFourRequests(RequestInfoOptions options) {
183 scoped_ptr<HttpNetworkTransaction> one_transaction( 189 scoped_ptr<HttpNetworkTransaction> one_transaction(
184 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 190 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
185 TestCompletionCallback one_callback; 191 TestCompletionCallback one_callback;
186 EXPECT_EQ(ERR_IO_PENDING, 192 EXPECT_EQ(ERR_IO_PENDING,
187 one_transaction->Start(GetRequestInfo("one.html", options), 193 one_transaction->Start(GetRequestInfo("one.html", options),
188 one_callback.callback(), BoundNetLog())); 194 one_callback.callback(),
195 BoundNetLog()));
189 EXPECT_EQ(OK, one_callback.WaitForResult()); 196 EXPECT_EQ(OK, one_callback.WaitForResult());
190 197
191 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get()); 198 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
192 TestCompletionCallback two_callback; 199 TestCompletionCallback two_callback;
193 EXPECT_EQ(ERR_IO_PENDING, 200 EXPECT_EQ(ERR_IO_PENDING,
194 two_transaction.Start(GetRequestInfo("two.html", options), 201 two_transaction.Start(GetRequestInfo("two.html", options),
195 two_callback.callback(), BoundNetLog())); 202 two_callback.callback(),
203 BoundNetLog()));
196 204
197 HttpNetworkTransaction three_transaction(DEFAULT_PRIORITY, session_.get()); 205 HttpNetworkTransaction three_transaction(DEFAULT_PRIORITY, session_.get());
198 TestCompletionCallback three_callback; 206 TestCompletionCallback three_callback;
199 EXPECT_EQ(ERR_IO_PENDING, 207 EXPECT_EQ(ERR_IO_PENDING,
200 three_transaction.Start(GetRequestInfo("three.html", options), 208 three_transaction.Start(GetRequestInfo("three.html", options),
201 three_callback.callback(), 209 three_callback.callback(),
202 BoundNetLog())); 210 BoundNetLog()));
203 211
204 HttpNetworkTransaction four_transaction(DEFAULT_PRIORITY, session_.get()); 212 HttpNetworkTransaction four_transaction(DEFAULT_PRIORITY, session_.get());
205 TestCompletionCallback four_callback; 213 TestCompletionCallback four_callback;
206 EXPECT_EQ(ERR_IO_PENDING, 214 EXPECT_EQ(ERR_IO_PENDING,
207 four_transaction.Start(GetRequestInfo("four.html", options), 215 four_transaction.Start(GetRequestInfo("four.html", options),
208 four_callback.callback(), BoundNetLog())); 216 four_callback.callback(),
217 BoundNetLog()));
209 218
210 ExpectResponse("one.html", *one_transaction.get(), SYNCHRONOUS); 219 ExpectResponse("one.html", *one_transaction.get(), SYNCHRONOUS);
211 EXPECT_EQ(OK, two_callback.WaitForResult()); 220 EXPECT_EQ(OK, two_callback.WaitForResult());
212 ExpectResponse("two.html", two_transaction, SYNCHRONOUS); 221 ExpectResponse("two.html", two_transaction, SYNCHRONOUS);
213 EXPECT_EQ(OK, three_callback.WaitForResult()); 222 EXPECT_EQ(OK, three_callback.WaitForResult());
214 ExpectResponse("three.html", three_transaction, SYNCHRONOUS); 223 ExpectResponse("three.html", three_transaction, SYNCHRONOUS);
215 224
216 one_transaction.reset(); 225 one_transaction.reset();
217 EXPECT_EQ(OK, four_callback.WaitForResult()); 226 EXPECT_EQ(OK, four_callback.WaitForResult());
218 ExpectResponse("four.html", four_transaction, SYNCHRONOUS); 227 ExpectResponse("four.html", four_transaction, SYNCHRONOUS);
(...skipping 12 matching lines...) Expand all
231 scoped_refptr<SSLConfigService> ssl_config_; 240 scoped_refptr<SSLConfigService> ssl_config_;
232 scoped_ptr<HttpAuthHandlerMock::Factory> auth_handler_factory_; 241 scoped_ptr<HttpAuthHandlerMock::Factory> auth_handler_factory_;
233 HttpServerPropertiesImpl http_server_properties_; 242 HttpServerPropertiesImpl http_server_properties_;
234 scoped_refptr<HttpNetworkSession> session_; 243 scoped_refptr<HttpNetworkSession> session_;
235 }; 244 };
236 245
237 TEST_F(HttpPipelinedNetworkTransactionTest, OneRequest) { 246 TEST_F(HttpPipelinedNetworkTransactionTest, OneRequest) {
238 Initialize(false); 247 Initialize(false);
239 248
240 MockWrite writes[] = { 249 MockWrite writes[] = {
241 MockWrite(SYNCHRONOUS, 0, "GET /test.html HTTP/1.1\r\n" 250 MockWrite(SYNCHRONOUS,
242 "Host: localhost\r\n" 251 0,
243 "Connection: keep-alive\r\n\r\n"), 252 "GET /test.html HTTP/1.1\r\n"
253 "Host: localhost\r\n"
254 "Connection: keep-alive\r\n\r\n"),
244 }; 255 };
245 MockRead reads[] = { 256 MockRead reads[] = {
246 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 257 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
247 MockRead(SYNCHRONOUS, 2, "Content-Length: 9\r\n\r\n"), 258 MockRead(SYNCHRONOUS, 2, "Content-Length: 9\r\n\r\n"),
248 MockRead(SYNCHRONOUS, 3, "test.html"), 259 MockRead(SYNCHRONOUS, 3, "test.html"),
249 }; 260 };
250 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 261 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
251 262
252 HttpNetworkTransaction transaction(DEFAULT_PRIORITY, session_.get()); 263 HttpNetworkTransaction transaction(DEFAULT_PRIORITY, session_.get());
253 EXPECT_EQ(ERR_IO_PENDING, 264 EXPECT_EQ(
254 transaction.Start(GetRequestInfo("test.html"), callback_.callback(), 265 ERR_IO_PENDING,
255 BoundNetLog())); 266 transaction.Start(
267 GetRequestInfo("test.html"), callback_.callback(), BoundNetLog()));
256 EXPECT_EQ(OK, callback_.WaitForResult()); 268 EXPECT_EQ(OK, callback_.WaitForResult());
257 ExpectResponse("test.html", transaction, SYNCHRONOUS); 269 ExpectResponse("test.html", transaction, SYNCHRONOUS);
258 } 270 }
259 271
260 TEST_F(HttpPipelinedNetworkTransactionTest, ReusePipeline) { 272 TEST_F(HttpPipelinedNetworkTransactionTest, ReusePipeline) {
261 Initialize(false); 273 Initialize(false);
262 274
263 MockWrite writes[] = { 275 MockWrite writes[] = {
264 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" 276 MockWrite(SYNCHRONOUS,
265 "Host: localhost\r\n" 277 0,
266 "Connection: keep-alive\r\n\r\n"), 278 "GET /one.html HTTP/1.1\r\n"
267 MockWrite(SYNCHRONOUS, 3, "GET /two.html HTTP/1.1\r\n" 279 "Host: localhost\r\n"
268 "Host: localhost\r\n" 280 "Connection: keep-alive\r\n\r\n"),
269 "Connection: keep-alive\r\n\r\n"), 281 MockWrite(SYNCHRONOUS,
282 3,
283 "GET /two.html HTTP/1.1\r\n"
284 "Host: localhost\r\n"
285 "Connection: keep-alive\r\n\r\n"),
270 }; 286 };
271 MockRead reads[] = { 287 MockRead reads[] = {
272 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 288 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
273 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), 289 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
274 MockRead(ASYNC, 4, "one.html"), 290 MockRead(ASYNC, 4, "one.html"),
275 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"), 291 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
276 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"), 292 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"),
277 MockRead(SYNCHRONOUS, 7, "two.html"), 293 MockRead(SYNCHRONOUS, 7, "two.html"),
278 }; 294 };
279 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 295 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
280 296
281 CompleteTwoRequests(0, 5); 297 CompleteTwoRequests(0, 5);
282 } 298 }
283 299
284 TEST_F(HttpPipelinedNetworkTransactionTest, ReusesOnSpaceAvailable) { 300 TEST_F(HttpPipelinedNetworkTransactionTest, ReusesOnSpaceAvailable) {
285 int old_max_sockets = ClientSocketPoolManager::max_sockets_per_group( 301 int old_max_sockets = ClientSocketPoolManager::max_sockets_per_group(
286 HttpNetworkSession::NORMAL_SOCKET_POOL); 302 HttpNetworkSession::NORMAL_SOCKET_POOL);
287 ClientSocketPoolManager::set_max_sockets_per_group( 303 ClientSocketPoolManager::set_max_sockets_per_group(
288 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); 304 HttpNetworkSession::NORMAL_SOCKET_POOL, 1);
289 Initialize(false); 305 Initialize(false);
290 306
291 MockWrite writes[] = { 307 MockWrite writes[] = {
292 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" 308 MockWrite(SYNCHRONOUS,
293 "Host: localhost\r\n" 309 0,
294 "Connection: keep-alive\r\n\r\n"), 310 "GET /one.html HTTP/1.1\r\n"
295 MockWrite(SYNCHRONOUS, 4, "GET /two.html HTTP/1.1\r\n" 311 "Host: localhost\r\n"
296 "Host: localhost\r\n" 312 "Connection: keep-alive\r\n\r\n"),
297 "Connection: keep-alive\r\n\r\n"), 313 MockWrite(SYNCHRONOUS,
298 MockWrite(SYNCHRONOUS, 7, "GET /three.html HTTP/1.1\r\n" 314 4,
299 "Host: localhost\r\n" 315 "GET /two.html HTTP/1.1\r\n"
300 "Connection: keep-alive\r\n\r\n"), 316 "Host: localhost\r\n"
301 MockWrite(SYNCHRONOUS, 12, "GET /four.html HTTP/1.1\r\n" 317 "Connection: keep-alive\r\n\r\n"),
302 "Host: localhost\r\n" 318 MockWrite(SYNCHRONOUS,
303 "Connection: keep-alive\r\n\r\n"), 319 7,
320 "GET /three.html HTTP/1.1\r\n"
321 "Host: localhost\r\n"
322 "Connection: keep-alive\r\n\r\n"),
323 MockWrite(SYNCHRONOUS,
324 12,
325 "GET /four.html HTTP/1.1\r\n"
326 "Host: localhost\r\n"
327 "Connection: keep-alive\r\n\r\n"),
304 }; 328 };
305 MockRead reads[] = { 329 MockRead reads[] = {
306 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 330 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
307 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), 331 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
308 MockRead(SYNCHRONOUS, 3, "one.html"), 332 MockRead(SYNCHRONOUS, 3, "one.html"),
309 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"), 333 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
310 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"), 334 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"),
311 MockRead(SYNCHRONOUS, 8, "two.html"), 335 MockRead(SYNCHRONOUS, 8, "two.html"),
312 MockRead(SYNCHRONOUS, 9, "HTTP/1.1 200 OK\r\n"), 336 MockRead(SYNCHRONOUS, 9, "HTTP/1.1 200 OK\r\n"),
313 MockRead(SYNCHRONOUS, 10, "Content-Length: 10\r\n\r\n"), 337 MockRead(SYNCHRONOUS, 10, "Content-Length: 10\r\n\r\n"),
314 MockRead(SYNCHRONOUS, 11, "three.html"), 338 MockRead(SYNCHRONOUS, 11, "three.html"),
315 MockRead(SYNCHRONOUS, 13, "HTTP/1.1 200 OK\r\n"), 339 MockRead(SYNCHRONOUS, 13, "HTTP/1.1 200 OK\r\n"),
316 MockRead(SYNCHRONOUS, 14, "Content-Length: 9\r\n\r\n"), 340 MockRead(SYNCHRONOUS, 14, "Content-Length: 9\r\n\r\n"),
317 MockRead(SYNCHRONOUS, 15, "four.html"), 341 MockRead(SYNCHRONOUS, 15, "four.html"),
318 }; 342 };
319 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 343 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
320 344
321 CompleteFourRequests(REQUEST_DEFAULT); 345 CompleteFourRequests(REQUEST_DEFAULT);
322 346
323 ClientSocketPoolManager::set_max_sockets_per_group( 347 ClientSocketPoolManager::set_max_sockets_per_group(
324 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_sockets); 348 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_sockets);
325 } 349 }
326 350
327 TEST_F(HttpPipelinedNetworkTransactionTest, WontPipelineMainResource) { 351 TEST_F(HttpPipelinedNetworkTransactionTest, WontPipelineMainResource) {
328 int old_max_sockets = ClientSocketPoolManager::max_sockets_per_group( 352 int old_max_sockets = ClientSocketPoolManager::max_sockets_per_group(
329 HttpNetworkSession::NORMAL_SOCKET_POOL); 353 HttpNetworkSession::NORMAL_SOCKET_POOL);
330 ClientSocketPoolManager::set_max_sockets_per_group( 354 ClientSocketPoolManager::set_max_sockets_per_group(
331 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); 355 HttpNetworkSession::NORMAL_SOCKET_POOL, 1);
332 Initialize(false); 356 Initialize(false);
333 357
334 MockWrite writes[] = { 358 MockWrite writes[] = {
335 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" 359 MockWrite(SYNCHRONOUS,
336 "Host: localhost\r\n" 360 0,
337 "Connection: keep-alive\r\n\r\n"), 361 "GET /one.html HTTP/1.1\r\n"
338 MockWrite(SYNCHRONOUS, 4, "GET /two.html HTTP/1.1\r\n" 362 "Host: localhost\r\n"
339 "Host: localhost\r\n" 363 "Connection: keep-alive\r\n\r\n"),
340 "Connection: keep-alive\r\n\r\n"), 364 MockWrite(SYNCHRONOUS,
341 MockWrite(SYNCHRONOUS, 8, "GET /three.html HTTP/1.1\r\n" 365 4,
342 "Host: localhost\r\n" 366 "GET /two.html HTTP/1.1\r\n"
343 "Connection: keep-alive\r\n\r\n"), 367 "Host: localhost\r\n"
344 MockWrite(SYNCHRONOUS, 12, "GET /four.html HTTP/1.1\r\n" 368 "Connection: keep-alive\r\n\r\n"),
345 "Host: localhost\r\n" 369 MockWrite(SYNCHRONOUS,
346 "Connection: keep-alive\r\n\r\n"), 370 8,
371 "GET /three.html HTTP/1.1\r\n"
372 "Host: localhost\r\n"
373 "Connection: keep-alive\r\n\r\n"),
374 MockWrite(SYNCHRONOUS,
375 12,
376 "GET /four.html HTTP/1.1\r\n"
377 "Host: localhost\r\n"
378 "Connection: keep-alive\r\n\r\n"),
347 }; 379 };
348 MockRead reads[] = { 380 MockRead reads[] = {
349 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 381 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
350 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), 382 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
351 MockRead(SYNCHRONOUS, 3, "one.html"), 383 MockRead(SYNCHRONOUS, 3, "one.html"),
352 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"), 384 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
353 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"), 385 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"),
354 MockRead(SYNCHRONOUS, 7, "two.html"), 386 MockRead(SYNCHRONOUS, 7, "two.html"),
355 MockRead(SYNCHRONOUS, 9, "HTTP/1.1 200 OK\r\n"), 387 MockRead(SYNCHRONOUS, 9, "HTTP/1.1 200 OK\r\n"),
356 MockRead(SYNCHRONOUS, 10, "Content-Length: 10\r\n\r\n"), 388 MockRead(SYNCHRONOUS, 10, "Content-Length: 10\r\n\r\n"),
357 MockRead(SYNCHRONOUS, 11, "three.html"), 389 MockRead(SYNCHRONOUS, 11, "three.html"),
358 MockRead(SYNCHRONOUS, 13, "HTTP/1.1 200 OK\r\n"), 390 MockRead(SYNCHRONOUS, 13, "HTTP/1.1 200 OK\r\n"),
359 MockRead(SYNCHRONOUS, 14, "Content-Length: 9\r\n\r\n"), 391 MockRead(SYNCHRONOUS, 14, "Content-Length: 9\r\n\r\n"),
360 MockRead(SYNCHRONOUS, 15, "four.html"), 392 MockRead(SYNCHRONOUS, 15, "four.html"),
361 }; 393 };
362 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 394 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
363 395
364 CompleteFourRequests(REQUEST_MAIN_RESOURCE); 396 CompleteFourRequests(REQUEST_MAIN_RESOURCE);
365 397
366 ClientSocketPoolManager::set_max_sockets_per_group( 398 ClientSocketPoolManager::set_max_sockets_per_group(
367 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_sockets); 399 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_sockets);
368 } 400 }
369 401
370 TEST_F(HttpPipelinedNetworkTransactionTest, UnknownSizeEvictsToNewPipeline) { 402 TEST_F(HttpPipelinedNetworkTransactionTest, UnknownSizeEvictsToNewPipeline) {
371 Initialize(false); 403 Initialize(false);
372 404
373 MockWrite writes[] = { 405 MockWrite writes[] = {
374 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" 406 MockWrite(SYNCHRONOUS,
375 "Host: localhost\r\n" 407 0,
376 "Connection: keep-alive\r\n\r\n"), 408 "GET /one.html HTTP/1.1\r\n"
409 "Host: localhost\r\n"
410 "Connection: keep-alive\r\n\r\n"),
377 }; 411 };
378 MockRead reads[] = { 412 MockRead reads[] = {
379 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n\r\n"), 413 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n\r\n"),
380 MockRead(ASYNC, 2, "one.html"), 414 MockRead(ASYNC, 2, "one.html"), MockRead(SYNCHRONOUS, OK, 3),
381 MockRead(SYNCHRONOUS, OK, 3),
382 }; 415 };
383 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 416 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
384 417
385 MockWrite writes2[] = { 418 MockWrite writes2[] = {
386 MockWrite(SYNCHRONOUS, 0, "GET /two.html HTTP/1.1\r\n" 419 MockWrite(SYNCHRONOUS,
387 "Host: localhost\r\n" 420 0,
388 "Connection: keep-alive\r\n\r\n"), 421 "GET /two.html HTTP/1.1\r\n"
422 "Host: localhost\r\n"
423 "Connection: keep-alive\r\n\r\n"),
389 }; 424 };
390 MockRead reads2[] = { 425 MockRead reads2[] = {
391 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 426 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
392 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), 427 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
393 MockRead(SYNCHRONOUS, 3, "two.html"), 428 MockRead(SYNCHRONOUS, 3, "two.html"),
394 }; 429 };
395 AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2)); 430 AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2));
396 431
397 CompleteTwoRequests(0, 3); 432 CompleteTwoRequests(0, 3);
398 } 433 }
399 434
400 TEST_F(HttpPipelinedNetworkTransactionTest, ConnectionCloseEvictToNewPipeline) { 435 TEST_F(HttpPipelinedNetworkTransactionTest, ConnectionCloseEvictToNewPipeline) {
401 Initialize(false); 436 Initialize(false);
402 437
403 MockWrite writes[] = { 438 MockWrite writes[] = {
404 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" 439 MockWrite(SYNCHRONOUS,
405 "Host: localhost\r\n" 440 0,
406 "Connection: keep-alive\r\n\r\n"), 441 "GET /one.html HTTP/1.1\r\n"
407 MockWrite(SYNCHRONOUS, 3, "GET /two.html HTTP/1.1\r\n" 442 "Host: localhost\r\n"
408 "Host: localhost\r\n" 443 "Connection: keep-alive\r\n\r\n"),
409 "Connection: keep-alive\r\n\r\n"), 444 MockWrite(SYNCHRONOUS,
445 3,
446 "GET /two.html HTTP/1.1\r\n"
447 "Host: localhost\r\n"
448 "Connection: keep-alive\r\n\r\n"),
410 }; 449 };
411 MockRead reads[] = { 450 MockRead reads[] = {
412 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 451 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
413 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), 452 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
414 MockRead(ASYNC, 4, "one.html"), 453 MockRead(ASYNC, 4, "one.html"),
415 MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 5), 454 MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 5),
416 }; 455 };
417 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 456 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
418 457
419 MockWrite writes2[] = { 458 MockWrite writes2[] = {
420 MockWrite(SYNCHRONOUS, 0, "GET /two.html HTTP/1.1\r\n" 459 MockWrite(SYNCHRONOUS,
421 "Host: localhost\r\n" 460 0,
422 "Connection: keep-alive\r\n\r\n"), 461 "GET /two.html HTTP/1.1\r\n"
462 "Host: localhost\r\n"
463 "Connection: keep-alive\r\n\r\n"),
423 }; 464 };
424 MockRead reads2[] = { 465 MockRead reads2[] = {
425 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 466 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
426 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), 467 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
427 MockRead(SYNCHRONOUS, 3, "two.html"), 468 MockRead(SYNCHRONOUS, 3, "two.html"),
428 }; 469 };
429 AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2)); 470 AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2));
430 471
431 CompleteTwoRequests(0, 5); 472 CompleteTwoRequests(0, 5);
432 } 473 }
433 474
434 TEST_F(HttpPipelinedNetworkTransactionTest, ErrorEvictsToNewPipeline) { 475 TEST_F(HttpPipelinedNetworkTransactionTest, ErrorEvictsToNewPipeline) {
435 Initialize(false); 476 Initialize(false);
436 477
437 MockWrite writes[] = { 478 MockWrite writes[] = {
438 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" 479 MockWrite(SYNCHRONOUS,
439 "Host: localhost\r\n" 480 0,
440 "Connection: keep-alive\r\n\r\n"), 481 "GET /one.html HTTP/1.1\r\n"
441 MockWrite(SYNCHRONOUS, 3, "GET /two.html HTTP/1.1\r\n" 482 "Host: localhost\r\n"
442 "Host: localhost\r\n" 483 "Connection: keep-alive\r\n\r\n"),
443 "Connection: keep-alive\r\n\r\n"), 484 MockWrite(SYNCHRONOUS,
485 3,
486 "GET /two.html HTTP/1.1\r\n"
487 "Host: localhost\r\n"
488 "Connection: keep-alive\r\n\r\n"),
444 }; 489 };
445 MockRead reads[] = { 490 MockRead reads[] = {
446 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n\r\n"), 491 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n\r\n"),
447 MockRead(SYNCHRONOUS, ERR_FAILED, 2), 492 MockRead(SYNCHRONOUS, ERR_FAILED, 2),
448 }; 493 };
449 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 494 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
450 495
451 MockWrite writes2[] = { 496 MockWrite writes2[] = {
452 MockWrite(SYNCHRONOUS, 0, "GET /two.html HTTP/1.1\r\n" 497 MockWrite(SYNCHRONOUS,
453 "Host: localhost\r\n" 498 0,
454 "Connection: keep-alive\r\n\r\n"), 499 "GET /two.html HTTP/1.1\r\n"
500 "Host: localhost\r\n"
501 "Connection: keep-alive\r\n\r\n"),
455 }; 502 };
456 MockRead reads2[] = { 503 MockRead reads2[] = {
457 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 504 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
458 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), 505 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
459 MockRead(SYNCHRONOUS, 3, "two.html"), 506 MockRead(SYNCHRONOUS, 3, "two.html"),
460 }; 507 };
461 AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2)); 508 AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2));
462 509
463 HttpNetworkTransaction one_transaction(DEFAULT_PRIORITY, session_.get()); 510 HttpNetworkTransaction one_transaction(DEFAULT_PRIORITY, session_.get());
464 TestCompletionCallback one_callback; 511 TestCompletionCallback one_callback;
465 EXPECT_EQ(ERR_IO_PENDING, 512 EXPECT_EQ(
466 one_transaction.Start(GetRequestInfo("one.html"), 513 ERR_IO_PENDING,
467 one_callback.callback(), BoundNetLog())); 514 one_transaction.Start(
515 GetRequestInfo("one.html"), one_callback.callback(), BoundNetLog()));
468 EXPECT_EQ(OK, one_callback.WaitForResult()); 516 EXPECT_EQ(OK, one_callback.WaitForResult());
469 517
470 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get()); 518 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
471 TestCompletionCallback two_callback; 519 TestCompletionCallback two_callback;
472 EXPECT_EQ(ERR_IO_PENDING, 520 EXPECT_EQ(
473 two_transaction.Start(GetRequestInfo("two.html"), 521 ERR_IO_PENDING,
474 two_callback.callback(), BoundNetLog())); 522 two_transaction.Start(
523 GetRequestInfo("two.html"), two_callback.callback(), BoundNetLog()));
475 524
476 scoped_refptr<IOBuffer> buffer(new IOBuffer(1)); 525 scoped_refptr<IOBuffer> buffer(new IOBuffer(1));
477 EXPECT_EQ(ERR_FAILED, 526 EXPECT_EQ(ERR_FAILED,
478 one_transaction.Read(buffer.get(), 1, callback_.callback())); 527 one_transaction.Read(buffer.get(), 1, callback_.callback()));
479 EXPECT_EQ(OK, two_callback.WaitForResult()); 528 EXPECT_EQ(OK, two_callback.WaitForResult());
480 ExpectResponse("two.html", two_transaction, SYNCHRONOUS); 529 ExpectResponse("two.html", two_transaction, SYNCHRONOUS);
481 } 530 }
482 531
483 TEST_F(HttpPipelinedNetworkTransactionTest, SendErrorEvictsToNewPipeline) { 532 TEST_F(HttpPipelinedNetworkTransactionTest, SendErrorEvictsToNewPipeline) {
484 Initialize(false); 533 Initialize(false);
485 534
486 MockWrite writes[] = { 535 MockWrite writes[] = {
487 MockWrite(ASYNC, ERR_FAILED, 0), 536 MockWrite(ASYNC, ERR_FAILED, 0),
488 }; 537 };
489 AddExpectedConnection(NULL, 0, writes, arraysize(writes)); 538 AddExpectedConnection(NULL, 0, writes, arraysize(writes));
490 539
491 MockWrite writes2[] = { 540 MockWrite writes2[] = {
492 MockWrite(SYNCHRONOUS, 0, "GET /two.html HTTP/1.1\r\n" 541 MockWrite(SYNCHRONOUS,
493 "Host: localhost\r\n" 542 0,
494 "Connection: keep-alive\r\n\r\n"), 543 "GET /two.html HTTP/1.1\r\n"
544 "Host: localhost\r\n"
545 "Connection: keep-alive\r\n\r\n"),
495 }; 546 };
496 MockRead reads2[] = { 547 MockRead reads2[] = {
497 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 548 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
498 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), 549 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
499 MockRead(SYNCHRONOUS, 3, "two.html"), 550 MockRead(SYNCHRONOUS, 3, "two.html"),
500 }; 551 };
501 AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2)); 552 AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2));
502 553
503 HttpNetworkTransaction one_transaction(DEFAULT_PRIORITY, session_.get()); 554 HttpNetworkTransaction one_transaction(DEFAULT_PRIORITY, session_.get());
504 TestCompletionCallback one_callback; 555 TestCompletionCallback one_callback;
505 EXPECT_EQ(ERR_IO_PENDING, 556 EXPECT_EQ(
506 one_transaction.Start(GetRequestInfo("one.html"), 557 ERR_IO_PENDING,
507 one_callback.callback(), BoundNetLog())); 558 one_transaction.Start(
559 GetRequestInfo("one.html"), one_callback.callback(), BoundNetLog()));
508 560
509 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get()); 561 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
510 TestCompletionCallback two_callback; 562 TestCompletionCallback two_callback;
511 EXPECT_EQ(ERR_IO_PENDING, 563 EXPECT_EQ(
512 two_transaction.Start(GetRequestInfo("two.html"), 564 ERR_IO_PENDING,
513 two_callback.callback(), BoundNetLog())); 565 two_transaction.Start(
566 GetRequestInfo("two.html"), two_callback.callback(), BoundNetLog()));
514 567
515 data_vector_[0]->RunFor(1); 568 data_vector_[0]->RunFor(1);
516 EXPECT_EQ(ERR_FAILED, one_callback.WaitForResult()); 569 EXPECT_EQ(ERR_FAILED, one_callback.WaitForResult());
517 570
518 EXPECT_EQ(OK, two_callback.WaitForResult()); 571 EXPECT_EQ(OK, two_callback.WaitForResult());
519 ExpectResponse("two.html", two_transaction, SYNCHRONOUS); 572 ExpectResponse("two.html", two_transaction, SYNCHRONOUS);
520 } 573 }
521 574
522 TEST_F(HttpPipelinedNetworkTransactionTest, RedirectDrained) { 575 TEST_F(HttpPipelinedNetworkTransactionTest, RedirectDrained) {
523 Initialize(false); 576 Initialize(false);
524 577
525 MockWrite writes[] = { 578 MockWrite writes[] = {
526 MockWrite(SYNCHRONOUS, 0, "GET /redirect.html HTTP/1.1\r\n" 579 MockWrite(SYNCHRONOUS,
527 "Host: localhost\r\n" 580 0,
528 "Connection: keep-alive\r\n\r\n"), 581 "GET /redirect.html HTTP/1.1\r\n"
529 MockWrite(SYNCHRONOUS, 3, "GET /two.html HTTP/1.1\r\n" 582 "Host: localhost\r\n"
530 "Host: localhost\r\n" 583 "Connection: keep-alive\r\n\r\n"),
531 "Connection: keep-alive\r\n\r\n"), 584 MockWrite(SYNCHRONOUS,
585 3,
586 "GET /two.html HTTP/1.1\r\n"
587 "Host: localhost\r\n"
588 "Connection: keep-alive\r\n\r\n"),
532 }; 589 };
533 MockRead reads[] = { 590 MockRead reads[] = {
534 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 302 OK\r\n"), 591 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 302 OK\r\n"),
535 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), 592 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
536 MockRead(ASYNC, 4, "redirect"), 593 MockRead(ASYNC, 4, "redirect"),
537 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"), 594 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
538 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"), 595 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"),
539 MockRead(SYNCHRONOUS, 7, "two.html"), 596 MockRead(SYNCHRONOUS, 7, "two.html"),
540 }; 597 };
541 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 598 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
542 599
543 scoped_ptr<HttpNetworkTransaction> one_transaction( 600 scoped_ptr<HttpNetworkTransaction> one_transaction(
544 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 601 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
545 TestCompletionCallback one_callback; 602 TestCompletionCallback one_callback;
546 EXPECT_EQ(ERR_IO_PENDING, 603 EXPECT_EQ(ERR_IO_PENDING,
547 one_transaction->Start(GetRequestInfo("redirect.html"), 604 one_transaction->Start(GetRequestInfo("redirect.html"),
548 one_callback.callback(), BoundNetLog())); 605 one_callback.callback(),
606 BoundNetLog()));
549 EXPECT_EQ(OK, one_callback.WaitForResult()); 607 EXPECT_EQ(OK, one_callback.WaitForResult());
550 608
551 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get()); 609 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
552 TestCompletionCallback two_callback; 610 TestCompletionCallback two_callback;
553 EXPECT_EQ(ERR_IO_PENDING, 611 EXPECT_EQ(
554 two_transaction.Start(GetRequestInfo("two.html"), 612 ERR_IO_PENDING,
555 two_callback.callback(), BoundNetLog())); 613 two_transaction.Start(
614 GetRequestInfo("two.html"), two_callback.callback(), BoundNetLog()));
556 615
557 one_transaction.reset(); 616 one_transaction.reset();
558 data_vector_[0]->RunFor(2); 617 data_vector_[0]->RunFor(2);
559 data_vector_[0]->SetStop(10); 618 data_vector_[0]->SetStop(10);
560 619
561 EXPECT_EQ(OK, two_callback.WaitForResult()); 620 EXPECT_EQ(OK, two_callback.WaitForResult());
562 ExpectResponse("two.html", two_transaction, SYNCHRONOUS); 621 ExpectResponse("two.html", two_transaction, SYNCHRONOUS);
563 } 622 }
564 623
565 TEST_F(HttpPipelinedNetworkTransactionTest, BasicHttpAuthentication) { 624 TEST_F(HttpPipelinedNetworkTransactionTest, BasicHttpAuthentication) {
566 Initialize(false); 625 Initialize(false);
567 626
568 MockWrite writes[] = { 627 MockWrite writes[] = {
569 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" 628 MockWrite(SYNCHRONOUS,
570 "Host: localhost\r\n" 629 0,
571 "Connection: keep-alive\r\n\r\n"), 630 "GET /one.html HTTP/1.1\r\n"
572 MockWrite(SYNCHRONOUS, 5, "GET /one.html HTTP/1.1\r\n" 631 "Host: localhost\r\n"
573 "Host: localhost\r\n" 632 "Connection: keep-alive\r\n\r\n"),
574 "Connection: keep-alive\r\n" 633 MockWrite(SYNCHRONOUS,
575 "Authorization: auth_token\r\n\r\n"), 634 5,
635 "GET /one.html HTTP/1.1\r\n"
636 "Host: localhost\r\n"
637 "Connection: keep-alive\r\n"
638 "Authorization: auth_token\r\n\r\n"),
576 }; 639 };
577 MockRead reads[] = { 640 MockRead reads[] = {
578 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 401 Authentication Required\r\n"), 641 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 401 Authentication Required\r\n"),
579 MockRead(SYNCHRONOUS, 2, 642 MockRead(
580 "WWW-Authenticate: Basic realm=\"Secure Area\"\r\n"), 643 SYNCHRONOUS, 2, "WWW-Authenticate: Basic realm=\"Secure Area\"\r\n"),
581 MockRead(SYNCHRONOUS, 3, "Content-Length: 20\r\n\r\n"), 644 MockRead(SYNCHRONOUS, 3, "Content-Length: 20\r\n\r\n"),
582 MockRead(SYNCHRONOUS, 4, "needs authentication"), 645 MockRead(SYNCHRONOUS, 4, "needs authentication"),
583 MockRead(SYNCHRONOUS, 6, "HTTP/1.1 200 OK\r\n"), 646 MockRead(SYNCHRONOUS, 6, "HTTP/1.1 200 OK\r\n"),
584 MockRead(SYNCHRONOUS, 7, "Content-Length: 8\r\n\r\n"), 647 MockRead(SYNCHRONOUS, 7, "Content-Length: 8\r\n\r\n"),
585 MockRead(SYNCHRONOUS, 8, "one.html"), 648 MockRead(SYNCHRONOUS, 8, "one.html"),
586 }; 649 };
587 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 650 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
588 651
589 HttpAuthHandlerMock* mock_auth = new HttpAuthHandlerMock; 652 HttpAuthHandlerMock* mock_auth = new HttpAuthHandlerMock;
590 std::string challenge_text = "Basic"; 653 std::string challenge_text = "Basic";
591 HttpAuthChallengeTokenizer challenge(challenge_text.begin(), 654 HttpAuthChallengeTokenizer challenge(challenge_text.begin(),
592 challenge_text.end()); 655 challenge_text.end());
593 GURL origin("localhost"); 656 GURL origin("localhost");
594 EXPECT_TRUE(mock_auth->InitFromChallenge(&challenge, 657 EXPECT_TRUE(mock_auth->InitFromChallenge(
595 HttpAuth::AUTH_SERVER, 658 &challenge, HttpAuth::AUTH_SERVER, origin, BoundNetLog()));
596 origin,
597 BoundNetLog()));
598 auth_handler_factory_->AddMockHandler(mock_auth, HttpAuth::AUTH_SERVER); 659 auth_handler_factory_->AddMockHandler(mock_auth, HttpAuth::AUTH_SERVER);
599 660
600 HttpNetworkTransaction transaction(DEFAULT_PRIORITY, session_.get()); 661 HttpNetworkTransaction transaction(DEFAULT_PRIORITY, session_.get());
601 EXPECT_EQ(ERR_IO_PENDING, 662 EXPECT_EQ(
602 transaction.Start(GetRequestInfo("one.html"), 663 ERR_IO_PENDING,
603 callback_.callback(), 664 transaction.Start(
604 BoundNetLog())); 665 GetRequestInfo("one.html"), callback_.callback(), BoundNetLog()));
605 EXPECT_EQ(OK, callback_.WaitForResult()); 666 EXPECT_EQ(OK, callback_.WaitForResult());
606 667
607 AuthCredentials credentials(base::ASCIIToUTF16("user"), 668 AuthCredentials credentials(base::ASCIIToUTF16("user"),
608 base::ASCIIToUTF16("pass")); 669 base::ASCIIToUTF16("pass"));
609 EXPECT_EQ(OK, transaction.RestartWithAuth(credentials, callback_.callback())); 670 EXPECT_EQ(OK, transaction.RestartWithAuth(credentials, callback_.callback()));
610 671
611 ExpectResponse("one.html", transaction, SYNCHRONOUS); 672 ExpectResponse("one.html", transaction, SYNCHRONOUS);
612 } 673 }
613 674
614 TEST_F(HttpPipelinedNetworkTransactionTest, OldVersionDisablesPipelining) { 675 TEST_F(HttpPipelinedNetworkTransactionTest, OldVersionDisablesPipelining) {
615 Initialize(false); 676 Initialize(false);
616 677
617 MockWrite writes[] = { 678 MockWrite writes[] = {
618 MockWrite(SYNCHRONOUS, 0, "GET /pipelined.html HTTP/1.1\r\n" 679 MockWrite(SYNCHRONOUS,
619 "Host: localhost\r\n" 680 0,
620 "Connection: keep-alive\r\n\r\n"), 681 "GET /pipelined.html HTTP/1.1\r\n"
682 "Host: localhost\r\n"
683 "Connection: keep-alive\r\n\r\n"),
621 }; 684 };
622 MockRead reads[] = { 685 MockRead reads[] = {
623 MockRead(SYNCHRONOUS, 1, "HTTP/1.0 200 OK\r\n"), 686 MockRead(SYNCHRONOUS, 1, "HTTP/1.0 200 OK\r\n"),
624 MockRead(SYNCHRONOUS, 2, "Content-Length: 14\r\n\r\n"), 687 MockRead(SYNCHRONOUS, 2, "Content-Length: 14\r\n\r\n"),
625 MockRead(SYNCHRONOUS, 3, "pipelined.html"), 688 MockRead(SYNCHRONOUS, 3, "pipelined.html"),
626 }; 689 };
627 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 690 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
628 691
629 MockWrite writes2[] = { 692 MockWrite writes2[] = {
630 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" 693 MockWrite(SYNCHRONOUS,
631 "Host: localhost\r\n" 694 0,
632 "Connection: keep-alive\r\n\r\n"), 695 "GET /one.html HTTP/1.1\r\n"
696 "Host: localhost\r\n"
697 "Connection: keep-alive\r\n\r\n"),
633 }; 698 };
634 MockRead reads2[] = { 699 MockRead reads2[] = {
635 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 700 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
636 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), 701 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
637 MockRead(ASYNC, 3, "one.html"), 702 MockRead(ASYNC, 3, "one.html"), MockRead(SYNCHRONOUS, OK, 4),
638 MockRead(SYNCHRONOUS, OK, 4),
639 }; 703 };
640 AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2)); 704 AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2));
641 705
642 MockWrite writes3[] = { 706 MockWrite writes3[] = {
643 MockWrite(SYNCHRONOUS, 0, "GET /two.html HTTP/1.1\r\n" 707 MockWrite(SYNCHRONOUS,
644 "Host: localhost\r\n" 708 0,
645 "Connection: keep-alive\r\n\r\n"), 709 "GET /two.html HTTP/1.1\r\n"
710 "Host: localhost\r\n"
711 "Connection: keep-alive\r\n\r\n"),
646 }; 712 };
647 MockRead reads3[] = { 713 MockRead reads3[] = {
648 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 714 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
649 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), 715 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
650 MockRead(SYNCHRONOUS, 3, "two.html"), 716 MockRead(SYNCHRONOUS, 3, "two.html"), MockRead(SYNCHRONOUS, OK, 4),
651 MockRead(SYNCHRONOUS, OK, 4),
652 }; 717 };
653 AddExpectedConnection(reads3, arraysize(reads3), writes3, arraysize(writes3)); 718 AddExpectedConnection(reads3, arraysize(reads3), writes3, arraysize(writes3));
654 719
655 HttpNetworkTransaction one_transaction(DEFAULT_PRIORITY, session_.get()); 720 HttpNetworkTransaction one_transaction(DEFAULT_PRIORITY, session_.get());
656 TestCompletionCallback one_callback; 721 TestCompletionCallback one_callback;
657 EXPECT_EQ(ERR_IO_PENDING, 722 EXPECT_EQ(ERR_IO_PENDING,
658 one_transaction.Start(GetRequestInfo("pipelined.html"), 723 one_transaction.Start(GetRequestInfo("pipelined.html"),
659 one_callback.callback(), BoundNetLog())); 724 one_callback.callback(),
725 BoundNetLog()));
660 EXPECT_EQ(OK, one_callback.WaitForResult()); 726 EXPECT_EQ(OK, one_callback.WaitForResult());
661 ExpectResponse("pipelined.html", one_transaction, SYNCHRONOUS); 727 ExpectResponse("pipelined.html", one_transaction, SYNCHRONOUS);
662 728
663 CompleteTwoRequests(1, 4); 729 CompleteTwoRequests(1, 4);
664 } 730 }
665 731
666 TEST_F(HttpPipelinedNetworkTransactionTest, PipelinesImmediatelyIfKnownGood) { 732 TEST_F(HttpPipelinedNetworkTransactionTest, PipelinesImmediatelyIfKnownGood) {
667 // The first request gets us an HTTP/1.1. The next 3 test pipelining. When the 733 // The first request gets us an HTTP/1.1. The next 3 test pipelining. When the
668 // 3rd request completes, we know pipelining is safe. After the first 4 734 // 3rd request completes, we know pipelining is safe. After the first 4
669 // complete, the 5th and 6th should then be immediately sent pipelined on a 735 // complete, the 5th and 6th should then be immediately sent pipelined on a
670 // new HttpPipelinedConnection. 736 // new HttpPipelinedConnection.
671 int old_max_sockets = ClientSocketPoolManager::max_sockets_per_group( 737 int old_max_sockets = ClientSocketPoolManager::max_sockets_per_group(
672 HttpNetworkSession::NORMAL_SOCKET_POOL); 738 HttpNetworkSession::NORMAL_SOCKET_POOL);
673 ClientSocketPoolManager::set_max_sockets_per_group( 739 ClientSocketPoolManager::set_max_sockets_per_group(
674 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); 740 HttpNetworkSession::NORMAL_SOCKET_POOL, 1);
675 Initialize(false); 741 Initialize(false);
676 742
677 MockWrite writes[] = { 743 MockWrite writes[] = {
678 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" 744 MockWrite(SYNCHRONOUS,
679 "Host: localhost\r\n" 745 0,
680 "Connection: keep-alive\r\n\r\n"), 746 "GET /one.html HTTP/1.1\r\n"
681 MockWrite(SYNCHRONOUS, 4, "GET /two.html HTTP/1.1\r\n" 747 "Host: localhost\r\n"
682 "Host: localhost\r\n" 748 "Connection: keep-alive\r\n\r\n"),
683 "Connection: keep-alive\r\n\r\n"), 749 MockWrite(SYNCHRONOUS,
684 MockWrite(SYNCHRONOUS, 7, "GET /three.html HTTP/1.1\r\n" 750 4,
685 "Host: localhost\r\n" 751 "GET /two.html HTTP/1.1\r\n"
686 "Connection: keep-alive\r\n\r\n"), 752 "Host: localhost\r\n"
687 MockWrite(SYNCHRONOUS, 12, "GET /four.html HTTP/1.1\r\n" 753 "Connection: keep-alive\r\n\r\n"),
688 "Host: localhost\r\n" 754 MockWrite(SYNCHRONOUS,
689 "Connection: keep-alive\r\n\r\n"), 755 7,
690 MockWrite(SYNCHRONOUS, 16, "GET /second-pipeline-one.html HTTP/1.1\r\n" 756 "GET /three.html HTTP/1.1\r\n"
691 "Host: localhost\r\n" 757 "Host: localhost\r\n"
692 "Connection: keep-alive\r\n\r\n"), 758 "Connection: keep-alive\r\n\r\n"),
693 MockWrite(SYNCHRONOUS, 17, "GET /second-pipeline-two.html HTTP/1.1\r\n" 759 MockWrite(SYNCHRONOUS,
694 "Host: localhost\r\n" 760 12,
695 "Connection: keep-alive\r\n\r\n"), 761 "GET /four.html HTTP/1.1\r\n"
762 "Host: localhost\r\n"
763 "Connection: keep-alive\r\n\r\n"),
764 MockWrite(SYNCHRONOUS,
765 16,
766 "GET /second-pipeline-one.html HTTP/1.1\r\n"
767 "Host: localhost\r\n"
768 "Connection: keep-alive\r\n\r\n"),
769 MockWrite(SYNCHRONOUS,
770 17,
771 "GET /second-pipeline-two.html HTTP/1.1\r\n"
772 "Host: localhost\r\n"
773 "Connection: keep-alive\r\n\r\n"),
696 }; 774 };
697 MockRead reads[] = { 775 MockRead reads[] = {
698 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 776 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
699 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), 777 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
700 MockRead(SYNCHRONOUS, 3, "one.html"), 778 MockRead(SYNCHRONOUS, 3, "one.html"),
701 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"), 779 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
702 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"), 780 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"),
703 MockRead(SYNCHRONOUS, 8, "two.html"), 781 MockRead(SYNCHRONOUS, 8, "two.html"),
704 MockRead(SYNCHRONOUS, 9, "HTTP/1.1 200 OK\r\n"), 782 MockRead(SYNCHRONOUS, 9, "HTTP/1.1 200 OK\r\n"),
705 MockRead(SYNCHRONOUS, 10, "Content-Length: 10\r\n\r\n"), 783 MockRead(SYNCHRONOUS, 10, "Content-Length: 10\r\n\r\n"),
706 MockRead(SYNCHRONOUS, 11, "three.html"), 784 MockRead(SYNCHRONOUS, 11, "three.html"),
707 MockRead(SYNCHRONOUS, 13, "HTTP/1.1 200 OK\r\n"), 785 MockRead(SYNCHRONOUS, 13, "HTTP/1.1 200 OK\r\n"),
708 MockRead(SYNCHRONOUS, 14, "Content-Length: 9\r\n\r\n"), 786 MockRead(SYNCHRONOUS, 14, "Content-Length: 9\r\n\r\n"),
709 MockRead(SYNCHRONOUS, 15, "four.html"), 787 MockRead(SYNCHRONOUS, 15, "four.html"),
710 MockRead(ASYNC, 18, "HTTP/1.1 200 OK\r\n"), 788 MockRead(ASYNC, 18, "HTTP/1.1 200 OK\r\n"),
711 MockRead(ASYNC, 19, "Content-Length: 24\r\n\r\n"), 789 MockRead(ASYNC, 19, "Content-Length: 24\r\n\r\n"),
712 MockRead(SYNCHRONOUS, 20, "second-pipeline-one.html"), 790 MockRead(SYNCHRONOUS, 20, "second-pipeline-one.html"),
713 MockRead(SYNCHRONOUS, 21, "HTTP/1.1 200 OK\r\n"), 791 MockRead(SYNCHRONOUS, 21, "HTTP/1.1 200 OK\r\n"),
714 MockRead(SYNCHRONOUS, 22, "Content-Length: 24\r\n\r\n"), 792 MockRead(SYNCHRONOUS, 22, "Content-Length: 24\r\n\r\n"),
715 MockRead(SYNCHRONOUS, 23, "second-pipeline-two.html"), 793 MockRead(SYNCHRONOUS, 23, "second-pipeline-two.html"),
716 }; 794 };
717 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 795 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
718 796
719 CompleteFourRequests(REQUEST_DEFAULT); 797 CompleteFourRequests(REQUEST_DEFAULT);
720 798
721 HttpNetworkTransaction second_one_transaction( 799 HttpNetworkTransaction second_one_transaction(DEFAULT_PRIORITY,
722 DEFAULT_PRIORITY, session_.get()); 800 session_.get());
723 TestCompletionCallback second_one_callback; 801 TestCompletionCallback second_one_callback;
724 EXPECT_EQ(ERR_IO_PENDING, 802 EXPECT_EQ(
725 second_one_transaction.Start( 803 ERR_IO_PENDING,
726 GetRequestInfo("second-pipeline-one.html"), 804 second_one_transaction.Start(GetRequestInfo("second-pipeline-one.html"),
727 second_one_callback.callback(), BoundNetLog())); 805 second_one_callback.callback(),
806 BoundNetLog()));
728 base::MessageLoop::current()->RunUntilIdle(); 807 base::MessageLoop::current()->RunUntilIdle();
729 808
730 HttpNetworkTransaction second_two_transaction( 809 HttpNetworkTransaction second_two_transaction(DEFAULT_PRIORITY,
731 DEFAULT_PRIORITY, session_.get()); 810 session_.get());
732 TestCompletionCallback second_two_callback; 811 TestCompletionCallback second_two_callback;
733 EXPECT_EQ(ERR_IO_PENDING, 812 EXPECT_EQ(
734 second_two_transaction.Start( 813 ERR_IO_PENDING,
735 GetRequestInfo("second-pipeline-two.html"), 814 second_two_transaction.Start(GetRequestInfo("second-pipeline-two.html"),
736 second_two_callback.callback(), BoundNetLog())); 815 second_two_callback.callback(),
816 BoundNetLog()));
737 817
738 data_vector_[0]->RunFor(3); 818 data_vector_[0]->RunFor(3);
739 EXPECT_EQ(OK, second_one_callback.WaitForResult()); 819 EXPECT_EQ(OK, second_one_callback.WaitForResult());
740 data_vector_[0]->StopAfter(100); 820 data_vector_[0]->StopAfter(100);
741 ExpectResponse("second-pipeline-one.html", second_one_transaction, 821 ExpectResponse(
742 SYNCHRONOUS); 822 "second-pipeline-one.html", second_one_transaction, SYNCHRONOUS);
743 EXPECT_EQ(OK, second_two_callback.WaitForResult()); 823 EXPECT_EQ(OK, second_two_callback.WaitForResult());
744 ExpectResponse("second-pipeline-two.html", second_two_transaction, 824 ExpectResponse(
745 SYNCHRONOUS); 825 "second-pipeline-two.html", second_two_transaction, SYNCHRONOUS);
746 826
747 ClientSocketPoolManager::set_max_sockets_per_group( 827 ClientSocketPoolManager::set_max_sockets_per_group(
748 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_sockets); 828 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_sockets);
749 } 829 }
750 830
751 class DataRunnerObserver : public base::MessageLoop::TaskObserver { 831 class DataRunnerObserver : public base::MessageLoop::TaskObserver {
752 public: 832 public:
753 DataRunnerObserver(DeterministicSocketData* data, int run_before_task) 833 DataRunnerObserver(DeterministicSocketData* data, int run_before_task)
754 : data_(data), 834 : data_(data), run_before_task_(run_before_task), current_task_(0) {}
755 run_before_task_(run_before_task),
756 current_task_(0) { }
757 835
758 virtual void WillProcessTask(const base::PendingTask& pending_task) OVERRIDE { 836 virtual void WillProcessTask(const base::PendingTask& pending_task) OVERRIDE {
759 ++current_task_; 837 ++current_task_;
760 if (current_task_ == run_before_task_) { 838 if (current_task_ == run_before_task_) {
761 data_->Run(); 839 data_->Run();
762 base::MessageLoop::current()->RemoveTaskObserver(this); 840 base::MessageLoop::current()->RemoveTaskObserver(this);
763 } 841 }
764 } 842 }
765 843
766 virtual void DidProcessTask(const base::PendingTask& pending_task) OVERRIDE {} 844 virtual void DidProcessTask(const base::PendingTask& pending_task) OVERRIDE {}
(...skipping 14 matching lines...) Expand all
781 // determines this host is probably capable of pipelining. 859 // determines this host is probably capable of pipelining.
782 // 4. All of the hosts' pipelines are notified they have capacity in a loop. 860 // 4. All of the hosts' pipelines are notified they have capacity in a loop.
783 // 5. On the first iteration, the first pipeline is opened up to accept new 861 // 5. On the first iteration, the first pipeline is opened up to accept new
784 // requests and steals the request from step #2. 862 // requests and steals the request from step #2.
785 // 6. The pipeline from #2 is deleted because it has no streams. 863 // 6. The pipeline from #2 is deleted because it has no streams.
786 // 7. On the second iteration, the host tries to notify the pipeline from step 864 // 7. On the second iteration, the host tries to notify the pipeline from step
787 // #2 that it has capacity. This is a use-after-free. 865 // #2 that it has capacity. This is a use-after-free.
788 Initialize(false); 866 Initialize(false);
789 867
790 MockWrite writes[] = { 868 MockWrite writes[] = {
791 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" 869 MockWrite(SYNCHRONOUS,
792 "Host: localhost\r\n" 870 0,
793 "Connection: keep-alive\r\n\r\n"), 871 "GET /one.html HTTP/1.1\r\n"
794 MockWrite(ASYNC, 3, "GET /two.html HTTP/1.1\r\n" 872 "Host: localhost\r\n"
795 "Host: localhost\r\n" 873 "Connection: keep-alive\r\n\r\n"),
796 "Connection: keep-alive\r\n\r\n"), 874 MockWrite(ASYNC,
875 3,
876 "GET /two.html HTTP/1.1\r\n"
877 "Host: localhost\r\n"
878 "Connection: keep-alive\r\n\r\n"),
797 }; 879 };
798 MockRead reads[] = { 880 MockRead reads[] = {
799 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 881 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
800 MockRead(ASYNC, 2, "Content-Length: 8\r\n\r\n"), 882 MockRead(ASYNC, 2, "Content-Length: 8\r\n\r\n"),
801 MockRead(SYNCHRONOUS, 4, "one.html"), 883 MockRead(SYNCHRONOUS, 4, "one.html"),
802 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"), 884 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
803 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"), 885 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"),
804 MockRead(SYNCHRONOUS, 7, "two.html"), 886 MockRead(SYNCHRONOUS, 7, "two.html"),
805 }; 887 };
806 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 888 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
807 889
808 AddExpectedConnection(NULL, 0, NULL, 0); 890 AddExpectedConnection(NULL, 0, NULL, 0);
809 891
810 HttpNetworkTransaction one_transaction(DEFAULT_PRIORITY, session_.get()); 892 HttpNetworkTransaction one_transaction(DEFAULT_PRIORITY, session_.get());
811 TestCompletionCallback one_callback; 893 TestCompletionCallback one_callback;
812 EXPECT_EQ(ERR_IO_PENDING, 894 EXPECT_EQ(
813 one_transaction.Start(GetRequestInfo("one.html"), 895 ERR_IO_PENDING,
814 one_callback.callback(), BoundNetLog())); 896 one_transaction.Start(
897 GetRequestInfo("one.html"), one_callback.callback(), BoundNetLog()));
815 898
816 data_vector_[0]->SetStop(2); 899 data_vector_[0]->SetStop(2);
817 data_vector_[0]->Run(); 900 data_vector_[0]->Run();
818 901
819 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get()); 902 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
820 TestCompletionCallback two_callback; 903 TestCompletionCallback two_callback;
821 EXPECT_EQ(ERR_IO_PENDING, 904 EXPECT_EQ(
822 two_transaction.Start(GetRequestInfo("two.html"), 905 ERR_IO_PENDING,
823 two_callback.callback(), BoundNetLog())); 906 two_transaction.Start(
907 GetRequestInfo("two.html"), two_callback.callback(), BoundNetLog()));
824 // Posted tasks should be: 908 // Posted tasks should be:
825 // 1. MockHostResolverBase::ResolveNow 909 // 1. MockHostResolverBase::ResolveNow
826 // 2. HttpStreamFactoryImpl::Job::OnStreamReadyCallback for job 1 910 // 2. HttpStreamFactoryImpl::Job::OnStreamReadyCallback for job 1
827 // 3. HttpStreamFactoryImpl::Job::OnStreamReadyCallback for job 2 911 // 3. HttpStreamFactoryImpl::Job::OnStreamReadyCallback for job 2
828 // 912 //
829 // We need to make sure that the response that triggers OnPipelineFeedback(OK) 913 // We need to make sure that the response that triggers OnPipelineFeedback(OK)
830 // is called in between when task #3 is scheduled and when it runs. The 914 // is called in between when task #3 is scheduled and when it runs. The
831 // DataRunnerObserver does that. 915 // DataRunnerObserver does that.
832 DataRunnerObserver observer(data_vector_[0], 3); 916 DataRunnerObserver observer(data_vector_[0], 3);
833 base::MessageLoop::current()->AddTaskObserver(&observer); 917 base::MessageLoop::current()->AddTaskObserver(&observer);
(...skipping 12 matching lines...) Expand all
846 930
847 DeterministicSocketData data(NULL, 0, NULL, 0); 931 DeterministicSocketData data(NULL, 0, NULL, 0);
848 data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_REFUSED)); 932 data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_REFUSED));
849 factory_.AddSocketDataProvider(&data); 933 factory_.AddSocketDataProvider(&data);
850 934
851 DeterministicSocketData data2(NULL, 0, NULL, 0); 935 DeterministicSocketData data2(NULL, 0, NULL, 0);
852 data2.set_connect_data(MockConnect(ASYNC, ERR_FAILED)); 936 data2.set_connect_data(MockConnect(ASYNC, ERR_FAILED));
853 factory_.AddSocketDataProvider(&data2); 937 factory_.AddSocketDataProvider(&data2);
854 938
855 HttpNetworkTransaction transaction(DEFAULT_PRIORITY, session_.get()); 939 HttpNetworkTransaction transaction(DEFAULT_PRIORITY, session_.get());
856 EXPECT_EQ(ERR_IO_PENDING, 940 EXPECT_EQ(
857 transaction.Start(GetRequestInfo("test.html"), callback_.callback(), 941 ERR_IO_PENDING,
858 BoundNetLog())); 942 transaction.Start(
943 GetRequestInfo("test.html"), callback_.callback(), BoundNetLog()));
859 944
860 proxy_config_service_->IncrementConfigId(); 945 proxy_config_service_->IncrementConfigId();
861 946
862 EXPECT_EQ(ERR_FAILED, callback_.WaitForResult()); 947 EXPECT_EQ(ERR_FAILED, callback_.WaitForResult());
863 } 948 }
864 949
865 TEST_F(HttpPipelinedNetworkTransactionTest, ForcedPipelineSharesConnection) { 950 TEST_F(HttpPipelinedNetworkTransactionTest, ForcedPipelineSharesConnection) {
866 Initialize(true); 951 Initialize(true);
867 952
868 MockWrite writes[] = { 953 MockWrite writes[] = {
869 MockWrite(ASYNC, 0, "GET /one.html HTTP/1.1\r\n" 954 MockWrite(ASYNC,
870 "Host: localhost\r\n" 955 0,
871 "Connection: keep-alive\r\n\r\n" 956 "GET /one.html HTTP/1.1\r\n"
872 "GET /two.html HTTP/1.1\r\n" 957 "Host: localhost\r\n"
873 "Host: localhost\r\n" 958 "Connection: keep-alive\r\n\r\n"
874 "Connection: keep-alive\r\n\r\n"), 959 "GET /two.html HTTP/1.1\r\n"
960 "Host: localhost\r\n"
961 "Connection: keep-alive\r\n\r\n"),
875 }; 962 };
876 MockRead reads[] = { 963 MockRead reads[] = {
877 MockRead(ASYNC, 1, "HTTP/1.1 200 OK\r\n"), 964 MockRead(ASYNC, 1, "HTTP/1.1 200 OK\r\n"),
878 MockRead(ASYNC, 2, "Content-Length: 8\r\n\r\n"), 965 MockRead(ASYNC, 2, "Content-Length: 8\r\n\r\n"),
879 MockRead(ASYNC, 3, "one.html"), 966 MockRead(ASYNC, 3, "one.html"),
880 MockRead(ASYNC, 4, "HTTP/1.1 200 OK\r\n"), 967 MockRead(ASYNC, 4, "HTTP/1.1 200 OK\r\n"),
881 MockRead(ASYNC, 5, "Content-Length: 8\r\n\r\n"), 968 MockRead(ASYNC, 5, "Content-Length: 8\r\n\r\n"),
882 MockRead(ASYNC, 6, "two.html"), 969 MockRead(ASYNC, 6, "two.html"),
883 }; 970 };
884 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 971 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
885 972
886 scoped_ptr<HttpNetworkTransaction> one_transaction( 973 scoped_ptr<HttpNetworkTransaction> one_transaction(
887 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 974 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
888 TestCompletionCallback one_callback; 975 TestCompletionCallback one_callback;
889 EXPECT_EQ(ERR_IO_PENDING, 976 EXPECT_EQ(
890 one_transaction->Start(GetRequestInfo("one.html"), 977 ERR_IO_PENDING,
891 one_callback.callback(), BoundNetLog())); 978 one_transaction->Start(
979 GetRequestInfo("one.html"), one_callback.callback(), BoundNetLog()));
892 980
893 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get()); 981 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
894 TestCompletionCallback two_callback; 982 TestCompletionCallback two_callback;
895 EXPECT_EQ(ERR_IO_PENDING, 983 EXPECT_EQ(
896 two_transaction.Start(GetRequestInfo("two.html"), 984 ERR_IO_PENDING,
897 two_callback.callback(), BoundNetLog())); 985 two_transaction.Start(
986 GetRequestInfo("two.html"), two_callback.callback(), BoundNetLog()));
898 987
899 data_vector_[0]->RunFor(3); // Send + 2 lines of headers. 988 data_vector_[0]->RunFor(3); // Send + 2 lines of headers.
900 EXPECT_EQ(OK, one_callback.WaitForResult()); 989 EXPECT_EQ(OK, one_callback.WaitForResult());
901 ExpectResponse("one.html", *one_transaction.get(), ASYNC); 990 ExpectResponse("one.html", *one_transaction.get(), ASYNC);
902 one_transaction.reset(); 991 one_transaction.reset();
903 992
904 data_vector_[0]->RunFor(2); // 2 lines of headers. 993 data_vector_[0]->RunFor(2); // 2 lines of headers.
905 EXPECT_EQ(OK, two_callback.WaitForResult()); 994 EXPECT_EQ(OK, two_callback.WaitForResult());
906 ExpectResponse("two.html", two_transaction, ASYNC); 995 ExpectResponse("two.html", two_transaction, ASYNC);
907 } 996 }
908 997
909 TEST_F(HttpPipelinedNetworkTransactionTest, 998 TEST_F(HttpPipelinedNetworkTransactionTest,
910 ForcedPipelineConnectionErrorFailsBoth) { 999 ForcedPipelineConnectionErrorFailsBoth) {
911 Initialize(true); 1000 Initialize(true);
912 1001
913 DeterministicSocketData data(NULL, 0, NULL, 0); 1002 DeterministicSocketData data(NULL, 0, NULL, 0);
914 data.set_connect_data(MockConnect(ASYNC, ERR_FAILED)); 1003 data.set_connect_data(MockConnect(ASYNC, ERR_FAILED));
915 factory_.AddSocketDataProvider(&data); 1004 factory_.AddSocketDataProvider(&data);
916 1005
917 scoped_ptr<HttpNetworkTransaction> one_transaction( 1006 scoped_ptr<HttpNetworkTransaction> one_transaction(
918 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 1007 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
919 TestCompletionCallback one_callback; 1008 TestCompletionCallback one_callback;
920 EXPECT_EQ(ERR_IO_PENDING, 1009 EXPECT_EQ(
921 one_transaction->Start(GetRequestInfo("one.html"), 1010 ERR_IO_PENDING,
922 one_callback.callback(), BoundNetLog())); 1011 one_transaction->Start(
1012 GetRequestInfo("one.html"), one_callback.callback(), BoundNetLog()));
923 1013
924 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get()); 1014 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
925 TestCompletionCallback two_callback; 1015 TestCompletionCallback two_callback;
926 EXPECT_EQ(ERR_IO_PENDING, 1016 EXPECT_EQ(
927 two_transaction.Start(GetRequestInfo("two.html"), 1017 ERR_IO_PENDING,
928 two_callback.callback(), BoundNetLog())); 1018 two_transaction.Start(
1019 GetRequestInfo("two.html"), two_callback.callback(), BoundNetLog()));
929 1020
930 data.Run(); 1021 data.Run();
931 EXPECT_EQ(ERR_FAILED, one_callback.WaitForResult()); 1022 EXPECT_EQ(ERR_FAILED, one_callback.WaitForResult());
932 EXPECT_EQ(ERR_FAILED, two_callback.WaitForResult()); 1023 EXPECT_EQ(ERR_FAILED, two_callback.WaitForResult());
933 } 1024 }
934 1025
935 TEST_F(HttpPipelinedNetworkTransactionTest, ForcedPipelineEvictionIsFatal) { 1026 TEST_F(HttpPipelinedNetworkTransactionTest, ForcedPipelineEvictionIsFatal) {
936 Initialize(true); 1027 Initialize(true);
937 1028
938 MockWrite writes[] = { 1029 MockWrite writes[] = {
939 MockWrite(ASYNC, 0, "GET /one.html HTTP/1.1\r\n" 1030 MockWrite(ASYNC,
940 "Host: localhost\r\n" 1031 0,
941 "Connection: keep-alive\r\n\r\n" 1032 "GET /one.html HTTP/1.1\r\n"
942 "GET /two.html HTTP/1.1\r\n" 1033 "Host: localhost\r\n"
943 "Host: localhost\r\n" 1034 "Connection: keep-alive\r\n\r\n"
944 "Connection: keep-alive\r\n\r\n"), 1035 "GET /two.html HTTP/1.1\r\n"
1036 "Host: localhost\r\n"
1037 "Connection: keep-alive\r\n\r\n"),
945 }; 1038 };
946 MockRead reads[] = { 1039 MockRead reads[] = {
947 MockRead(ASYNC, ERR_FAILED, 1), 1040 MockRead(ASYNC, ERR_FAILED, 1),
948 }; 1041 };
949 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); 1042 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
950 1043
951 scoped_ptr<HttpNetworkTransaction> one_transaction( 1044 scoped_ptr<HttpNetworkTransaction> one_transaction(
952 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 1045 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
953 TestCompletionCallback one_callback; 1046 TestCompletionCallback one_callback;
954 EXPECT_EQ(ERR_IO_PENDING, 1047 EXPECT_EQ(
955 one_transaction->Start(GetRequestInfo("one.html"), 1048 ERR_IO_PENDING,
956 one_callback.callback(), BoundNetLog())); 1049 one_transaction->Start(
1050 GetRequestInfo("one.html"), one_callback.callback(), BoundNetLog()));
957 1051
958 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get()); 1052 HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
959 TestCompletionCallback two_callback; 1053 TestCompletionCallback two_callback;
960 EXPECT_EQ(ERR_IO_PENDING, 1054 EXPECT_EQ(
961 two_transaction.Start(GetRequestInfo("two.html"), 1055 ERR_IO_PENDING,
962 two_callback.callback(), BoundNetLog())); 1056 two_transaction.Start(
1057 GetRequestInfo("two.html"), two_callback.callback(), BoundNetLog()));
963 1058
964 data_vector_[0]->RunFor(2); 1059 data_vector_[0]->RunFor(2);
965 EXPECT_EQ(ERR_FAILED, one_callback.WaitForResult()); 1060 EXPECT_EQ(ERR_FAILED, one_callback.WaitForResult());
966 one_transaction.reset(); 1061 one_transaction.reset();
967 EXPECT_EQ(ERR_PIPELINE_EVICTION, two_callback.WaitForResult()); 1062 EXPECT_EQ(ERR_PIPELINE_EVICTION, two_callback.WaitForResult());
968 } 1063 }
969 1064
970 TEST_F(HttpPipelinedNetworkTransactionTest, ForcedPipelineOrder) { 1065 TEST_F(HttpPipelinedNetworkTransactionTest, ForcedPipelineOrder) {
971 Initialize(true); 1066 Initialize(true);
972 1067
973 MockWrite writes[] = { 1068 MockWrite writes[] = {
974 MockWrite(ASYNC, 0, 1069 MockWrite(ASYNC,
975 "GET /one.html HTTP/1.1\r\n" 1070 0,
976 "Host: localhost\r\n" 1071 "GET /one.html HTTP/1.1\r\n"
977 "Connection: keep-alive\r\n\r\n" 1072 "Host: localhost\r\n"
978 "GET /two.html HTTP/1.1\r\n" 1073 "Connection: keep-alive\r\n\r\n"
979 "Host: localhost\r\n" 1074 "GET /two.html HTTP/1.1\r\n"
980 "Connection: keep-alive\r\n\r\n" 1075 "Host: localhost\r\n"
981 "GET /three.html HTTP/1.1\r\n" 1076 "Connection: keep-alive\r\n\r\n"
982 "Host: localhost\r\n" 1077 "GET /three.html HTTP/1.1\r\n"
983 "Connection: keep-alive\r\n\r\n" 1078 "Host: localhost\r\n"
984 "GET /four.html HTTP/1.1\r\n" 1079 "Connection: keep-alive\r\n\r\n"
985 "Host: localhost\r\n" 1080 "GET /four.html HTTP/1.1\r\n"
986 "Connection: keep-alive\r\n\r\n" 1081 "Host: localhost\r\n"
987 ), 1082 "Connection: keep-alive\r\n\r\n"),
988 }; 1083 };
989 MockRead reads[] = { 1084 MockRead reads[] = {
990 MockRead(ASYNC, ERR_FAILED, 1), 1085 MockRead(ASYNC, ERR_FAILED, 1),
991 }; 1086 };
992 DeterministicSocketData data( 1087 DeterministicSocketData data(
993 reads, arraysize(reads), writes, arraysize(writes)); 1088 reads, arraysize(reads), writes, arraysize(writes));
994 data.set_connect_data(MockConnect(ASYNC, OK)); 1089 data.set_connect_data(MockConnect(ASYNC, OK));
995 factory_.AddSocketDataProvider(&data); 1090 factory_.AddSocketDataProvider(&data);
996 1091
997 scoped_ptr<HttpNetworkTransaction> one_transaction( 1092 scoped_ptr<HttpNetworkTransaction> one_transaction(
998 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 1093 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
999 TestCompletionCallback one_callback; 1094 TestCompletionCallback one_callback;
1000 EXPECT_EQ(ERR_IO_PENDING, 1095 EXPECT_EQ(
1001 one_transaction->Start(GetRequestInfo("one.html"), 1096 ERR_IO_PENDING,
1002 one_callback.callback(), BoundNetLog())); 1097 one_transaction->Start(
1098 GetRequestInfo("one.html"), one_callback.callback(), BoundNetLog()));
1003 1099
1004 scoped_ptr<HttpNetworkTransaction> two_transaction( 1100 scoped_ptr<HttpNetworkTransaction> two_transaction(
1005 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 1101 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1006 TestCompletionCallback two_callback; 1102 TestCompletionCallback two_callback;
1007 EXPECT_EQ(ERR_IO_PENDING, 1103 EXPECT_EQ(
1008 two_transaction->Start(GetRequestInfo("two.html"), 1104 ERR_IO_PENDING,
1009 two_callback.callback(), BoundNetLog())); 1105 two_transaction->Start(
1106 GetRequestInfo("two.html"), two_callback.callback(), BoundNetLog()));
1010 1107
1011 scoped_ptr<HttpNetworkTransaction> three_transaction( 1108 scoped_ptr<HttpNetworkTransaction> three_transaction(
1012 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 1109 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1013 TestCompletionCallback three_callback; 1110 TestCompletionCallback three_callback;
1014 EXPECT_EQ(ERR_IO_PENDING, 1111 EXPECT_EQ(ERR_IO_PENDING,
1015 three_transaction->Start(GetRequestInfo("three.html"), 1112 three_transaction->Start(GetRequestInfo("three.html"),
1016 three_callback.callback(), BoundNetLog())); 1113 three_callback.callback(),
1114 BoundNetLog()));
1017 1115
1018 scoped_ptr<HttpNetworkTransaction> four_transaction( 1116 scoped_ptr<HttpNetworkTransaction> four_transaction(
1019 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 1117 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1020 TestCompletionCallback four_callback; 1118 TestCompletionCallback four_callback;
1021 EXPECT_EQ(ERR_IO_PENDING, 1119 EXPECT_EQ(ERR_IO_PENDING,
1022 four_transaction->Start(GetRequestInfo("four.html"), 1120 four_transaction->Start(GetRequestInfo("four.html"),
1023 four_callback.callback(), BoundNetLog())); 1121 four_callback.callback(),
1122 BoundNetLog()));
1024 1123
1025 data.RunFor(3); 1124 data.RunFor(3);
1026 EXPECT_EQ(ERR_FAILED, one_callback.WaitForResult()); 1125 EXPECT_EQ(ERR_FAILED, one_callback.WaitForResult());
1027 one_transaction.reset(); 1126 one_transaction.reset();
1028 EXPECT_EQ(ERR_PIPELINE_EVICTION, two_callback.WaitForResult()); 1127 EXPECT_EQ(ERR_PIPELINE_EVICTION, two_callback.WaitForResult());
1029 two_transaction.reset(); 1128 two_transaction.reset();
1030 EXPECT_EQ(ERR_PIPELINE_EVICTION, three_callback.WaitForResult()); 1129 EXPECT_EQ(ERR_PIPELINE_EVICTION, three_callback.WaitForResult());
1031 three_transaction.reset(); 1130 three_transaction.reset();
1032 EXPECT_EQ(ERR_PIPELINE_EVICTION, four_callback.WaitForResult()); 1131 EXPECT_EQ(ERR_PIPELINE_EVICTION, four_callback.WaitForResult());
1033 } 1132 }
1034 1133
1035 } // anonymous namespace 1134 } // anonymous namespace
1036 1135
1037 } // namespace net 1136 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698