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 "chrome/browser/net/dns_probe_service.h" 6 7 #include "base/bind.h" 8 #include "base/compiler_specific.h" 9 #include "base/memory/weak_ptr.h" 10 #include "base/message_loop/message_loop.h" 11 #include "base/run_loop.h" 12 #include "chrome/browser/net/dns_probe_runner.h" 13 #include "chrome/browser/net/dns_probe_test_util.h" 14 #include "chrome/common/net/net_error_info.h" 15 #include "content/public/test/test_browser_thread_bundle.h" 16 #include "net/dns/dns_test_util.h" 17 #include "testing/gtest/include/gtest/gtest.h" 18 19 using base::MessageLoopForIO; 20 using base::RunLoop; 21 using chrome_common_net::DnsProbeStatus; 22 using content::TestBrowserThreadBundle; 23 using net::MockDnsClientRule; 24 25 namespace chrome_browser_net { 26 27 namespace { 28 29 class DnsProbeServiceTest : public testing::Test { 30 public: 31 DnsProbeServiceTest() 32 : callback_called_(false), 33 callback_result_(chrome_common_net::DNS_PROBE_MAX) { 34 } 35 36 void Probe() { 37 service_.ProbeDns(base::Bind(&DnsProbeServiceTest::ProbeCallback, 38 base::Unretained(this))); 39 } 40 41 void Reset() { 42 callback_called_ = false; 43 } 44 45 protected: 46 void SetRules(MockDnsClientRule::Result system_query_result, 47 MockDnsClientRule::Result public_query_result) { 48 service_.SetSystemClientForTesting( 49 CreateMockDnsClientForProbes(system_query_result)); 50 service_.SetPublicClientForTesting( 51 CreateMockDnsClientForProbes(public_query_result)); 52 } 53 54 void RunTest(MockDnsClientRule::Result system_query_result, 55 MockDnsClientRule::Result public_query_result, 56 DnsProbeStatus expected_result) { 57 Reset(); 58 SetRules(system_query_result, public_query_result); 59 60 Probe(); 61 RunLoop().RunUntilIdle(); 62 EXPECT_TRUE(callback_called_); 63 EXPECT_EQ(expected_result, callback_result_); 64 } 65 66 void ClearCachedResult() { 67 service_.ClearCachedResultForTesting(); 68 } 69 70 private: 71 void ProbeCallback(DnsProbeStatus result) { 72 EXPECT_FALSE(callback_called_); 73 callback_called_ = true; 74 callback_result_ = result; 75 } 76 77 DnsProbeService service_; 78 bool callback_called_; 79 DnsProbeStatus callback_result_; 80 TestBrowserThreadBundle bundle_; 81 }; 82 83 TEST_F(DnsProbeServiceTest, Probe_OK_OK) { 84 RunTest(MockDnsClientRule::OK, MockDnsClientRule::OK, 85 chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); 86 } 87 88 TEST_F(DnsProbeServiceTest, Probe_TIMEOUT_OK) { 89 RunTest(MockDnsClientRule::TIMEOUT, MockDnsClientRule::OK, 90 chrome_common_net::DNS_PROBE_FINISHED_BAD_CONFIG); 91 } 92 93 TEST_F(DnsProbeServiceTest, Probe_TIMEOUT_TIMEOUT) { 94 RunTest(MockDnsClientRule::TIMEOUT, MockDnsClientRule::TIMEOUT, 95 chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET); 96 } 97 98 TEST_F(DnsProbeServiceTest, Probe_OK_FAIL) { 99 RunTest(MockDnsClientRule::OK, MockDnsClientRule::FAIL, 100 chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); 101 } 102 103 TEST_F(DnsProbeServiceTest, Probe_FAIL_OK) { 104 RunTest(MockDnsClientRule::FAIL, MockDnsClientRule::OK, 105 chrome_common_net::DNS_PROBE_FINISHED_BAD_CONFIG); 106 } 107 108 TEST_F(DnsProbeServiceTest, Probe_FAIL_FAIL) { 109 RunTest(MockDnsClientRule::FAIL, MockDnsClientRule::FAIL, 110 chrome_common_net::DNS_PROBE_FINISHED_INCONCLUSIVE); 111 } 112 113 TEST_F(DnsProbeServiceTest, Cache) { 114 RunTest(MockDnsClientRule::OK, MockDnsClientRule::OK, 115 chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); 116 // Cached NXDOMAIN result should persist, not the result from the new rules. 117 RunTest(MockDnsClientRule::TIMEOUT, MockDnsClientRule::TIMEOUT, 118 chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); 119 } 120 121 TEST_F(DnsProbeServiceTest, Expire) { 122 RunTest(MockDnsClientRule::OK, MockDnsClientRule::OK, 123 chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); 124 // Pretend cache expires. 125 ClearCachedResult(); 126 // New rules should apply, since a new probe should be run. 127 RunTest(MockDnsClientRule::TIMEOUT, MockDnsClientRule::TIMEOUT, 128 chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET); 129 } 130 131 } // namespace 132 133 } // namespace chrome_browser_net 134