OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |