1 // Copyright 2013 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 "base/bind.h" 6 #include "base/memory/weak_ptr.h" 7 #include "base/message_loop/message_loop.h" 8 #include "base/run_loop.h" 9 #include "chrome/browser/net/dns_probe_runner.h" 10 #include "chrome/browser/net/dns_probe_test_util.h" 11 #include "content/public/test/test_browser_thread_bundle.h" 12 #include "net/dns/dns_client.h" 13 #include "testing/gtest/include/gtest/gtest.h" 14 15 using base::MessageLoopForIO; 16 using base::RunLoop; 17 using content::TestBrowserThreadBundle; 18 using net::DnsClient; 19 using net::DnsConfig; 20 using net::MockDnsClientRule; 21 22 namespace chrome_browser_net { 23 24 namespace { 25 26 class TestDnsProbeRunnerCallback { 27 public: 28 TestDnsProbeRunnerCallback() 29 : callback_(base::Bind(&TestDnsProbeRunnerCallback::OnCalled, 30 base::Unretained(this))), 31 called_(false) {} 32 33 const base::Closure& callback() const { return callback_; } 34 bool called() const { return called_; } 35 36 private: 37 void OnCalled() { 38 EXPECT_FALSE(called_); 39 called_ = true; 40 } 41 42 base::Closure callback_; 43 bool called_; 44 }; 45 46 class DnsProbeRunnerTest : public testing::Test { 47 protected: 48 void RunTest(MockDnsClientRule::Result query_result, 49 DnsProbeRunner::Result expected_probe_result); 50 51 TestBrowserThreadBundle bundle_; 52 DnsProbeRunner runner_; 53 }; 54 55 void DnsProbeRunnerTest::RunTest( 56 MockDnsClientRule::Result query_result, 57 DnsProbeRunner::Result expected_probe_result) { 58 TestDnsProbeRunnerCallback callback; 59 60 runner_.SetClient(CreateMockDnsClientForProbes(query_result)); 61 runner_.RunProbe(callback.callback()); 62 EXPECT_TRUE(runner_.IsRunning()); 63 64 RunLoop().RunUntilIdle(); 65 EXPECT_FALSE(runner_.IsRunning()); 66 EXPECT_TRUE(callback.called()); 67 EXPECT_EQ(expected_probe_result, runner_.result()); 68 } 69 70 TEST_F(DnsProbeRunnerTest, Probe_OK) { 71 RunTest(MockDnsClientRule::OK, DnsProbeRunner::CORRECT); 72 } 73 74 TEST_F(DnsProbeRunnerTest, Probe_EMPTY) { 75 RunTest(MockDnsClientRule::EMPTY, DnsProbeRunner::INCORRECT); 76 } 77 78 TEST_F(DnsProbeRunnerTest, Probe_TIMEOUT) { 79 RunTest(MockDnsClientRule::TIMEOUT, DnsProbeRunner::UNREACHABLE); 80 } 81 82 TEST_F(DnsProbeRunnerTest, Probe_FAIL) { 83 RunTest(MockDnsClientRule::FAIL, DnsProbeRunner::INCORRECT); 84 } 85 86 TEST_F(DnsProbeRunnerTest, TwoProbes) { 87 RunTest(MockDnsClientRule::OK, DnsProbeRunner::CORRECT); 88 RunTest(MockDnsClientRule::EMPTY, DnsProbeRunner::INCORRECT); 89 } 90 91 TEST_F(DnsProbeRunnerTest, InvalidDnsConfig) { 92 scoped_ptr<DnsClient> dns_client(DnsClient::CreateClient(NULL)); 93 DnsConfig empty_config; 94 dns_client->SetConfig(empty_config); 95 ASSERT_EQ(NULL, dns_client->GetTransactionFactory()); 96 runner_.SetClient(dns_client.Pass()); 97 98 TestDnsProbeRunnerCallback callback; 99 100 runner_.RunProbe(callback.callback()); 101 EXPECT_TRUE(runner_.IsRunning()); 102 103 RunLoop().RunUntilIdle(); 104 EXPECT_FALSE(runner_.IsRunning()); 105 EXPECT_TRUE(callback.called()); 106 EXPECT_EQ(DnsProbeRunner::UNKNOWN, runner_.result()); 107 } 108 109 } // namespace 110 111 } // namespace chrome_browser_net 112