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/url_request/url_request_context_builder.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/base/request_priority.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "net/http/http_auth_handler.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "net/http/http_auth_handler_factory.h" 12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_ANDROID) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config_service_fixed.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_LINUX) || defined(OS_ANDROID) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A subclass of SpawnedTestServer that uses a statically-configured hostname. 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This is to work around mysterious failures in chrome_frame_net_tests. See: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/114369 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LocalHttpTestServer : public SpawnedTestServer { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit LocalHttpTestServer(const base::FilePath& document_root) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP, 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCustomUrlRequestTestHttpHost::value(), 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) document_root) {} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer() 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP, 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCustomUrlRequestTestHttpHost::value(), 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath()) {} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class MockHttpAuthHandlerFactory : public HttpAuthHandlerFactory { 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) explicit MockHttpAuthHandlerFactory(int return_code) : 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return_code_(return_code) {} 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual ~MockHttpAuthHandlerFactory() {} 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual int CreateAuthHandler(HttpAuthChallengeTokenizer* challenge, 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) HttpAuth::Target target, 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GURL& origin, 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CreateReason reason, 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int nonce_count, 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const BoundNetLog& net_log, 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<HttpAuthHandler>* handler) OVERRIDE { 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) handler->reset(); 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return return_code_; 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int return_code_; 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContextBuilderTest : public PlatformTest { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestContextBuilderTest() 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : test_server_( 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_ANDROID) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) builder_.set_proxy_config_service( 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ProxyConfigServiceFixed(ProxyConfig::CreateDirect())); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_LINUX) || defined(OS_ANDROID) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestContextBuilder builder_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestContextBuilderTest, DefaultSettings) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<URLRequestContext> context(builder_.Build()); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate delegate; 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<URLRequest> request( 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) context->CreateRequest(test_server_.GetURL("echoheader?Foo"), 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DEFAULT_PRIORITY, 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &delegate, 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) context->cookie_store())); 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) request->set_method("GET"); 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) request->SetExtraRequestHeaderByName("Foo", "Bar", false); 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) request->Start(); 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Bar", delegate.data_received()); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestContextBuilderTest, UserAgent) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) builder_.set_user_agent("Bar"); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<URLRequestContext> context(builder_.Build()); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate delegate; 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<URLRequest> request( 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) context->CreateRequest(test_server_.GetURL("echoheader?User-Agent"), 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DEFAULT_PRIORITY, 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &delegate, 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) NULL)); 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) request->set_method("GET"); 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) request->Start(); 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Bar", delegate.data_received()); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(URLRequestContextBuilderTest, ExtraHttpAuthHandlerFactory) { 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GURL gurl("www.google.com"); 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const int kBasicReturnCode = net::OK; 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MockHttpAuthHandlerFactory* mock_factory_basic = 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new MockHttpAuthHandlerFactory(kBasicReturnCode); 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<HttpAuthHandler> handler; 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) builder_.add_http_auth_handler_factory("ExtraScheme", mock_factory_basic); 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<URLRequestContext> context(builder_.Build()); 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify that a handler is returned for and added scheme. 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(kBasicReturnCode, 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) context->http_auth_handler_factory()->CreateAuthHandlerFromString( 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "ExtraScheme", 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) HttpAuth::AUTH_SERVER, 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gurl, 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BoundNetLog(), 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &handler)); 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify that a handler isn't returned for a bogus scheme. 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(ERR_UNSUPPORTED_AUTH_SCHEME, 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) context->http_auth_handler_factory()->CreateAuthHandlerFromString( 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "Bogus", HttpAuth::AUTH_SERVER, gurl, BoundNetLog(), &handler)); 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 137