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