// Copyright 2015 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 "net/proxy/proxy_resolver_factory.h" #include "net/base/net_errors.h" #include "net/base/test_completion_callback.h" #include "net/proxy/mock_proxy_resolver.h" #include "net/proxy/proxy_resolver.h" #include "net/proxy/proxy_resolver_script_data.h" #include "testing/gtest/include/gtest/gtest.h" namespace net { namespace { void Fail(int error) { FAIL() << "Unexpected callback called"; } class TestProxyResolver : public MockAsyncProxyResolver { public: int SetPacScript(const scoped_refptr& script_data, const CompletionCallback& callback) override { int result = MockAsyncProxyResolver::SetPacScript(script_data, callback); if (synchronous_) return error_to_return_; return result; } void set_error_to_return(Error error) { synchronous_ = true; error_to_return_ = error; } private: bool synchronous_ = false; Error error_to_return_ = OK; }; class TestLegacyProxyResolverFactory : public LegacyProxyResolverFactory { public: using ProxyResolverFactory::CreateProxyResolver; explicit TestLegacyProxyResolverFactory(ProxyResolver* resolver) : LegacyProxyResolverFactory(false), resolver_(resolver) {} // LegacyProxyResolverFactory override. scoped_ptr CreateProxyResolver() override { return make_scoped_ptr(new ForwardingProxyResolver(resolver_)); } private: ProxyResolver* resolver_; DISALLOW_COPY_AND_ASSIGN(TestLegacyProxyResolverFactory); }; } // namespace class LegacyProxyResolverFactoryTest : public testing::Test { public: void SetUp() override { factory_.reset(new TestLegacyProxyResolverFactory(&resolver_)); } ProxyResolverFactory& factory() { return *factory_; } TestProxyResolver& mock_resolver() { return resolver_; } private: TestProxyResolver resolver_; scoped_ptr factory_; }; TEST_F(LegacyProxyResolverFactoryTest, Async_Success) { const GURL url("http://proxy"); TestCompletionCallback callback; scoped_ptr resolver; scoped_ptr request; EXPECT_EQ(ERR_IO_PENDING, factory().CreateProxyResolver( ProxyResolverScriptData::FromURL(url), &resolver, callback.callback(), &request)); ASSERT_TRUE(mock_resolver().has_pending_set_pac_script_request()); EXPECT_EQ( url, mock_resolver().pending_set_pac_script_request()->script_data()->url()); mock_resolver().pending_set_pac_script_request()->CompleteNow(OK); EXPECT_EQ(OK, callback.WaitForResult()); EXPECT_TRUE(resolver); } TEST_F(LegacyProxyResolverFactoryTest, Async_Error) { const GURL url("http://proxy"); TestCompletionCallback callback; scoped_ptr resolver; scoped_ptr request; EXPECT_EQ(ERR_IO_PENDING, factory().CreateProxyResolver( ProxyResolverScriptData::FromURL(url), &resolver, callback.callback(), &request)); ASSERT_TRUE(mock_resolver().has_pending_set_pac_script_request()); EXPECT_EQ( url, mock_resolver().pending_set_pac_script_request()->script_data()->url()); mock_resolver().pending_set_pac_script_request()->CompleteNow(ERR_FAILED); EXPECT_EQ(ERR_FAILED, callback.WaitForResult()); EXPECT_FALSE(resolver); } TEST_F(LegacyProxyResolverFactoryTest, Async_Cancel) { const GURL url("http://proxy"); scoped_ptr resolver; scoped_ptr request; EXPECT_EQ(ERR_IO_PENDING, factory().CreateProxyResolver( ProxyResolverScriptData::FromURL(url), &resolver, base::Bind(&Fail), &request)); ASSERT_TRUE(mock_resolver().has_pending_set_pac_script_request()); EXPECT_EQ( url, mock_resolver().pending_set_pac_script_request()->script_data()->url()); request.reset(); EXPECT_FALSE(resolver); } TEST_F(LegacyProxyResolverFactoryTest, Async_DeleteFactory) { const GURL url("http://proxy"); scoped_ptr resolver; scoped_ptr request; { TestProxyResolver test_resolver; TestLegacyProxyResolverFactory factory(&test_resolver); EXPECT_EQ(ERR_IO_PENDING, factory.CreateProxyResolver( ProxyResolverScriptData::FromURL(url), &resolver, base::Bind(&Fail), &request)); ASSERT_TRUE(test_resolver.has_pending_set_pac_script_request()); EXPECT_EQ( url, test_resolver.pending_set_pac_script_request()->script_data()->url()); } EXPECT_FALSE(resolver); } TEST_F(LegacyProxyResolverFactoryTest, Sync_Success) { const GURL url("http://proxy"); TestCompletionCallback callback; scoped_ptr resolver; scoped_ptr request; mock_resolver().set_error_to_return(OK); EXPECT_EQ(OK, factory().CreateProxyResolver( ProxyResolverScriptData::FromURL(url), &resolver, callback.callback(), &request)); ASSERT_TRUE(mock_resolver().has_pending_set_pac_script_request()); EXPECT_EQ( url, mock_resolver().pending_set_pac_script_request()->script_data()->url()); EXPECT_TRUE(resolver); } TEST_F(LegacyProxyResolverFactoryTest, Sync_Error) { const GURL url("http://proxy"); TestCompletionCallback callback; scoped_ptr resolver; scoped_ptr request; mock_resolver().set_error_to_return(ERR_FAILED); EXPECT_EQ(ERR_FAILED, factory().CreateProxyResolver( ProxyResolverScriptData::FromURL(url), &resolver, callback.callback(), &request)); ASSERT_TRUE(mock_resolver().has_pending_set_pac_script_request()); EXPECT_EQ( url, mock_resolver().pending_set_pac_script_request()->script_data()->url()); EXPECT_FALSE(resolver); } } // namespace net