| 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 |