http_network_layer_unittest.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_layer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/mock_cert_verifier.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties_impl.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_transaction_unittest.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/http/transport_security_state.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socket_test_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_session_pool.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service_defaults.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpNetworkLayerTest : public PlatformTest {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpNetworkLayerTest() : ssl_config_service_(new SSLConfigServiceDefaults) {}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ConfigureTestDependencies(ProxyService::CreateDirect());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ConfigureTestDependencies(ProxyService* proxy_service) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cert_verifier_.reset(new MockCertVerifier);
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    transport_security_state_.reset(new TransportSecurityState);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_service_.reset(proxy_service);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpNetworkSession::Params session_params;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    session_params.client_socket_factory = &mock_socket_factory_;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    session_params.host_resolver = &host_resolver_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    session_params.cert_verifier = cert_verifier_.get();
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    session_params.transport_security_state = transport_security_state_.get();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    session_params.proxy_service = proxy_service_.get();
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    session_params.ssl_config_service = ssl_config_service_.get();
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    session_params.http_server_properties =
46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        http_server_properties_.GetWeakPtr();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_session_ = new HttpNetworkSession(session_params);
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    factory_.reset(new HttpNetworkLayer(network_session_.get()));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockClientSocketFactory mock_socket_factory_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockHostResolver host_resolver_;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CertVerifier> cert_verifier_;
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<TransportSecurityState> transport_security_state_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ProxyService> proxy_service_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<SSLConfigService> ssl_config_service_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<HttpNetworkSession> network_session_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpNetworkLayer> factory_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpServerPropertiesImpl http_server_properties_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, CreateAndDestroy) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(trans.get() != NULL);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, Suspend) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.reset();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  factory_->OnSuspend();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, rv);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(trans == NULL);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  factory_->OnResume();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, GET) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRead data_reads[] = {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("HTTP/1.0 200 OK\r\n\r\n"),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("hello world"),
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead(SYNCHRONOUS, OK),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWrite data_writes[] = {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockWrite("GET / HTTP/1.1\r\n"
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "Host: www.google.com\r\n"
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "Connection: keep-alive\r\n"
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "User-Agent: Foo/1.0\r\n\r\n"),
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StaticSocketDataProvider data(data_reads, arraysize(data_reads),
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                data_writes, arraysize(data_writes));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.url = GURL("http://www.google.com/");
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.method = "GET";
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       "Foo/1.0");
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.load_flags = LOAD_NORMAL;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rv = callback.GetResult(rv);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(OK, rv);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string contents;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = ReadTransaction(trans.get(), &contents);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("hello world", contents);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerFallback) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that a Connection: Proxy-Bypass header induces proxy fallback to
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a second proxy, if configured.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To configure this test, we need to wire up a custom proxy service to use
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a pair of proxies. We'll induce fallback via the first and return
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the expected data via the second.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "PROXY bad:8080; PROXY good:8080"));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRead data_reads[] = {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("HTTP/1.1 200 OK\r\n"
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "Connection: proxy-bypass\r\n\r\n"),
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("Bypass message"),
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead(SYNCHRONOUS, OK),
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWrite data_writes[] = {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockWrite("GET http://www.google.com/ HTTP/1.1\r\n"
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "Host: www.google.com\r\n"
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "Proxy-Connection: keep-alive\r\n\r\n"),
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StaticSocketDataProvider data1(data_reads, arraysize(data_reads),
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                data_writes, arraysize(data_writes));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data1);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second data provider returns the expected content.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRead data_reads2[] = {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("HTTP/1.0 200 OK\r\n"
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "Server: not-proxy\r\n\r\n"),
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("content"),
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead(SYNCHRONOUS, OK),
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWrite data_writes2[] = {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockWrite("GET http://www.google.com/ HTTP/1.1\r\n"
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "Host: www.google.com\r\n"
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "Proxy-Connection: keep-alive\r\n\r\n"),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                data_writes2, arraysize(data_writes2));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data2);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.url = GURL("http://www.google.com/");
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.method = "GET";
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.load_flags = LOAD_NORMAL;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv == ERR_IO_PENDING)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rv = callback.WaitForResult();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(OK, rv);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string contents;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = ReadTransaction(trans.get(), &contents);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should obtain content from the second socket provider write
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // corresponding to the fallback proxy.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("content", contents);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We also have a server header here that isn't set by the proxy.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(trans->GetResponseInfo()->headers->HasHeaderValue(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "server", "not-proxy"));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should also observe the bad proxy in the retry list.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(1u == proxy_service_->proxy_retry_info().size());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bad:8080", (*proxy_service_->proxy_retry_info().begin()).first);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(SPDY_PROXY_AUTH_ORIGIN)
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerFallbackOnInternalServerError) {
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Verify that "500 Internal Server Error" via the data reduction proxy
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // induces proxy fallback to a second proxy, if configured.
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To configure this test, we need to wire up a custom proxy service to use
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // a pair of proxies. We'll induce fallback via the first and return
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // the expected data via the second.
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string data_reduction_proxy(
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      HostPortPair::FromURL(GURL(SPDY_PROXY_AUTH_ORIGIN)).ToString());
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string pac_string = base::StringPrintf(
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "PROXY %s; PROXY good:8080", data_reduction_proxy.data());
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult(pac_string));
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MockRead data_reads[] = {
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    MockRead("HTTP/1.1 500 Internal Server Error\r\n\r\n"),
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    MockRead("Bypass message"),
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    MockRead(SYNCHRONOUS, OK),
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MockWrite data_writes[] = {
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    MockWrite("GET http://www.google.com/ HTTP/1.1\r\n"
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              "Host: www.google.com\r\n"
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              "Proxy-Connection: keep-alive\r\n\r\n"),
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  StaticSocketDataProvider data1(data_reads, arraysize(data_reads),
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 data_writes, arraysize(data_writes));
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data1);
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Second data provider returns the expected content.
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MockRead data_reads2[] = {
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    MockRead("HTTP/1.0 200 OK\r\n"
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             "Server: not-proxy\r\n\r\n"),
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    MockRead("content"),
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    MockRead(SYNCHRONOUS, OK),
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MockWrite data_writes2[] = {
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    MockWrite("GET http://www.google.com/ HTTP/1.1\r\n"
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              "Host: www.google.com\r\n"
23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              "Proxy-Connection: keep-alive\r\n\r\n"),
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2),
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                 data_writes2, arraysize(data_writes2));
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data2);
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TestCompletionCallback callback;
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  HttpRequestInfo request_info;
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  request_info.url = GURL("http://www.google.com/");
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  request_info.method = "GET";
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  request_info.load_flags = LOAD_NORMAL;
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OK, rv);
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (rv == ERR_IO_PENDING)
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    rv = callback.WaitForResult();
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(OK, rv);
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string contents;
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  rv = ReadTransaction(trans.get(), &contents);
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OK, rv);
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We should obtain content from the second socket provider write
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // corresponding to the fallback proxy.
26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("content", contents);
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We also have a server header here that isn't set by the proxy.
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(trans->GetResponseInfo()->headers->HasHeaderValue(
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "server", "not-proxy"));
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We should also observe the data reduction proxy in the retry list.
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(1u == proxy_service_->proxy_retry_info().size());
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(data_reduction_proxy,
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            (*proxy_service_->proxy_retry_info().begin()).first);
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // defined(SPDY_PROXY_AUTH_ORIGIN)
27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerFallbackDoesntLoop) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that a Connection: Proxy-Bypass header will display the original
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // proxy's error page content if a fallback option is not configured.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult(
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "PROXY bad:8080; PROXY alsobad:8080"));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRead data_reads[] = {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("HTTP/1.1 200 OK\r\n"
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "Connection: proxy-bypass\r\n\r\n"),
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("Bypass message"),
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead(SYNCHRONOUS, OK),
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWrite data_writes[] = {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockWrite("GET http://www.google.com/ HTTP/1.1\r\n"
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "Host: www.google.com\r\n"
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "Proxy-Connection: keep-alive\r\n\r\n"),
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StaticSocketDataProvider data1(data_reads, arraysize(data_reads),
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 data_writes, arraysize(data_writes));
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StaticSocketDataProvider data2(data_reads, arraysize(data_reads),
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 data_writes, arraysize(data_writes));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data1);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data2);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.url = GURL("http://www.google.com/");
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.method = "GET";
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.load_flags = LOAD_NORMAL;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv == ERR_IO_PENDING)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rv = callback.WaitForResult();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(OK, rv);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string contents;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = ReadTransaction(trans.get(), &contents);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Bypass message", contents);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Despite not falling back to anything, we should still observe the proxies
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the bad proxies list.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ProxyRetryInfoMap& retry_info = proxy_service_->proxy_retry_info();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, retry_info.size());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(retry_info.find("bad:8080") != retry_info.end());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(retry_info.find("alsobad:8080") != retry_info.end());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, ProxyBypassIgnoredOnDirectConnection) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that a Connection: proxy-bypass header is ignored when returned
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from a directly connected origin server.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult("DIRECT"));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRead data_reads[] = {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("HTTP/1.1 200 OK\r\n"
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "Connection: proxy-bypass\r\n\r\n"),
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("Bypass message"),
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead(SYNCHRONOUS, OK),
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWrite data_writes[] = {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockWrite("GET / HTTP/1.1\r\n"
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "Host: www.google.com\r\n"
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "Connection: keep-alive\r\n\r\n"),
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StaticSocketDataProvider data1(data_reads, arraysize(data_reads),
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 data_writes, arraysize(data_writes));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data1);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.url = GURL("http://www.google.com/");
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.method = "GET";
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.load_flags = LOAD_NORMAL;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv == ERR_IO_PENDING)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rv = callback.WaitForResult();
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(OK, rv);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have read the original page data.
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string contents;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = ReadTransaction(trans.get(), &contents);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Bypass message", contents);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have no entries in our bad proxy list.
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, proxy_service_->proxy_retry_info().size());
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, NetworkVerified) {
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockRead data_reads[] = {
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead("HTTP/1.0 200 OK\r\n\r\n"),
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead("hello world"),
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(SYNCHRONOUS, OK),
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockWrite data_writes[] = {
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockWrite("GET / HTTP/1.1\r\n"
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "Host: www.google.com\r\n"
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "Connection: keep-alive\r\n"
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "User-Agent: Foo/1.0\r\n\r\n"),
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StaticSocketDataProvider data(data_reads, arraysize(data_reads),
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                data_writes, arraysize(data_writes));
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data);
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestCompletionCallback callback;
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HttpRequestInfo request_info;
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.url = GURL("http://www.google.com/");
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.method = "GET";
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent,
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       "Foo/1.0");
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.load_flags = LOAD_NORMAL;
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(OK, rv);
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(OK, callback.GetResult(rv));
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(trans->GetResponseInfo()->network_accessed);
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, NetworkUnVerified) {
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockRead data_reads[] = {
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(ASYNC, ERR_CONNECTION_RESET),
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockWrite data_writes[] = {
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockWrite("GET / HTTP/1.1\r\n"
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "Host: www.google.com\r\n"
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "Connection: keep-alive\r\n"
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "User-Agent: Foo/1.0\r\n\r\n"),
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StaticSocketDataProvider data(data_reads, arraysize(data_reads),
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                data_writes, arraysize(data_writes));
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data);
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestCompletionCallback callback;
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HttpRequestInfo request_info;
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.url = GURL("http://www.google.com/");
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.method = "GET";
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent,
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       "Foo/1.0");
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.load_flags = LOAD_NORMAL;
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(OK, rv);
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(ERR_CONNECTION_RESET, callback.GetResult(rv));
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If the response info is null, that means that any consumer won't
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // see the network accessed bit set.
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(NULL, trans->GetResponseInfo());
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
448