// Copyright (c) 2012 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 "chrome/browser/net/dns_probe_service.h" #include "base/bind.h" #include "base/compiler_specific.h" #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "chrome/browser/net/dns_probe_runner.h" #include "chrome/browser/net/dns_probe_test_util.h" #include "components/error_page/common/net_error_info.h" #include "content/public/test/test_browser_thread_bundle.h" #include "net/dns/dns_test_util.h" #include "testing/gtest/include/gtest/gtest.h" using base::MessageLoopForIO; using base::RunLoop; using chrome_common_net::DnsProbeStatus; using content::TestBrowserThreadBundle; using net::MockDnsClientRule; namespace chrome_browser_net { namespace { class DnsProbeServiceTest : public testing::Test { public: DnsProbeServiceTest() : callback_called_(false), callback_result_(chrome_common_net::DNS_PROBE_MAX) { } void Probe() { service_.ProbeDns(base::Bind(&DnsProbeServiceTest::ProbeCallback, base::Unretained(this))); } void Reset() { callback_called_ = false; } protected: void SetRules(MockDnsClientRule::Result system_query_result, MockDnsClientRule::Result public_query_result) { service_.SetSystemClientForTesting( CreateMockDnsClientForProbes(system_query_result)); service_.SetPublicClientForTesting( CreateMockDnsClientForProbes(public_query_result)); } void RunTest(MockDnsClientRule::Result system_query_result, MockDnsClientRule::Result public_query_result, DnsProbeStatus expected_result) { Reset(); SetRules(system_query_result, public_query_result); Probe(); RunLoop().RunUntilIdle(); EXPECT_TRUE(callback_called_); EXPECT_EQ(expected_result, callback_result_); } void ClearCachedResult() { service_.ClearCachedResultForTesting(); } private: void ProbeCallback(DnsProbeStatus result) { EXPECT_FALSE(callback_called_); callback_called_ = true; callback_result_ = result; } DnsProbeService service_; bool callback_called_; DnsProbeStatus callback_result_; TestBrowserThreadBundle bundle_; }; TEST_F(DnsProbeServiceTest, Probe_OK_OK) { RunTest(MockDnsClientRule::OK, MockDnsClientRule::OK, chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); } TEST_F(DnsProbeServiceTest, Probe_TIMEOUT_OK) { RunTest(MockDnsClientRule::TIMEOUT, MockDnsClientRule::OK, chrome_common_net::DNS_PROBE_FINISHED_BAD_CONFIG); } TEST_F(DnsProbeServiceTest, Probe_TIMEOUT_TIMEOUT) { RunTest(MockDnsClientRule::TIMEOUT, MockDnsClientRule::TIMEOUT, chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET); } TEST_F(DnsProbeServiceTest, Probe_OK_FAIL) { RunTest(MockDnsClientRule::OK, MockDnsClientRule::FAIL, chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); } TEST_F(DnsProbeServiceTest, Probe_FAIL_OK) { RunTest(MockDnsClientRule::FAIL, MockDnsClientRule::OK, chrome_common_net::DNS_PROBE_FINISHED_BAD_CONFIG); } TEST_F(DnsProbeServiceTest, Probe_FAIL_FAIL) { RunTest(MockDnsClientRule::FAIL, MockDnsClientRule::FAIL, chrome_common_net::DNS_PROBE_FINISHED_INCONCLUSIVE); } TEST_F(DnsProbeServiceTest, Cache) { RunTest(MockDnsClientRule::OK, MockDnsClientRule::OK, chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); // Cached NXDOMAIN result should persist, not the result from the new rules. RunTest(MockDnsClientRule::TIMEOUT, MockDnsClientRule::TIMEOUT, chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); } TEST_F(DnsProbeServiceTest, Expire) { RunTest(MockDnsClientRule::OK, MockDnsClientRule::OK, chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); // Pretend cache expires. ClearCachedResult(); // New rules should apply, since a new probe should be run. RunTest(MockDnsClientRule::TIMEOUT, MockDnsClientRule::TIMEOUT, chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET); } } // namespace } // namespace chrome_browser_net