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

Unified Diff: net/http/http_pipelined_network_transaction_unittest.cc

Issue 275953002: Remove HTTP pipelining support. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix line endings Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/http/http_pipelined_host_test_util.cc ('k') | net/http/http_pipelined_stream.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/http/http_pipelined_network_transaction_unittest.cc
diff --git a/net/http/http_pipelined_network_transaction_unittest.cc b/net/http/http_pipelined_network_transaction_unittest.cc
deleted file mode 100644
index 181895c8d15f720b018cc3fbb5c8c669710ba9e0..0000000000000000000000000000000000000000
--- a/net/http/http_pipelined_network_transaction_unittest.cc
+++ /dev/null
@@ -1,1037 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-
-#include "base/memory/ref_counted.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/memory/scoped_vector.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "net/base/address_list.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-#include "net/base/net_util.h"
-#include "net/base/request_priority.h"
-#include "net/dns/host_cache.h"
-#include "net/dns/mock_host_resolver.h"
-#include "net/http/http_auth_challenge_tokenizer.h"
-#include "net/http/http_auth_handler_mock.h"
-#include "net/http/http_network_session.h"
-#include "net/http/http_network_transaction.h"
-#include "net/http/http_request_info.h"
-#include "net/http/http_server_properties_impl.h"
-#include "net/proxy/proxy_config_service.h"
-#include "net/proxy/proxy_service.h"
-#include "net/socket/client_socket_handle.h"
-#include "net/socket/client_socket_pool_histograms.h"
-#include "net/socket/client_socket_pool_manager.h"
-#include "net/socket/socket_test_util.h"
-#include "net/ssl/ssl_config_service_defaults.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using testing::StrEq;
-
-namespace net {
-
-namespace {
-
-class SimpleProxyConfigService : public ProxyConfigService {
- public:
- virtual void AddObserver(Observer* observer) OVERRIDE {
- observer_ = observer;
- }
-
- virtual void RemoveObserver(Observer* observer) OVERRIDE {
- if (observer_ == observer) {
- observer_ = NULL;
- }
- }
-
- virtual ConfigAvailability GetLatestProxyConfig(
- ProxyConfig* config) OVERRIDE {
- *config = config_;
- return CONFIG_VALID;
- }
-
- void IncrementConfigId() {
- config_.set_id(config_.id() + 1);
- observer_->OnProxyConfigChanged(config_, ProxyConfigService::CONFIG_VALID);
- }
-
- private:
- ProxyConfig config_;
- Observer* observer_;
-};
-
-class HttpPipelinedNetworkTransactionTest : public testing::Test {
- public:
- HttpPipelinedNetworkTransactionTest()
- : histograms_("a"),
- pool_(1, 1, &histograms_, &factory_) {
- }
-
- void Initialize(bool force_http_pipelining) {
- // Normally, this code could just go in SetUp(). For a few of these tests,
- // we change the default number of sockets per group. That needs to be done
- // before we construct the HttpNetworkSession.
- proxy_config_service_ = new SimpleProxyConfigService();
- proxy_service_.reset(new ProxyService(proxy_config_service_, NULL, NULL));
- ssl_config_ = new SSLConfigServiceDefaults;
- auth_handler_factory_.reset(new HttpAuthHandlerMock::Factory());
-
- HttpNetworkSession::Params session_params;
- session_params.client_socket_factory = &factory_;
- session_params.proxy_service = proxy_service_.get();
- session_params.host_resolver = &mock_resolver_;
- session_params.ssl_config_service = ssl_config_.get();
- session_params.http_auth_handler_factory = auth_handler_factory_.get();
- session_params.http_server_properties =
- http_server_properties_.GetWeakPtr();
- session_params.force_http_pipelining = force_http_pipelining;
- session_params.http_pipelining_enabled = true;
- session_ = new HttpNetworkSession(session_params);
- }
-
- void AddExpectedConnection(MockRead* reads, size_t reads_count,
- MockWrite* writes, size_t writes_count) {
- DeterministicSocketData* data = new DeterministicSocketData(
- reads, reads_count, writes, writes_count);
- data->set_connect_data(MockConnect(SYNCHRONOUS, OK));
- if (reads_count || writes_count) {
- data->StopAfter(reads_count + writes_count);
- }
- factory_.AddSocketDataProvider(data);
- data_vector_.push_back(data);
- }
-
- enum RequestInfoOptions {
- REQUEST_DEFAULT,
- REQUEST_MAIN_RESOURCE,
- };
-
- HttpRequestInfo* GetRequestInfo(
- const char* filename, RequestInfoOptions options = REQUEST_DEFAULT) {
- std::string url = base::StringPrintf("http://localhost/%s", filename);
- HttpRequestInfo* request_info = new HttpRequestInfo;
- request_info->url = GURL(url);
- request_info->method = "GET";
- if (options == REQUEST_MAIN_RESOURCE) {
- request_info->load_flags = LOAD_MAIN_FRAME;
- }
- request_info_vector_.push_back(request_info);
- return request_info;
- }
-
- void ExpectResponse(const std::string& expected,
- HttpNetworkTransaction& transaction,
- IoMode io_mode) {
- scoped_refptr<IOBuffer> buffer(new IOBuffer(expected.size()));
- if (io_mode == ASYNC) {
- EXPECT_EQ(ERR_IO_PENDING, transaction.Read(buffer.get(), expected.size(),
- callback_.callback()));
- data_vector_[0]->RunFor(1);
- EXPECT_EQ(static_cast<int>(expected.length()), callback_.WaitForResult());
- } else {
- EXPECT_EQ(static_cast<int>(expected.size()),
- transaction.Read(buffer.get(), expected.size(),
- callback_.callback()));
- }
- std::string actual(buffer->data(), expected.size());
- EXPECT_THAT(actual, StrEq(expected));
- EXPECT_EQ(OK, transaction.Read(buffer.get(), expected.size(),
- callback_.callback()));
- }
-
- void CompleteTwoRequests(int data_index, int stop_at_step) {
- scoped_ptr<HttpNetworkTransaction> one_transaction(
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
- TestCompletionCallback one_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- one_transaction->Start(GetRequestInfo("one.html"),
- one_callback.callback(), BoundNetLog()));
- EXPECT_EQ(OK, one_callback.WaitForResult());
-
- HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback two_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- two_transaction.Start(GetRequestInfo("two.html"),
- two_callback.callback(), BoundNetLog()));
-
- TestCompletionCallback one_read_callback;
- scoped_refptr<IOBuffer> buffer(new IOBuffer(8));
- EXPECT_EQ(ERR_IO_PENDING,
- one_transaction->Read(buffer.get(), 8,
- one_read_callback.callback()));
-
- data_vector_[data_index]->SetStop(stop_at_step);
- data_vector_[data_index]->Run();
- EXPECT_EQ(8, one_read_callback.WaitForResult());
- data_vector_[data_index]->SetStop(10);
- std::string actual(buffer->data(), 8);
- EXPECT_THAT(actual, StrEq("one.html"));
- EXPECT_EQ(OK, one_transaction->Read(buffer.get(), 8,
- one_read_callback.callback()));
-
- EXPECT_EQ(OK, two_callback.WaitForResult());
- ExpectResponse("two.html", two_transaction, SYNCHRONOUS);
- }
-
- void CompleteFourRequests(RequestInfoOptions options) {
- scoped_ptr<HttpNetworkTransaction> one_transaction(
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
- TestCompletionCallback one_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- one_transaction->Start(GetRequestInfo("one.html", options),
- one_callback.callback(), BoundNetLog()));
- EXPECT_EQ(OK, one_callback.WaitForResult());
-
- HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback two_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- two_transaction.Start(GetRequestInfo("two.html", options),
- two_callback.callback(), BoundNetLog()));
-
- HttpNetworkTransaction three_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback three_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- three_transaction.Start(GetRequestInfo("three.html", options),
- three_callback.callback(),
- BoundNetLog()));
-
- HttpNetworkTransaction four_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback four_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- four_transaction.Start(GetRequestInfo("four.html", options),
- four_callback.callback(), BoundNetLog()));
-
- ExpectResponse("one.html", *one_transaction.get(), SYNCHRONOUS);
- EXPECT_EQ(OK, two_callback.WaitForResult());
- ExpectResponse("two.html", two_transaction, SYNCHRONOUS);
- EXPECT_EQ(OK, three_callback.WaitForResult());
- ExpectResponse("three.html", three_transaction, SYNCHRONOUS);
-
- one_transaction.reset();
- EXPECT_EQ(OK, four_callback.WaitForResult());
- ExpectResponse("four.html", four_transaction, SYNCHRONOUS);
- }
-
- DeterministicMockClientSocketFactory factory_;
- ClientSocketPoolHistograms histograms_;
- MockTransportClientSocketPool pool_;
- ScopedVector<DeterministicSocketData> data_vector_;
- TestCompletionCallback callback_;
- ScopedVector<HttpRequestInfo> request_info_vector_;
-
- SimpleProxyConfigService* proxy_config_service_;
- scoped_ptr<ProxyService> proxy_service_;
- MockHostResolver mock_resolver_;
- scoped_refptr<SSLConfigService> ssl_config_;
- scoped_ptr<HttpAuthHandlerMock::Factory> auth_handler_factory_;
- HttpServerPropertiesImpl http_server_properties_;
- scoped_refptr<HttpNetworkSession> session_;
-};
-
-TEST_F(HttpPipelinedNetworkTransactionTest, OneRequest) {
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /test.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 9\r\n\r\n"),
- MockRead(SYNCHRONOUS, 3, "test.html"),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- HttpNetworkTransaction transaction(DEFAULT_PRIORITY, session_.get());
- EXPECT_EQ(ERR_IO_PENDING,
- transaction.Start(GetRequestInfo("test.html"), callback_.callback(),
- BoundNetLog()));
- EXPECT_EQ(OK, callback_.WaitForResult());
- ExpectResponse("test.html", transaction, SYNCHRONOUS);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, ReusePipeline) {
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 3, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(ASYNC, 4, "one.html"),
- MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 7, "two.html"),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- CompleteTwoRequests(0, 5);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, ReusesOnSpaceAvailable) {
- int old_max_sockets = ClientSocketPoolManager::max_sockets_per_group(
- HttpNetworkSession::NORMAL_SOCKET_POOL);
- ClientSocketPoolManager::set_max_sockets_per_group(
- HttpNetworkSession::NORMAL_SOCKET_POOL, 1);
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 4, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 7, "GET /three.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 12, "GET /four.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 3, "one.html"),
- MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 8, "two.html"),
- MockRead(SYNCHRONOUS, 9, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 10, "Content-Length: 10\r\n\r\n"),
- MockRead(SYNCHRONOUS, 11, "three.html"),
- MockRead(SYNCHRONOUS, 13, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 14, "Content-Length: 9\r\n\r\n"),
- MockRead(SYNCHRONOUS, 15, "four.html"),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- CompleteFourRequests(REQUEST_DEFAULT);
-
- ClientSocketPoolManager::set_max_sockets_per_group(
- HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_sockets);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, WontPipelineMainResource) {
- int old_max_sockets = ClientSocketPoolManager::max_sockets_per_group(
- HttpNetworkSession::NORMAL_SOCKET_POOL);
- ClientSocketPoolManager::set_max_sockets_per_group(
- HttpNetworkSession::NORMAL_SOCKET_POOL, 1);
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 4, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 8, "GET /three.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 12, "GET /four.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 3, "one.html"),
- MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 7, "two.html"),
- MockRead(SYNCHRONOUS, 9, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 10, "Content-Length: 10\r\n\r\n"),
- MockRead(SYNCHRONOUS, 11, "three.html"),
- MockRead(SYNCHRONOUS, 13, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 14, "Content-Length: 9\r\n\r\n"),
- MockRead(SYNCHRONOUS, 15, "four.html"),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- CompleteFourRequests(REQUEST_MAIN_RESOURCE);
-
- ClientSocketPoolManager::set_max_sockets_per_group(
- HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_sockets);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, UnknownSizeEvictsToNewPipeline) {
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n\r\n"),
- MockRead(ASYNC, 2, "one.html"),
- MockRead(SYNCHRONOUS, OK, 3),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- MockWrite writes2[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads2[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 3, "two.html"),
- };
- AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2));
-
- CompleteTwoRequests(0, 3);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, ConnectionCloseEvictToNewPipeline) {
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 3, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(ASYNC, 4, "one.html"),
- MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 5),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- MockWrite writes2[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads2[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 3, "two.html"),
- };
- AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2));
-
- CompleteTwoRequests(0, 5);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, ErrorEvictsToNewPipeline) {
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 3, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n\r\n"),
- MockRead(SYNCHRONOUS, ERR_FAILED, 2),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- MockWrite writes2[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads2[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 3, "two.html"),
- };
- AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2));
-
- HttpNetworkTransaction one_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback one_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- one_transaction.Start(GetRequestInfo("one.html"),
- one_callback.callback(), BoundNetLog()));
- EXPECT_EQ(OK, one_callback.WaitForResult());
-
- HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback two_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- two_transaction.Start(GetRequestInfo("two.html"),
- two_callback.callback(), BoundNetLog()));
-
- scoped_refptr<IOBuffer> buffer(new IOBuffer(1));
- EXPECT_EQ(ERR_FAILED,
- one_transaction.Read(buffer.get(), 1, callback_.callback()));
- EXPECT_EQ(OK, two_callback.WaitForResult());
- ExpectResponse("two.html", two_transaction, SYNCHRONOUS);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, SendErrorEvictsToNewPipeline) {
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(ASYNC, ERR_FAILED, 0),
- };
- AddExpectedConnection(NULL, 0, writes, arraysize(writes));
-
- MockWrite writes2[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads2[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 3, "two.html"),
- };
- AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2));
-
- HttpNetworkTransaction one_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback one_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- one_transaction.Start(GetRequestInfo("one.html"),
- one_callback.callback(), BoundNetLog()));
-
- HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback two_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- two_transaction.Start(GetRequestInfo("two.html"),
- two_callback.callback(), BoundNetLog()));
-
- data_vector_[0]->RunFor(1);
- EXPECT_EQ(ERR_FAILED, one_callback.WaitForResult());
-
- EXPECT_EQ(OK, two_callback.WaitForResult());
- ExpectResponse("two.html", two_transaction, SYNCHRONOUS);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, RedirectDrained) {
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /redirect.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 3, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 302 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(ASYNC, 4, "redirect"),
- MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 7, "two.html"),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- scoped_ptr<HttpNetworkTransaction> one_transaction(
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
- TestCompletionCallback one_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- one_transaction->Start(GetRequestInfo("redirect.html"),
- one_callback.callback(), BoundNetLog()));
- EXPECT_EQ(OK, one_callback.WaitForResult());
-
- HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback two_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- two_transaction.Start(GetRequestInfo("two.html"),
- two_callback.callback(), BoundNetLog()));
-
- one_transaction.reset();
- data_vector_[0]->RunFor(2);
- data_vector_[0]->SetStop(10);
-
- EXPECT_EQ(OK, two_callback.WaitForResult());
- ExpectResponse("two.html", two_transaction, SYNCHRONOUS);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, BasicHttpAuthentication) {
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 5, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n"
- "Authorization: auth_token\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 401 Authentication Required\r\n"),
- MockRead(SYNCHRONOUS, 2,
- "WWW-Authenticate: Basic realm=\"Secure Area\"\r\n"),
- MockRead(SYNCHRONOUS, 3, "Content-Length: 20\r\n\r\n"),
- MockRead(SYNCHRONOUS, 4, "needs authentication"),
- MockRead(SYNCHRONOUS, 6, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 7, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 8, "one.html"),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- HttpAuthHandlerMock* mock_auth = new HttpAuthHandlerMock;
- std::string challenge_text = "Basic";
- HttpAuthChallengeTokenizer challenge(challenge_text.begin(),
- challenge_text.end());
- GURL origin("localhost");
- EXPECT_TRUE(mock_auth->InitFromChallenge(&challenge,
- HttpAuth::AUTH_SERVER,
- origin,
- BoundNetLog()));
- auth_handler_factory_->AddMockHandler(mock_auth, HttpAuth::AUTH_SERVER);
-
- HttpNetworkTransaction transaction(DEFAULT_PRIORITY, session_.get());
- EXPECT_EQ(ERR_IO_PENDING,
- transaction.Start(GetRequestInfo("one.html"),
- callback_.callback(),
- BoundNetLog()));
- EXPECT_EQ(OK, callback_.WaitForResult());
-
- AuthCredentials credentials(base::ASCIIToUTF16("user"),
- base::ASCIIToUTF16("pass"));
- EXPECT_EQ(OK, transaction.RestartWithAuth(credentials, callback_.callback()));
-
- ExpectResponse("one.html", transaction, SYNCHRONOUS);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, OldVersionDisablesPipelining) {
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /pipelined.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.0 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 14\r\n\r\n"),
- MockRead(SYNCHRONOUS, 3, "pipelined.html"),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- MockWrite writes2[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads2[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(ASYNC, 3, "one.html"),
- MockRead(SYNCHRONOUS, OK, 4),
- };
- AddExpectedConnection(reads2, arraysize(reads2), writes2, arraysize(writes2));
-
- MockWrite writes3[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads3[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 3, "two.html"),
- MockRead(SYNCHRONOUS, OK, 4),
- };
- AddExpectedConnection(reads3, arraysize(reads3), writes3, arraysize(writes3));
-
- HttpNetworkTransaction one_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback one_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- one_transaction.Start(GetRequestInfo("pipelined.html"),
- one_callback.callback(), BoundNetLog()));
- EXPECT_EQ(OK, one_callback.WaitForResult());
- ExpectResponse("pipelined.html", one_transaction, SYNCHRONOUS);
-
- CompleteTwoRequests(1, 4);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, PipelinesImmediatelyIfKnownGood) {
- // The first request gets us an HTTP/1.1. The next 3 test pipelining. When the
- // 3rd request completes, we know pipelining is safe. After the first 4
- // complete, the 5th and 6th should then be immediately sent pipelined on a
- // new HttpPipelinedConnection.
- int old_max_sockets = ClientSocketPoolManager::max_sockets_per_group(
- HttpNetworkSession::NORMAL_SOCKET_POOL);
- ClientSocketPoolManager::set_max_sockets_per_group(
- HttpNetworkSession::NORMAL_SOCKET_POOL, 1);
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 4, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 7, "GET /three.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 12, "GET /four.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 16, "GET /second-pipeline-one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(SYNCHRONOUS, 17, "GET /second-pipeline-two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 3, "one.html"),
- MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 8, "two.html"),
- MockRead(SYNCHRONOUS, 9, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 10, "Content-Length: 10\r\n\r\n"),
- MockRead(SYNCHRONOUS, 11, "three.html"),
- MockRead(SYNCHRONOUS, 13, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 14, "Content-Length: 9\r\n\r\n"),
- MockRead(SYNCHRONOUS, 15, "four.html"),
- MockRead(ASYNC, 18, "HTTP/1.1 200 OK\r\n"),
- MockRead(ASYNC, 19, "Content-Length: 24\r\n\r\n"),
- MockRead(SYNCHRONOUS, 20, "second-pipeline-one.html"),
- MockRead(SYNCHRONOUS, 21, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 22, "Content-Length: 24\r\n\r\n"),
- MockRead(SYNCHRONOUS, 23, "second-pipeline-two.html"),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- CompleteFourRequests(REQUEST_DEFAULT);
-
- HttpNetworkTransaction second_one_transaction(
- DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback second_one_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- second_one_transaction.Start(
- GetRequestInfo("second-pipeline-one.html"),
- second_one_callback.callback(), BoundNetLog()));
- base::MessageLoop::current()->RunUntilIdle();
-
- HttpNetworkTransaction second_two_transaction(
- DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback second_two_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- second_two_transaction.Start(
- GetRequestInfo("second-pipeline-two.html"),
- second_two_callback.callback(), BoundNetLog()));
-
- data_vector_[0]->RunFor(3);
- EXPECT_EQ(OK, second_one_callback.WaitForResult());
- data_vector_[0]->StopAfter(100);
- ExpectResponse("second-pipeline-one.html", second_one_transaction,
- SYNCHRONOUS);
- EXPECT_EQ(OK, second_two_callback.WaitForResult());
- ExpectResponse("second-pipeline-two.html", second_two_transaction,
- SYNCHRONOUS);
-
- ClientSocketPoolManager::set_max_sockets_per_group(
- HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_sockets);
-}
-
-class DataRunnerObserver : public base::MessageLoop::TaskObserver {
- public:
- DataRunnerObserver(DeterministicSocketData* data, int run_before_task)
- : data_(data),
- run_before_task_(run_before_task),
- current_task_(0) { }
-
- virtual void WillProcessTask(const base::PendingTask& pending_task) OVERRIDE {
- ++current_task_;
- if (current_task_ == run_before_task_) {
- data_->Run();
- base::MessageLoop::current()->RemoveTaskObserver(this);
- }
- }
-
- virtual void DidProcessTask(const base::PendingTask& pending_task) OVERRIDE {}
-
- private:
- DeterministicSocketData* data_;
- int run_before_task_;
- int current_task_;
-};
-
-TEST_F(HttpPipelinedNetworkTransactionTest, OpenPipelinesWhileBinding) {
- // There was a racy crash in the pipelining code. This test recreates that
- // race. The steps are:
- // 1. The first request starts a pipeline and requests headers.
- // 2. HttpStreamFactoryImpl::Job tries to bind a pending request to a new
- // pipeline and queues a task to do so.
- // 3. Before that task runs, the first request receives its headers and
- // determines this host is probably capable of pipelining.
- // 4. All of the hosts' pipelines are notified they have capacity in a loop.
- // 5. On the first iteration, the first pipeline is opened up to accept new
- // requests and steals the request from step #2.
- // 6. The pipeline from #2 is deleted because it has no streams.
- // 7. On the second iteration, the host tries to notify the pipeline from step
- // #2 that it has capacity. This is a use-after-free.
- Initialize(false);
-
- MockWrite writes[] = {
- MockWrite(SYNCHRONOUS, 0, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- MockWrite(ASYNC, 3, "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(ASYNC, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 4, "one.html"),
- MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
- MockRead(SYNCHRONOUS, 6, "Content-Length: 8\r\n\r\n"),
- MockRead(SYNCHRONOUS, 7, "two.html"),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- AddExpectedConnection(NULL, 0, NULL, 0);
-
- HttpNetworkTransaction one_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback one_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- one_transaction.Start(GetRequestInfo("one.html"),
- one_callback.callback(), BoundNetLog()));
-
- data_vector_[0]->SetStop(2);
- data_vector_[0]->Run();
-
- HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback two_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- two_transaction.Start(GetRequestInfo("two.html"),
- two_callback.callback(), BoundNetLog()));
- // Posted tasks should be:
- // 1. MockHostResolverBase::ResolveNow
- // 2. HttpStreamFactoryImpl::Job::OnStreamReadyCallback for job 1
- // 3. HttpStreamFactoryImpl::Job::OnStreamReadyCallback for job 2
- //
- // We need to make sure that the response that triggers OnPipelineFeedback(OK)
- // is called in between when task #3 is scheduled and when it runs. The
- // DataRunnerObserver does that.
- DataRunnerObserver observer(data_vector_[0], 3);
- base::MessageLoop::current()->AddTaskObserver(&observer);
- data_vector_[0]->SetStop(4);
- base::MessageLoop::current()->RunUntilIdle();
- data_vector_[0]->SetStop(10);
-
- EXPECT_EQ(OK, one_callback.WaitForResult());
- ExpectResponse("one.html", one_transaction, SYNCHRONOUS);
- EXPECT_EQ(OK, two_callback.WaitForResult());
- ExpectResponse("two.html", two_transaction, SYNCHRONOUS);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, ProxyChangesWhileConnecting) {
- Initialize(false);
-
- DeterministicSocketData data(NULL, 0, NULL, 0);
- data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_REFUSED));
- factory_.AddSocketDataProvider(&data);
-
- DeterministicSocketData data2(NULL, 0, NULL, 0);
- data2.set_connect_data(MockConnect(ASYNC, ERR_FAILED));
- factory_.AddSocketDataProvider(&data2);
-
- HttpNetworkTransaction transaction(DEFAULT_PRIORITY, session_.get());
- EXPECT_EQ(ERR_IO_PENDING,
- transaction.Start(GetRequestInfo("test.html"), callback_.callback(),
- BoundNetLog()));
-
- proxy_config_service_->IncrementConfigId();
-
- EXPECT_EQ(ERR_FAILED, callback_.WaitForResult());
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, ForcedPipelineSharesConnection) {
- Initialize(true);
-
- MockWrite writes[] = {
- MockWrite(ASYNC, 0, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"
- "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(ASYNC, 1, "HTTP/1.1 200 OK\r\n"),
- MockRead(ASYNC, 2, "Content-Length: 8\r\n\r\n"),
- MockRead(ASYNC, 3, "one.html"),
- MockRead(ASYNC, 4, "HTTP/1.1 200 OK\r\n"),
- MockRead(ASYNC, 5, "Content-Length: 8\r\n\r\n"),
- MockRead(ASYNC, 6, "two.html"),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- scoped_ptr<HttpNetworkTransaction> one_transaction(
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
- TestCompletionCallback one_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- one_transaction->Start(GetRequestInfo("one.html"),
- one_callback.callback(), BoundNetLog()));
-
- HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback two_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- two_transaction.Start(GetRequestInfo("two.html"),
- two_callback.callback(), BoundNetLog()));
-
- data_vector_[0]->RunFor(3); // Send + 2 lines of headers.
- EXPECT_EQ(OK, one_callback.WaitForResult());
- ExpectResponse("one.html", *one_transaction.get(), ASYNC);
- one_transaction.reset();
-
- data_vector_[0]->RunFor(2); // 2 lines of headers.
- EXPECT_EQ(OK, two_callback.WaitForResult());
- ExpectResponse("two.html", two_transaction, ASYNC);
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest,
- ForcedPipelineConnectionErrorFailsBoth) {
- Initialize(true);
-
- DeterministicSocketData data(NULL, 0, NULL, 0);
- data.set_connect_data(MockConnect(ASYNC, ERR_FAILED));
- factory_.AddSocketDataProvider(&data);
-
- scoped_ptr<HttpNetworkTransaction> one_transaction(
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
- TestCompletionCallback one_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- one_transaction->Start(GetRequestInfo("one.html"),
- one_callback.callback(), BoundNetLog()));
-
- HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback two_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- two_transaction.Start(GetRequestInfo("two.html"),
- two_callback.callback(), BoundNetLog()));
-
- data.Run();
- EXPECT_EQ(ERR_FAILED, one_callback.WaitForResult());
- EXPECT_EQ(ERR_FAILED, two_callback.WaitForResult());
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, ForcedPipelineEvictionIsFatal) {
- Initialize(true);
-
- MockWrite writes[] = {
- MockWrite(ASYNC, 0, "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"
- "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"),
- };
- MockRead reads[] = {
- MockRead(ASYNC, ERR_FAILED, 1),
- };
- AddExpectedConnection(reads, arraysize(reads), writes, arraysize(writes));
-
- scoped_ptr<HttpNetworkTransaction> one_transaction(
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
- TestCompletionCallback one_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- one_transaction->Start(GetRequestInfo("one.html"),
- one_callback.callback(), BoundNetLog()));
-
- HttpNetworkTransaction two_transaction(DEFAULT_PRIORITY, session_.get());
- TestCompletionCallback two_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- two_transaction.Start(GetRequestInfo("two.html"),
- two_callback.callback(), BoundNetLog()));
-
- data_vector_[0]->RunFor(2);
- EXPECT_EQ(ERR_FAILED, one_callback.WaitForResult());
- one_transaction.reset();
- EXPECT_EQ(ERR_PIPELINE_EVICTION, two_callback.WaitForResult());
-}
-
-TEST_F(HttpPipelinedNetworkTransactionTest, ForcedPipelineOrder) {
- Initialize(true);
-
- MockWrite writes[] = {
- MockWrite(ASYNC, 0,
- "GET /one.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"
- "GET /two.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"
- "GET /three.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"
- "GET /four.html HTTP/1.1\r\n"
- "Host: localhost\r\n"
- "Connection: keep-alive\r\n\r\n"
- ),
- };
- MockRead reads[] = {
- MockRead(ASYNC, ERR_FAILED, 1),
- };
- DeterministicSocketData data(
- reads, arraysize(reads), writes, arraysize(writes));
- data.set_connect_data(MockConnect(ASYNC, OK));
- factory_.AddSocketDataProvider(&data);
-
- scoped_ptr<HttpNetworkTransaction> one_transaction(
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
- TestCompletionCallback one_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- one_transaction->Start(GetRequestInfo("one.html"),
- one_callback.callback(), BoundNetLog()));
-
- scoped_ptr<HttpNetworkTransaction> two_transaction(
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
- TestCompletionCallback two_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- two_transaction->Start(GetRequestInfo("two.html"),
- two_callback.callback(), BoundNetLog()));
-
- scoped_ptr<HttpNetworkTransaction> three_transaction(
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
- TestCompletionCallback three_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- three_transaction->Start(GetRequestInfo("three.html"),
- three_callback.callback(), BoundNetLog()));
-
- scoped_ptr<HttpNetworkTransaction> four_transaction(
- new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
- TestCompletionCallback four_callback;
- EXPECT_EQ(ERR_IO_PENDING,
- four_transaction->Start(GetRequestInfo("four.html"),
- four_callback.callback(), BoundNetLog()));
-
- data.RunFor(3);
- EXPECT_EQ(ERR_FAILED, one_callback.WaitForResult());
- one_transaction.reset();
- EXPECT_EQ(ERR_PIPELINE_EVICTION, two_callback.WaitForResult());
- two_transaction.reset();
- EXPECT_EQ(ERR_PIPELINE_EVICTION, three_callback.WaitForResult());
- three_transaction.reset();
- EXPECT_EQ(ERR_PIPELINE_EVICTION, four_callback.WaitForResult());
-}
-
-} // anonymous namespace
-
-} // namespace net
« no previous file with comments | « net/http/http_pipelined_host_test_util.cc ('k') | net/http/http_pipelined_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698