// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/scoped_ptr.h" #include "net/base/net_errors.h" #include "net/http/http_auth_handler.h" #include "net/http/http_auth_handler_factory.h" #include "testing/gtest/include/gtest/gtest.h" namespace net { class MockHttpAuthHandlerFactory : public HttpAuthHandlerFactory { public: explicit MockHttpAuthHandlerFactory(int return_code) : return_code_(return_code) {} virtual ~MockHttpAuthHandlerFactory() {} virtual int CreateAuthHandler(HttpAuth::ChallengeTokenizer* challenge, HttpAuth::Target target, const GURL& origin, scoped_refptr* handler) { *handler = NULL; return return_code_; } private: int return_code_; }; TEST(HttpAuthHandlerFactoryTest, RegistryFactory) { HttpAuthHandlerRegistryFactory registry_factory; GURL gurl("www.google.com"); const int kBasicReturnCode = ERR_INVALID_SPDY_STREAM; MockHttpAuthHandlerFactory* mock_factory_basic = new MockHttpAuthHandlerFactory(kBasicReturnCode); const int kDigestReturnCode = ERR_PAC_SCRIPT_FAILED; MockHttpAuthHandlerFactory* mock_factory_digest = new MockHttpAuthHandlerFactory(kDigestReturnCode); const int kDigestReturnCodeReplace = ERR_SYN_REPLY_NOT_RECEIVED; MockHttpAuthHandlerFactory* mock_factory_digest_replace = new MockHttpAuthHandlerFactory(kDigestReturnCodeReplace); scoped_refptr handler; // No schemes should be supported in the beginning. EXPECT_EQ(ERR_UNSUPPORTED_AUTH_SCHEME, registry_factory.CreateAuthHandlerFromString( "Basic", HttpAuth::AUTH_SERVER, gurl, &handler)); // Test what happens with a single scheme. registry_factory.RegisterSchemeFactory("Basic", mock_factory_basic); EXPECT_EQ(kBasicReturnCode, registry_factory.CreateAuthHandlerFromString( "Basic", HttpAuth::AUTH_SERVER, gurl, &handler)); EXPECT_EQ(ERR_UNSUPPORTED_AUTH_SCHEME, registry_factory.CreateAuthHandlerFromString( "Digest", HttpAuth::AUTH_SERVER, gurl, &handler)); // Test multiple schemes registry_factory.RegisterSchemeFactory("Digest", mock_factory_digest); EXPECT_EQ(kBasicReturnCode, registry_factory.CreateAuthHandlerFromString( "Basic", HttpAuth::AUTH_SERVER, gurl, &handler)); EXPECT_EQ(kDigestReturnCode, registry_factory.CreateAuthHandlerFromString( "Digest", HttpAuth::AUTH_SERVER, gurl, &handler)); // Test case-insensitivity EXPECT_EQ(kBasicReturnCode, registry_factory.CreateAuthHandlerFromString( "basic", HttpAuth::AUTH_SERVER, gurl, &handler)); // Test replacement of existing auth scheme registry_factory.RegisterSchemeFactory("Digest", mock_factory_digest_replace); EXPECT_EQ(kBasicReturnCode, registry_factory.CreateAuthHandlerFromString( "Basic", HttpAuth::AUTH_SERVER, gurl, &handler)); EXPECT_EQ(kDigestReturnCodeReplace, registry_factory.CreateAuthHandlerFromString( "Digest", HttpAuth::AUTH_SERVER, gurl, &handler)); } TEST(HttpAuthHandlerFactoryTest, DefaultFactory) { scoped_ptr http_auth_handler_factory( HttpAuthHandlerFactory::CreateDefault()); GURL server_origin("http://www.example.com"); GURL proxy_origin("http://cache.example.com:3128"); { scoped_refptr handler; int rv = http_auth_handler_factory->CreateAuthHandlerFromString( "Basic realm=\"FooBar\"", HttpAuth::AUTH_SERVER, server_origin, &handler); EXPECT_EQ(OK, rv); EXPECT_FALSE(handler.get() == NULL); EXPECT_STREQ("basic", handler->scheme().c_str()); EXPECT_STREQ("FooBar", handler->realm().c_str()); EXPECT_EQ(HttpAuth::AUTH_SERVER, handler->target()); EXPECT_FALSE(handler->encrypts_identity()); EXPECT_FALSE(handler->is_connection_based()); } { scoped_refptr handler; int rv = http_auth_handler_factory->CreateAuthHandlerFromString( "UNSUPPORTED realm=\"FooBar\"", HttpAuth::AUTH_SERVER, server_origin, &handler); EXPECT_EQ(ERR_UNSUPPORTED_AUTH_SCHEME, rv); EXPECT_TRUE(handler.get() == NULL); } { scoped_refptr handler; int rv = http_auth_handler_factory->CreateAuthHandlerFromString( "Digest realm=\"FooBar\", nonce=\"xyz\"", HttpAuth::AUTH_PROXY, proxy_origin, &handler); EXPECT_EQ(OK, rv); EXPECT_FALSE(handler.get() == NULL); EXPECT_STREQ("digest", handler->scheme().c_str()); EXPECT_STREQ("FooBar", handler->realm().c_str()); EXPECT_EQ(HttpAuth::AUTH_PROXY, handler->target()); EXPECT_TRUE(handler->encrypts_identity()); EXPECT_FALSE(handler->is_connection_based()); } { scoped_refptr handler; int rv = http_auth_handler_factory->CreateAuthHandlerFromString( "NTLM", HttpAuth::AUTH_SERVER, server_origin, &handler); EXPECT_EQ(OK, rv); EXPECT_FALSE(handler.get() == NULL); EXPECT_STREQ("ntlm", handler->scheme().c_str()); EXPECT_STREQ("", handler->realm().c_str()); EXPECT_EQ(HttpAuth::AUTH_SERVER, handler->target()); EXPECT_TRUE(handler->encrypts_identity()); EXPECT_TRUE(handler->is_connection_based()); } #if defined(OS_WIN) { scoped_refptr handler; int rv = http_auth_handler_factory->CreateAuthHandlerFromString( "Negotiate", HttpAuth::AUTH_SERVER, server_origin, &handler); EXPECT_EQ(OK, rv); EXPECT_FALSE(handler.get() == NULL); EXPECT_STREQ("negotiate", handler->scheme().c_str()); EXPECT_STREQ("", handler->realm().c_str()); EXPECT_EQ(HttpAuth::AUTH_SERVER, handler->target()); EXPECT_TRUE(handler->encrypts_identity()); EXPECT_TRUE(handler->is_connection_based()); } #else // !defined(OS_WIN) { scoped_refptr handler; int rv = http_auth_handler_factory->CreateAuthHandlerFromString( "Negotiate", HttpAuth::AUTH_SERVER, server_origin, &handler); EXPECT_EQ(ERR_UNSUPPORTED_AUTH_SCHEME, rv); EXPECT_TRUE(handler.get() == NULL); } #endif // !defined(OS_WIN) } } // namespace net