17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/bind.h"
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/weak_ptr.h"
79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/run_loop.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/net/dns_probe_runner.h"
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/net/dns_probe_test_util.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/dns/dns_client.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing base::MessageLoopForIO;
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing base::RunLoop;
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing content::TestBrowserThreadBundle;
18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing net::DnsClient;
19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing net::DnsConfig;
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing net::MockDnsClientRule;
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace chrome_browser_net {
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace {
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass TestDnsProbeRunnerCallback {
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  TestDnsProbeRunnerCallback()
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      : callback_(base::Bind(&TestDnsProbeRunnerCallback::OnCalled,
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                             base::Unretained(this))),
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        called_(false) {}
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::Closure& callback() const { return callback_; }
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool called() const { return called_; }
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void OnCalled() {
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(called_);
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    called_ = true;
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::Closure callback_;
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool called_;
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DnsProbeRunnerTest : public testing::Test {
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void RunTest(MockDnsClientRule::Result query_result,
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               DnsProbeRunner::Result expected_probe_result);
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  TestBrowserThreadBundle bundle_;
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DnsProbeRunner runner_;
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DnsProbeRunnerTest::RunTest(
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    MockDnsClientRule::Result query_result,
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DnsProbeRunner::Result expected_probe_result) {
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  TestDnsProbeRunnerCallback callback;
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  runner_.SetClient(CreateMockDnsClientForProbes(query_result));
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  runner_.RunProbe(callback.callback());
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(runner_.IsRunning());
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RunLoop().RunUntilIdle();
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(runner_.IsRunning());
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(callback.called());
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(expected_probe_result, runner_.result());
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(DnsProbeRunnerTest, Probe_OK) {
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RunTest(MockDnsClientRule::OK, DnsProbeRunner::CORRECT);
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(DnsProbeRunnerTest, Probe_EMPTY) {
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RunTest(MockDnsClientRule::EMPTY, DnsProbeRunner::INCORRECT);
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(DnsProbeRunnerTest, Probe_TIMEOUT) {
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RunTest(MockDnsClientRule::TIMEOUT, DnsProbeRunner::UNREACHABLE);
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(DnsProbeRunnerTest, Probe_FAIL) {
83ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RunTest(MockDnsClientRule::FAIL, DnsProbeRunner::INCORRECT);
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(DnsProbeRunnerTest, TwoProbes) {
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RunTest(MockDnsClientRule::OK, DnsProbeRunner::CORRECT);
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RunTest(MockDnsClientRule::EMPTY, DnsProbeRunner::INCORRECT);
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(DnsProbeRunnerTest, InvalidDnsConfig) {
92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<DnsClient> dns_client(DnsClient::CreateClient(NULL));
93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DnsConfig empty_config;
94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  dns_client->SetConfig(empty_config);
95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ASSERT_EQ(NULL, dns_client->GetTransactionFactory());
96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  runner_.SetClient(dns_client.Pass());
97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  TestDnsProbeRunnerCallback callback;
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  runner_.RunProbe(callback.callback());
101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_TRUE(runner_.IsRunning());
102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RunLoop().RunUntilIdle();
104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_FALSE(runner_.IsRunning());
105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_TRUE(callback.called());
106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(DnsProbeRunner::UNKNOWN, runner_.result());
107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace chrome_browser_net
112