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_vector.h" | 8 #include "base/memory/scoped_vector.h" |
9 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 DeterministicSocketData* data = new DeterministicSocketData( | 106 DeterministicSocketData* data = new DeterministicSocketData( |
107 reads, reads_count, writes, writes_count); | 107 reads, reads_count, writes, writes_count); |
108 data->set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 108 data->set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
109 if (reads_count || writes_count) { | 109 if (reads_count || writes_count) { |
110 data->StopAfter(reads_count + writes_count); | 110 data->StopAfter(reads_count + writes_count); |
111 } | 111 } |
112 factory_.AddSocketDataProvider(data); | 112 factory_.AddSocketDataProvider(data); |
113 data_vector_.push_back(data); | 113 data_vector_.push_back(data); |
114 } | 114 } |
115 | 115 |
116 HttpRequestInfo* GetRequestInfo(const char* filename) { | 116 enum RequestInfoOptions { |
| 117 REQUEST_DEFAULT, |
| 118 REQUEST_MAIN_RESOURCE, |
| 119 }; |
| 120 |
| 121 HttpRequestInfo* GetRequestInfo( |
| 122 const char* filename, RequestInfoOptions options = REQUEST_DEFAULT) { |
117 std::string url = StringPrintf("http://localhost/%s", filename); | 123 std::string url = StringPrintf("http://localhost/%s", filename); |
118 HttpRequestInfo* request_info = new HttpRequestInfo; | 124 HttpRequestInfo* request_info = new HttpRequestInfo; |
119 request_info->url = GURL(url); | 125 request_info->url = GURL(url); |
120 request_info->method = "GET"; | 126 request_info->method = "GET"; |
| 127 if (options == REQUEST_MAIN_RESOURCE) { |
| 128 request_info->load_flags = LOAD_MAIN_FRAME; |
| 129 } |
121 request_info_vector_.push_back(request_info); | 130 request_info_vector_.push_back(request_info); |
122 return request_info; | 131 return request_info; |
123 } | 132 } |
124 | 133 |
125 void ExpectResponse(const std::string& expected, | 134 void ExpectResponse(const std::string& expected, |
126 HttpNetworkTransaction& transaction, | 135 HttpNetworkTransaction& transaction, |
127 IoMode io_mode) { | 136 IoMode io_mode) { |
128 scoped_refptr<IOBuffer> buffer(new IOBuffer(expected.size())); | 137 scoped_refptr<IOBuffer> buffer(new IOBuffer(expected.size())); |
129 if (io_mode == ASYNC) { | 138 if (io_mode == ASYNC) { |
130 EXPECT_EQ(ERR_IO_PENDING, transaction.Read(buffer.get(), expected.size(), | 139 EXPECT_EQ(ERR_IO_PENDING, transaction.Read(buffer.get(), expected.size(), |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 data_vector_[data_index]->SetStop(10); | 178 data_vector_[data_index]->SetStop(10); |
170 std::string actual(buffer->data(), 8); | 179 std::string actual(buffer->data(), 8); |
171 EXPECT_THAT(actual, StrEq("one.html")); | 180 EXPECT_THAT(actual, StrEq("one.html")); |
172 EXPECT_EQ(OK, one_transaction->Read(buffer.get(), 8, | 181 EXPECT_EQ(OK, one_transaction->Read(buffer.get(), 8, |
173 one_read_callback.callback())); | 182 one_read_callback.callback())); |
174 | 183 |
175 EXPECT_EQ(OK, two_callback.WaitForResult()); | 184 EXPECT_EQ(OK, two_callback.WaitForResult()); |
176 ExpectResponse("two.html", two_transaction, SYNCHRONOUS); | 185 ExpectResponse("two.html", two_transaction, SYNCHRONOUS); |
177 } | 186 } |
178 | 187 |
179 void CompleteFourRequests() { | 188 void CompleteFourRequests(RequestInfoOptions options) { |
180 scoped_ptr<HttpNetworkTransaction> one_transaction( | 189 scoped_ptr<HttpNetworkTransaction> one_transaction( |
181 new HttpNetworkTransaction(session_.get())); | 190 new HttpNetworkTransaction(session_.get())); |
182 TestCompletionCallback one_callback; | 191 TestCompletionCallback one_callback; |
183 EXPECT_EQ(ERR_IO_PENDING, | 192 EXPECT_EQ(ERR_IO_PENDING, |
184 one_transaction->Start(GetRequestInfo("one.html"), | 193 one_transaction->Start(GetRequestInfo("one.html", options), |
185 one_callback.callback(), BoundNetLog())); | 194 one_callback.callback(), BoundNetLog())); |
186 EXPECT_EQ(OK, one_callback.WaitForResult()); | 195 EXPECT_EQ(OK, one_callback.WaitForResult()); |
187 | 196 |
188 HttpNetworkTransaction two_transaction(session_.get()); | 197 HttpNetworkTransaction two_transaction(session_.get()); |
189 TestCompletionCallback two_callback; | 198 TestCompletionCallback two_callback; |
190 EXPECT_EQ(ERR_IO_PENDING, | 199 EXPECT_EQ(ERR_IO_PENDING, |
191 two_transaction.Start(GetRequestInfo("two.html"), | 200 two_transaction.Start(GetRequestInfo("two.html", options), |
192 two_callback.callback(), BoundNetLog())); | 201 two_callback.callback(), BoundNetLog())); |
193 | 202 |
194 HttpNetworkTransaction three_transaction(session_.get()); | 203 HttpNetworkTransaction three_transaction(session_.get()); |
195 TestCompletionCallback three_callback; | 204 TestCompletionCallback three_callback; |
196 EXPECT_EQ(ERR_IO_PENDING, | 205 EXPECT_EQ(ERR_IO_PENDING, |
197 three_transaction.Start(GetRequestInfo("three.html"), | 206 three_transaction.Start(GetRequestInfo("three.html", options), |
198 three_callback.callback(), | 207 three_callback.callback(), |
199 BoundNetLog())); | 208 BoundNetLog())); |
200 | 209 |
201 HttpNetworkTransaction four_transaction(session_.get()); | 210 HttpNetworkTransaction four_transaction(session_.get()); |
202 TestCompletionCallback four_callback; | 211 TestCompletionCallback four_callback; |
203 EXPECT_EQ(ERR_IO_PENDING, | 212 EXPECT_EQ(ERR_IO_PENDING, |
204 four_transaction.Start(GetRequestInfo("four.html"), | 213 four_transaction.Start(GetRequestInfo("four.html", options), |
205 four_callback.callback(), BoundNetLog())); | 214 four_callback.callback(), BoundNetLog())); |
206 | 215 |
207 ExpectResponse("one.html", *one_transaction.get(), SYNCHRONOUS); | 216 ExpectResponse("one.html", *one_transaction.get(), SYNCHRONOUS); |
208 EXPECT_EQ(OK, two_callback.WaitForResult()); | 217 EXPECT_EQ(OK, two_callback.WaitForResult()); |
209 ExpectResponse("two.html", two_transaction, SYNCHRONOUS); | 218 ExpectResponse("two.html", two_transaction, SYNCHRONOUS); |
210 EXPECT_EQ(OK, three_callback.WaitForResult()); | 219 EXPECT_EQ(OK, three_callback.WaitForResult()); |
211 ExpectResponse("three.html", three_transaction, SYNCHRONOUS); | 220 ExpectResponse("three.html", three_transaction, SYNCHRONOUS); |
212 | 221 |
213 one_transaction.reset(); | 222 one_transaction.reset(); |
214 EXPECT_EQ(OK, four_callback.WaitForResult()); | 223 EXPECT_EQ(OK, four_callback.WaitForResult()); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 MockRead(SYNCHRONOUS, 8, "two.html"), | 318 MockRead(SYNCHRONOUS, 8, "two.html"), |
310 MockRead(SYNCHRONOUS, 9, "HTTP/1.1 200 OK\r\n"), | 319 MockRead(SYNCHRONOUS, 9, "HTTP/1.1 200 OK\r\n"), |
311 MockRead(SYNCHRONOUS, 10, "Content-Length: 10\r\n\r\n"), | 320 MockRead(SYNCHRONOUS, 10, "Content-Length: 10\r\n\r\n"), |
312 MockRead(SYNCHRONOUS, 11, "three.html"), | 321 MockRead(SYNCHRONOUS, 11, "three.html"), |
313 MockRead(SYNCHRONOUS, 13, "HTTP/1.1 200 OK\r\n"), | 322 MockRead(SYNCHRONOUS, 13, "HTTP/1.1 200 OK\r\n"), |
314 MockRead(SYNCHRONOUS, 14, "Content-Length: 9\r\n\r\n"), | 323 MockRead(SYNCHRONOUS, 14, "Content-Length: 9\r\n\r\n"), |
315 MockRead(SYNCHRONOUS, 15, "four.html"), | 324 MockRead(SYNCHRONOUS, 15, "four.html"), |
316 }; | 325 }; |
317 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); | 326 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); |
318 | 327 |
319 CompleteFourRequests(); | 328 CompleteFourRequests(REQUEST_DEFAULT); |
320 | 329 |
321 ClientSocketPoolManager::set_max_sockets_per_group( | 330 ClientSocketPoolManager::set_max_sockets_per_group( |
322 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_sockets); | 331 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_sockets); |
| 332 } |
| 333 |
| 334 TEST_F(HttpPipelinedNetworkTransactionTest, WontPipelineMainResource) { |
| 335 int old_max_sockets = ClientSocketPoolManager::max_sockets_per_group( |
| 336 HttpNetworkSession::NORMAL_SOCKET_POOL); |
| 337 ClientSocketPoolManager::set_max_sockets_per_group( |
| 338 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 339 Initialize(false); |
| 340 |
| 341 MockWrite writes[] = { |
| 342 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" |
| 343 "Host: localhost\r\n" |
| 344 "Connection: keep-alive\r\n\r\n"), |
| 345 MockWrite(SYNCHRONOUS, 4, "GET /two.html HTTP/1.1\r\n" |
| 346 "Host: localhost\r\n" |
| 347 "Connection: keep-alive\r\n\r\n"), |
| 348 MockWrite(SYNCHRONOUS, 8, "GET /three.html HTTP/1.1\r\n" |
| 349 "Host: localhost\r\n" |
| 350 "Connection: keep-alive\r\n\r\n"), |
| 351 MockWrite(SYNCHRONOUS, 12, "GET /four.html HTTP/1.1\r\n" |
| 352 "Host: localhost\r\n" |
| 353 "Connection: keep-alive\r\n\r\n"), |
| 354 }; |
| 355 MockRead reads[] = { |
| 356 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), |
| 357 MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"), |
| 358 MockRead(SYNCHRONOUS, 3, "one.html"), |
| 359 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"), |
| 360 MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"), |
| 361 MockRead(SYNCHRONOUS, 7, "two.html"), |
| 362 MockRead(SYNCHRONOUS, 9, "HTTP/1.1 200 OK\r\n"), |
| 363 MockRead(SYNCHRONOUS, 10, "Content-Length: 10\r\n\r\n"), |
| 364 MockRead(SYNCHRONOUS, 11, "three.html"), |
| 365 MockRead(SYNCHRONOUS, 13, "HTTP/1.1 200 OK\r\n"), |
| 366 MockRead(SYNCHRONOUS, 14, "Content-Length: 9\r\n\r\n"), |
| 367 MockRead(SYNCHRONOUS, 15, "four.html"), |
| 368 }; |
| 369 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); |
| 370 |
| 371 CompleteFourRequests(REQUEST_MAIN_RESOURCE); |
| 372 |
| 373 ClientSocketPoolManager::set_max_sockets_per_group( |
| 374 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_sockets); |
323 } | 375 } |
324 | 376 |
325 TEST_F(HttpPipelinedNetworkTransactionTest, UnknownSizeEvictsToNewPipeline) { | 377 TEST_F(HttpPipelinedNetworkTransactionTest, UnknownSizeEvictsToNewPipeline) { |
326 Initialize(false); | 378 Initialize(false); |
327 | 379 |
328 MockWrite writes[] = { | 380 MockWrite writes[] = { |
329 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" | 381 MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n" |
330 "Host: localhost\r\n" | 382 "Host: localhost\r\n" |
331 "Connection: keep-alive\r\n\r\n"), | 383 "Connection: keep-alive\r\n\r\n"), |
332 }; | 384 }; |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
662 MockRead(SYNCHRONOUS, 15, "four.html"), | 714 MockRead(SYNCHRONOUS, 15, "four.html"), |
663 MockRead(ASYNC, 18, "HTTP/1.1 200 OK\r\n"), | 715 MockRead(ASYNC, 18, "HTTP/1.1 200 OK\r\n"), |
664 MockRead(ASYNC, 19, "Content-Length: 24\r\n\r\n"), | 716 MockRead(ASYNC, 19, "Content-Length: 24\r\n\r\n"), |
665 MockRead(SYNCHRONOUS, 20, "second-pipeline-one.html"), | 717 MockRead(SYNCHRONOUS, 20, "second-pipeline-one.html"), |
666 MockRead(SYNCHRONOUS, 21, "HTTP/1.1 200 OK\r\n"), | 718 MockRead(SYNCHRONOUS, 21, "HTTP/1.1 200 OK\r\n"), |
667 MockRead(SYNCHRONOUS, 22, "Content-Length: 24\r\n\r\n"), | 719 MockRead(SYNCHRONOUS, 22, "Content-Length: 24\r\n\r\n"), |
668 MockRead(SYNCHRONOUS, 23, "second-pipeline-two.html"), | 720 MockRead(SYNCHRONOUS, 23, "second-pipeline-two.html"), |
669 }; | 721 }; |
670 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); | 722 AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes)); |
671 | 723 |
672 CompleteFourRequests(); | 724 CompleteFourRequests(REQUEST_DEFAULT); |
673 | 725 |
674 HttpNetworkTransaction second_one_transaction(session_.get()); | 726 HttpNetworkTransaction second_one_transaction(session_.get()); |
675 TestCompletionCallback second_one_callback; | 727 TestCompletionCallback second_one_callback; |
676 EXPECT_EQ(ERR_IO_PENDING, | 728 EXPECT_EQ(ERR_IO_PENDING, |
677 second_one_transaction.Start( | 729 second_one_transaction.Start( |
678 GetRequestInfo("second-pipeline-one.html"), | 730 GetRequestInfo("second-pipeline-one.html"), |
679 second_one_callback.callback(), BoundNetLog())); | 731 second_one_callback.callback(), BoundNetLog())); |
680 MessageLoop::current()->RunAllPending(); | 732 MessageLoop::current()->RunAllPending(); |
681 | 733 |
682 HttpNetworkTransaction second_two_transaction(session_.get()); | 734 HttpNetworkTransaction second_two_transaction(session_.get()); |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
982 EXPECT_EQ(ERR_PIPELINE_EVICTION, two_callback.WaitForResult()); | 1034 EXPECT_EQ(ERR_PIPELINE_EVICTION, two_callback.WaitForResult()); |
983 two_transaction.reset(); | 1035 two_transaction.reset(); |
984 EXPECT_EQ(ERR_PIPELINE_EVICTION, three_callback.WaitForResult()); | 1036 EXPECT_EQ(ERR_PIPELINE_EVICTION, three_callback.WaitForResult()); |
985 three_transaction.reset(); | 1037 three_transaction.reset(); |
986 EXPECT_EQ(ERR_PIPELINE_EVICTION, four_callback.WaitForResult()); | 1038 EXPECT_EQ(ERR_PIPELINE_EVICTION, four_callback.WaitForResult()); |
987 } | 1039 } |
988 | 1040 |
989 } // anonymous namespace | 1041 } // anonymous namespace |
990 | 1042 |
991 } // namespace net | 1043 } // namespace net |
OLD | NEW |