http_network_layer_unittest.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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)
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined (SPDY_PROXY_AUTH_ORIGIN)
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string GetChromeProxy() {
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return HostPortPair::FromURL(GURL(SPDY_PROXY_AUTH_ORIGIN)).ToString();
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void ExecuteRequestExpectingContentAndHeader(const std::string& content,
588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                               const std::string& header,
598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                               const std::string& value) {
608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    TestCompletionCallback callback;
618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    HttpRequestInfo request_info;
638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    request_info.url = GURL("http://www.google.com/");
648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    request_info.method = "GET";
658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    request_info.load_flags = LOAD_NORMAL;
668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    scoped_ptr<HttpTransaction> trans;
688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EXPECT_EQ(OK, rv);
708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (rv == ERR_IO_PENDING)
738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      rv = callback.WaitForResult();
748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ASSERT_EQ(OK, rv);
758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    std::string contents;
778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    rv = ReadTransaction(trans.get(), &contents);
788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EXPECT_EQ(OK, rv);
798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EXPECT_EQ(content, contents);
808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (!header.empty()) {
828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      // We also have a server header here that isn't set by the proxy.
838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      EXPECT_TRUE(trans->GetResponseInfo()->headers->HasHeaderValue(
848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          header, value));
858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Check that |proxy_count| proxies are in the retry list.
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // These will be, in order, |bad_proxy| and |bad_proxy2|".
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void TestBadProxies(unsigned int proxy_count, const std::string& bad_proxy,
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                      const std::string& bad_proxy2) {
928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const ProxyRetryInfoMap& retry_info = proxy_service_->proxy_retry_info();
938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ASSERT_EQ(proxy_count, retry_info.size());
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ASSERT_TRUE(retry_info.find(bad_proxy) != retry_info.end());
958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (proxy_count > 1)
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ASSERT_TRUE(retry_info.find(bad_proxy2) != retry_info.end());
978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Simulates a request through a proxy which returns a bypass, which is then
1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // retried through a second proxy that doesn't bypass.
1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Checks that the expected requests were issued, the expected content was
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // recieved, and the first proxy |bad_proxy| was marked as bad.
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void TestProxyFallback(const std::string& bad_proxy) {
1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MockRead data_reads[] = {
1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead("HTTP/1.1 200 OK\r\n"
1068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)               "Connection: proxy-bypass\r\n\r\n"),
1078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead("Bypass message"),
1088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead(SYNCHRONOUS, OK),
1098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    };
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TestProxyFallbackWithMockReads(bad_proxy, data_reads,
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                   arraysize(data_reads));
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void TestProxyFallbackWithMockReads(const std::string& bad_proxy,
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      MockRead data_reads[],
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      int data_reads_size) {
1178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MockWrite data_writes[] = {
1188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockWrite("GET http://www.google.com/ HTTP/1.1\r\n"
1198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                "Host: www.google.com\r\n"
1208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                "Proxy-Connection: keep-alive\r\n\r\n"),
1218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    };
1228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    StaticSocketDataProvider data1(data_reads, data_reads_size,
1248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                  data_writes, arraysize(data_writes));
1258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    mock_socket_factory_.AddSocketDataProvider(&data1);
1268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // Second data provider returns the expected content.
1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MockRead data_reads2[] = {
1298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead("HTTP/1.0 200 OK\r\n"
1308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)               "Server: not-proxy\r\n\r\n"),
1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead("content"),
1328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead(SYNCHRONOUS, OK),
1338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    };
1348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MockWrite data_writes2[] = {
1358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockWrite("GET http://www.google.com/ HTTP/1.1\r\n"
1368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                "Host: www.google.com\r\n"
1378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                "Proxy-Connection: keep-alive\r\n\r\n"),
1388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    };
1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2),
1408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                  data_writes2, arraysize(data_writes2));
1418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    mock_socket_factory_.AddSocketDataProvider(&data2);
1428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // Expect that we get "content" and not "Bypass message", and that there's
1448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // a "not-proxy" "Server:" header in the final response.
1458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ExecuteRequestExpectingContentAndHeader("content", "server", "not-proxy");
1468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // We should also observe the bad proxy in the retry list.
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TestBadProxies(1u, bad_proxy, "");
1498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
1508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Simulates a request through a proxy which returns a bypass, which is then
1528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // retried through a direct connection to the origin site.
1538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Checks that the expected requests were issued, the expected content was
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // received, and the proxy |bad_proxy| was marked as bad.
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void TestProxyFallbackToDirect(const std::string& bad_proxy) {
1568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MockRead data_reads[] = {
1578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead("HTTP/1.1 200 OK\r\n"
1588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)               "Connection: proxy-bypass\r\n\r\n"),
1598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead("Bypass message"),
1608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead(SYNCHRONOUS, OK),
1618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    };
1628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MockWrite data_writes[] = {
1638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockWrite("GET http://www.google.com/ HTTP/1.1\r\n"
1648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                "Host: www.google.com\r\n"
1658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                "Proxy-Connection: keep-alive\r\n\r\n"),
1668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    };
1678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    StaticSocketDataProvider data1(data_reads, arraysize(data_reads),
1688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                  data_writes, arraysize(data_writes));
1698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    mock_socket_factory_.AddSocketDataProvider(&data1);
1708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // Second data provider returns the expected content.
1728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MockRead data_reads2[] = {
1738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead("HTTP/1.0 200 OK\r\n"
1748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)               "Server: not-proxy\r\n\r\n"),
1758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead("content"),
1768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead(SYNCHRONOUS, OK),
1778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    };
1788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MockWrite data_writes2[] = {
1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockWrite("GET / HTTP/1.1\r\n"
1808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                "Host: www.google.com\r\n"
1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                "Connection: keep-alive\r\n\r\n"),
1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    };
1838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2),
1848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                   data_writes2, arraysize(data_writes2));
1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    mock_socket_factory_.AddSocketDataProvider(&data2);
1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // Expect that we get "content" and not "Bypass message", and that there's
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // a "not-proxy" "Server:" header in the final response.
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ExecuteRequestExpectingContentAndHeader("content", "server", "not-proxy");
1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // We should also observe the bad proxy in the retry list.
1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TestBadProxies(1u, bad_proxy, "");
1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Simulates a request through a proxy which returns a bypass, under a
1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // configuration where there is no valid bypass. |proxy_count| proxies
1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // are expected to be configured.
1988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Checks that the expected requests were issued, the bypass message was the
1998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // final received content,  and all proxies were marked as bad.
2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void TestProxyFallbackFail(unsigned int proxy_count,
2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                             const std::string& bad_proxy,
2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                             const std::string& bad_proxy2) {
2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MockRead data_reads[] = {
2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead("HTTP/1.1 200 OK\r\n"
2058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)               "Connection: proxy-bypass\r\n\r\n"),
2068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead("Bypass message"),
2078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockRead(SYNCHRONOUS, OK),
2088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    };
2098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MockWrite data_writes[] = {
2108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      MockWrite("GET http://www.google.com/ HTTP/1.1\r\n"
2118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                "Host: www.google.com\r\n"
2128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                "Proxy-Connection: keep-alive\r\n\r\n"),
2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    };
2148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    StaticSocketDataProvider data1(data_reads, arraysize(data_reads),
2158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                   data_writes, arraysize(data_writes));
2168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    StaticSocketDataProvider data2(data_reads, arraysize(data_reads),
2178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                   data_writes, arraysize(data_writes));
2188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    mock_socket_factory_.AddSocketDataProvider(&data1);
2208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (proxy_count > 1)
2218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      mock_socket_factory_.AddSocketDataProvider(&data2);
2228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // Expect that we get "Bypass message", and not "content"..
2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ExecuteRequestExpectingContentAndHeader("Bypass message", "", "");
2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // We should also observe the bad proxy or proxies in the retry list.
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TestBadProxies(proxy_count, bad_proxy, bad_proxy2);
2288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockClientSocketFactory mock_socket_factory_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockHostResolver host_resolver_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CertVerifier> cert_verifier_;
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<TransportSecurityState> transport_security_state_;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ProxyService> proxy_service_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<SSLConfigService> ssl_config_service_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<HttpNetworkSession> network_session_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpNetworkLayer> factory_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpServerPropertiesImpl http_server_properties_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, CreateAndDestroy) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(trans.get() != NULL);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, Suspend) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.reset();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  factory_->OnSuspend();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, rv);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(trans == NULL);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  factory_->OnResume();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, GET) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRead data_reads[] = {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("HTTP/1.0 200 OK\r\n\r\n"),
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("hello world"),
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead(SYNCHRONOUS, OK),
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWrite data_writes[] = {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockWrite("GET / HTTP/1.1\r\n"
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "Host: www.google.com\r\n"
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "Connection: keep-alive\r\n"
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "User-Agent: Foo/1.0\r\n\r\n"),
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StaticSocketDataProvider data(data_reads, arraysize(data_reads),
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                data_writes, arraysize(data_writes));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.url = GURL("http://www.google.com/");
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.method = "GET";
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       "Foo/1.0");
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.load_flags = LOAD_NORMAL;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rv = callback.GetResult(rv);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(OK, rv);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string contents;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = ReadTransaction(trans.get(), &contents);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("hello world", contents);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Proxy bypass tests. These tests run through various server-induced
3088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// proxy-bypass scenarios using both PAC file and fixed proxy params.
3098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// The test scenarios are:
3108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)//  - bypass with two proxies configured and the first but not the second
3118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)//    is bypassed.
3128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)//  - bypass with one proxy configured and an explicit fallback to direct
3138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)//    connections
3148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)//  - bypass with two proxies configured and both are bypassed
3158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)//  - bypass with one proxy configured which is bypassed with no defined
3168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)//    fallback
3178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(SPDY_PROXY_AUTH_ORIGIN)
3198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerTwoProxyBypassPac) {
3201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string bad_proxy = GetChromeProxy();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult(
3221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "PROXY " + bad_proxy + "; PROXY good:8080"));
3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestProxyFallback(bad_proxy);
3248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerTwoProxyBypassFixed) {
3271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string bad_proxy = GetChromeProxy();
3281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ConfigureTestDependencies(
3291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ProxyService::CreateFixed(bad_proxy +", good:8080"));
3301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestProxyFallback(bad_proxy);
3318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerOneProxyWithDirectBypassPac) {
3341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string bad_proxy = GetChromeProxy();
3358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult(
3361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "PROXY " + bad_proxy + "; DIRECT"));
3371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestProxyFallbackToDirect(bad_proxy);
3388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerOneProxyWithDirectBypassFixed) {
3411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string bad_proxy = GetChromeProxy();
3421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ConfigureTestDependencies(
3431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ProxyService::CreateFixed(bad_proxy + ", direct://"));
3441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestProxyFallbackToDirect(bad_proxy);
3458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(DATA_REDUCTION_FALLBACK_HOST)
3488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerTwoProxyDoubleBypassPac) {
3491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string bad_proxy = GetChromeProxy();
3501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string bad_proxy2 =
3511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      HostPortPair::FromURL(GURL(DATA_REDUCTION_FALLBACK_HOST)).ToString();
3528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult(
3531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "PROXY " + bad_proxy + "; PROXY " + bad_proxy2));
3541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestProxyFallbackFail(2u, bad_proxy, bad_proxy2);
3558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerTwoProxyDoubleBypassFixed) {
3581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string bad_proxy = GetChromeProxy();
3591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string bad_proxy2 =
3601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      HostPortPair::FromURL(GURL(DATA_REDUCTION_FALLBACK_HOST)).ToString();
3618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ConfigureTestDependencies(ProxyService::CreateFixed(
3621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    bad_proxy + ", " + bad_proxy2));
3631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestProxyFallbackFail(2u, bad_proxy, bad_proxy2);
3648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerOneProxyNoDirectBypassPac) {
3681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string bad_proxy = GetChromeProxy();
3698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult(
3701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "PROXY " + bad_proxy));
3711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestProxyFallbackFail(1u, bad_proxy, "");
3728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerOneProxyNoDirectBypassFixed) {
3751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string bad_proxy = GetChromeProxy();
3761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ConfigureTestDependencies(ProxyService::CreateFixed(bad_proxy));
3771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestProxyFallbackFail(1u, bad_proxy, "");
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerFallbackOn5xxError) {
381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Verify that "500 Internal Server Error", "502 Bad Gateway", and
382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // "503 Service Unavailable" via the data reduction proxy induce proxy
383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // fallback to a second proxy, if configured.
38490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
38590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To configure this test, we need to wire up a custom proxy service to use
38690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // a pair of proxies. We'll induce fallback via the first and return
38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // the expected data via the second.
38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string data_reduction_proxy(
38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      HostPortPair::FromURL(GURL(SPDY_PROXY_AUTH_ORIGIN)).ToString());
39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string pac_string = base::StringPrintf(
39190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "PROXY %s; PROXY good:8080", data_reduction_proxy.data());
39290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string headers[] = {
394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "HTTP/1.1 500 Internal Server Error\r\n\r\n",
395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "HTTP/1.1 502 Bad Gateway\r\n\r\n",
396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "HTTP/1.1 503 Service Unavailable\r\n\r\n"
39790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
39890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (size_t i = 0; i < arraysize(headers); ++i) {
400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ConfigureTestDependencies(
401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ProxyService::CreateFixedFromPacResult(pac_string));
40290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MockRead data_reads[] = {
404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      MockRead(headers[i].c_str()),
405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      MockRead("Bypass message"),
406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      MockRead(SYNCHRONOUS, OK),
407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    };
40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MockWrite data_writes[] = {
410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      MockWrite("GET http://www.google.com/ HTTP/1.1\r\n"
411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                "Host: www.google.com\r\n"
412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                "Proxy-Connection: keep-alive\r\n\r\n"),
413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    };
41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    StaticSocketDataProvider data1(data_reads, arraysize(data_reads),
416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                   data_writes, arraysize(data_writes));
417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    mock_socket_factory_.AddSocketDataProvider(&data1);
41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Second data provider returns the expected content.
420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MockRead data_reads2[] = {
421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      MockRead("HTTP/1.0 200 OK\r\n"
422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               "Server: not-proxy\r\n\r\n"),
423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      MockRead("content"),
424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      MockRead(SYNCHRONOUS, OK),
425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    };
426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MockWrite data_writes2[] = {
427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      MockWrite("GET http://www.google.com/ HTTP/1.1\r\n"
428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                "Host: www.google.com\r\n"
429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                "Proxy-Connection: keep-alive\r\n\r\n"),
430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    };
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2),
433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                   data_writes2, arraysize(data_writes2));
434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    mock_socket_factory_.AddSocketDataProvider(&data2);
435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TestCompletionCallback callback;
43790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    HttpRequestInfo request_info;
439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    request_info.url = GURL("http://www.google.com/");
440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    request_info.method = "GET";
441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    request_info.load_flags = LOAD_NORMAL;
442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    scoped_ptr<HttpTransaction> trans;
444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(OK, rv);
446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (rv == ERR_IO_PENDING)
449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      rv = callback.WaitForResult();
450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_EQ(OK, rv);
451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    std::string contents;
453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    rv = ReadTransaction(trans.get(), &contents);
454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(OK, rv);
455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // We should obtain content from the second socket provider write
457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // corresponding to the fallback proxy.
458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ("content", contents);
459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // We also have a server header here that isn't set by the proxy.
460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(trans->GetResponseInfo()->headers->HasHeaderValue(
461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        "server", "not-proxy"));
462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // We should also observe the data reduction proxy in the retry list.
463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_EQ(1u, proxy_service_->proxy_retry_info().size());
464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(data_reduction_proxy,
465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              (*proxy_service_->proxy_retry_info().begin()).first);
466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
46790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // defined(SPDY_PROXY_AUTH_ORIGIN)
46990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, ProxyBypassIgnoredOnDirectConnectionPac) {
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that a Connection: proxy-bypass header is ignored when returned
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from a directly connected origin server.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult("DIRECT"));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRead data_reads[] = {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("HTTP/1.1 200 OK\r\n"
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "Connection: proxy-bypass\r\n\r\n"),
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead("Bypass message"),
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead(SYNCHRONOUS, OK),
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWrite data_writes[] = {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockWrite("GET / HTTP/1.1\r\n"
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "Host: www.google.com\r\n"
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "Connection: keep-alive\r\n\r\n"),
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StaticSocketDataProvider data1(data_reads, arraysize(data_reads),
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 data_writes, arraysize(data_writes));
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data1);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestInfo request_info;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.url = GURL("http://www.google.com/");
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.method = "GET";
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info.load_flags = LOAD_NORMAL;
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv == ERR_IO_PENDING)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rv = callback.WaitForResult();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(OK, rv);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have read the original page data.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string contents;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = ReadTransaction(trans.get(), &contents);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Bypass message", contents);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have no entries in our bad proxy list.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, proxy_service_->proxy_retry_info().size());
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(SPDY_PROXY_AUTH_ORIGIN)
5161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(HttpNetworkLayerTest, ServerFallbackWithProxyTimedBypass) {
5171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Verify that a Chrome-Proxy: bypass=<seconds> header induces proxy
5181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // fallback to a second proxy, if configured.
5191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string bad_proxy = GetChromeProxy();
5201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ConfigureTestDependencies(ProxyService::CreateFixedFromPacResult(
5211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "PROXY " + bad_proxy + "; PROXY good:8080"));
5221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  MockRead data_reads[] = {
5241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    MockRead("HTTP/1.1 200 OK\r\n"
5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)             "Connection: keep-alive\r\n"
5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)             "Chrome-Proxy: bypass=86400\r\n\r\n"),
5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    MockRead("Bypass message"),
5281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    MockRead(SYNCHRONOUS, OK),
5291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
5301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestProxyFallbackWithMockReads(bad_proxy, data_reads, arraysize(data_reads));
5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromSeconds(86400),
5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            (*proxy_service_->proxy_retry_info().begin()).second.current_delay);
5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // defined(SPDY_PROXY_AUTH_ORIGIN)
5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, NetworkVerified) {
538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockRead data_reads[] = {
539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead("HTTP/1.0 200 OK\r\n\r\n"),
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead("hello world"),
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(SYNCHRONOUS, OK),
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockWrite data_writes[] = {
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockWrite("GET / HTTP/1.1\r\n"
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "Host: www.google.com\r\n"
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "Connection: keep-alive\r\n"
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "User-Agent: Foo/1.0\r\n\r\n"),
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StaticSocketDataProvider data(data_reads, arraysize(data_reads),
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                data_writes, arraysize(data_writes));
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data);
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestCompletionCallback callback;
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HttpRequestInfo request_info;
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.url = GURL("http://www.google.com/");
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.method = "GET";
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent,
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       "Foo/1.0");
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.load_flags = LOAD_NORMAL;
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(OK, rv);
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(OK, callback.GetResult(rv));
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(trans->GetResponseInfo()->network_accessed);
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(HttpNetworkLayerTest, NetworkUnVerified) {
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockRead data_reads[] = {
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockRead(ASYNC, ERR_CONNECTION_RESET),
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockWrite data_writes[] = {
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MockWrite("GET / HTTP/1.1\r\n"
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "Host: www.google.com\r\n"
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "Connection: keep-alive\r\n"
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "User-Agent: Foo/1.0\r\n\r\n"),
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StaticSocketDataProvider data(data_reads, arraysize(data_reads),
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                data_writes, arraysize(data_writes));
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mock_socket_factory_.AddSocketDataProvider(&data);
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestCompletionCallback callback;
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HttpRequestInfo request_info;
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.url = GURL("http://www.google.com/");
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.method = "GET";
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent,
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       "Foo/1.0");
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_info.load_flags = LOAD_NORMAL;
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<HttpTransaction> trans;
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans, NULL);
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(OK, rv);
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rv = trans->Start(&request_info, callback.callback(), BoundNetLog());
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(ERR_CONNECTION_RESET, callback.GetResult(rv));
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If the response info is null, that means that any consumer won't
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // see the network accessed bit set.
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(NULL, trans->GetResponseInfo());
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
610