1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/url_request/url_request_context_builder.h" 6 7 #include "base/memory/scoped_ptr.h" 8 #include "build/build_config.h" 9 #include "net/base/request_priority.h" 10 #include "net/http/http_auth_handler.h" 11 #include "net/http/http_auth_handler_factory.h" 12 #include "net/test/spawned_test_server/spawned_test_server.h" 13 #include "net/url_request/url_request.h" 14 #include "net/url_request/url_request_test_util.h" 15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/platform_test.h" 17 18 #if defined(OS_LINUX) || defined(OS_ANDROID) 19 #include "net/proxy/proxy_config.h" 20 #include "net/proxy/proxy_config_service_fixed.h" 21 #endif // defined(OS_LINUX) || defined(OS_ANDROID) 22 23 namespace net { 24 25 namespace { 26 27 // A subclass of SpawnedTestServer that uses a statically-configured hostname. 28 // This is to work around mysterious failures in chrome_frame_net_tests. See: 29 // http://crbug.com/114369 30 class LocalHttpTestServer : public SpawnedTestServer { 31 public: 32 explicit LocalHttpTestServer(const base::FilePath& document_root) 33 : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP, 34 ScopedCustomUrlRequestTestHttpHost::value(), 35 document_root) {} 36 LocalHttpTestServer() 37 : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP, 38 ScopedCustomUrlRequestTestHttpHost::value(), 39 base::FilePath()) {} 40 }; 41 42 class MockHttpAuthHandlerFactory : public HttpAuthHandlerFactory { 43 public: 44 explicit MockHttpAuthHandlerFactory(int return_code) : 45 return_code_(return_code) {} 46 virtual ~MockHttpAuthHandlerFactory() {} 47 48 virtual int CreateAuthHandler(HttpAuthChallengeTokenizer* challenge, 49 HttpAuth::Target target, 50 const GURL& origin, 51 CreateReason reason, 52 int nonce_count, 53 const BoundNetLog& net_log, 54 scoped_ptr<HttpAuthHandler>* handler) OVERRIDE { 55 handler->reset(); 56 return return_code_; 57 } 58 59 private: 60 int return_code_; 61 }; 62 63 class URLRequestContextBuilderTest : public PlatformTest { 64 protected: 65 URLRequestContextBuilderTest() 66 : test_server_( 67 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))) { 68 #if defined(OS_LINUX) || defined(OS_ANDROID) 69 builder_.set_proxy_config_service( 70 new ProxyConfigServiceFixed(ProxyConfig::CreateDirect())); 71 #endif // defined(OS_LINUX) || defined(OS_ANDROID) 72 } 73 74 LocalHttpTestServer test_server_; 75 URLRequestContextBuilder builder_; 76 }; 77 78 TEST_F(URLRequestContextBuilderTest, DefaultSettings) { 79 ASSERT_TRUE(test_server_.Start()); 80 81 scoped_ptr<URLRequestContext> context(builder_.Build()); 82 TestDelegate delegate; 83 scoped_ptr<URLRequest> request( 84 context->CreateRequest(test_server_.GetURL("echoheader?Foo"), 85 DEFAULT_PRIORITY, 86 &delegate, 87 context->cookie_store())); 88 request->set_method("GET"); 89 request->SetExtraRequestHeaderByName("Foo", "Bar", false); 90 request->Start(); 91 base::MessageLoop::current()->Run(); 92 EXPECT_EQ("Bar", delegate.data_received()); 93 } 94 95 TEST_F(URLRequestContextBuilderTest, UserAgent) { 96 ASSERT_TRUE(test_server_.Start()); 97 98 builder_.set_user_agent("Bar"); 99 scoped_ptr<URLRequestContext> context(builder_.Build()); 100 TestDelegate delegate; 101 scoped_ptr<URLRequest> request( 102 context->CreateRequest(test_server_.GetURL("echoheader?User-Agent"), 103 DEFAULT_PRIORITY, 104 &delegate, 105 NULL)); 106 request->set_method("GET"); 107 request->Start(); 108 base::MessageLoop::current()->Run(); 109 EXPECT_EQ("Bar", delegate.data_received()); 110 } 111 112 TEST_F(URLRequestContextBuilderTest, ExtraHttpAuthHandlerFactory) { 113 GURL gurl("www.google.com"); 114 const int kBasicReturnCode = net::OK; 115 MockHttpAuthHandlerFactory* mock_factory_basic = 116 new MockHttpAuthHandlerFactory(kBasicReturnCode); 117 scoped_ptr<HttpAuthHandler> handler; 118 builder_.add_http_auth_handler_factory("ExtraScheme", mock_factory_basic); 119 scoped_ptr<URLRequestContext> context(builder_.Build()); 120 // Verify that a handler is returned for and added scheme. 121 EXPECT_EQ(kBasicReturnCode, 122 context->http_auth_handler_factory()->CreateAuthHandlerFromString( 123 "ExtraScheme", 124 HttpAuth::AUTH_SERVER, 125 gurl, 126 BoundNetLog(), 127 &handler)); 128 // Verify that a handler isn't returned for a bogus scheme. 129 EXPECT_EQ(ERR_UNSUPPORTED_AUTH_SCHEME, 130 context->http_auth_handler_factory()->CreateAuthHandlerFromString( 131 "Bogus", HttpAuth::AUTH_SERVER, gurl, BoundNetLog(), &handler)); 132 } 133 134 } // namespace 135 136 } // namespace net 137