blob: cee54752f4b5d9f90729756f5b311903cbe542cb [file] [log] [blame]
// 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.h"
#include "base/run_loop.h"
#include "chrome/browser/net/dns_probe_job.h"
#include "chrome/common/net/net_error_info.h"
#include "testing/gtest/include/gtest/gtest.h"
using chrome_common_net::DnsProbeResult;
namespace chrome_browser_net {
namespace {
class MockDnsProbeJob : public DnsProbeJob {
public:
MockDnsProbeJob(const CallbackType& callback,
DnsProbeJob::Result result)
: weak_factory_(this) {
MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(&MockDnsProbeJob::CallCallback,
weak_factory_.GetWeakPtr(),
callback,
result));
}
virtual ~MockDnsProbeJob() { }
private:
void CallCallback(const CallbackType& callback, Result result) {
callback.Run(this, result);
}
base::WeakPtrFactory<MockDnsProbeJob> weak_factory_;
};
class TestDnsProbeService : public DnsProbeService {
public:
TestDnsProbeService()
: DnsProbeService(),
system_job_created_(false),
public_job_created_(false),
mock_system_result_(DnsProbeJob::SERVERS_UNKNOWN),
mock_public_result_(DnsProbeJob::SERVERS_UNKNOWN),
mock_system_fail_(false) {
}
virtual ~TestDnsProbeService() { }
void set_mock_results(
DnsProbeJob::Result mock_system_result,
DnsProbeJob::Result mock_public_result) {
mock_system_result_ = mock_system_result;
mock_public_result_ = mock_public_result;
}
void set_mock_system_fail(bool mock_system_fail) {
mock_system_fail_ = mock_system_fail;
}
bool jobs_created(void) {
return system_job_created_ && public_job_created_;
}
void ResetJobsCreated() {
system_job_created_ = false;
public_job_created_ = false;
}
void MockExpireResults() {
ExpireResults();
}
bool system_job_created_;
bool public_job_created_;
private:
// Override methods in DnsProbeService to return mock jobs:
virtual scoped_ptr<DnsProbeJob> CreateSystemProbeJob(
const DnsProbeJob::CallbackType& job_callback) OVERRIDE {
if (mock_system_fail_)
return scoped_ptr<DnsProbeJob>(NULL);
system_job_created_ = true;
return scoped_ptr<DnsProbeJob>(
new MockDnsProbeJob(job_callback,
mock_system_result_));
}
virtual scoped_ptr<DnsProbeJob> CreatePublicProbeJob(
const DnsProbeJob::CallbackType& job_callback) OVERRIDE {
public_job_created_ = true;
return scoped_ptr<DnsProbeJob>(
new MockDnsProbeJob(job_callback,
mock_public_result_));
}
DnsProbeJob::Result mock_system_result_;
DnsProbeJob::Result mock_public_result_;
bool mock_system_fail_;
};
class DnsProbeServiceTest : public testing::Test {
public:
DnsProbeServiceTest()
: callback_called_(false),
callback_result_(chrome_common_net::DNS_PROBE_UNKNOWN) {
}
void Probe() {
service_.ProbeDns(base::Bind(&DnsProbeServiceTest::ProbeCallback,
base::Unretained(this)));
}
void RunUntilIdle() {
base::RunLoop run_loop;
run_loop.RunUntilIdle();
}
void Reset() {
service_.ResetJobsCreated();
callback_called_ = false;
}
MessageLoopForIO message_loop_;
TestDnsProbeService service_;
bool callback_called_;
DnsProbeResult callback_result_;
private:
void ProbeCallback(DnsProbeResult result) {
callback_called_ = true;
callback_result_ = result;
}
};
TEST_F(DnsProbeServiceTest, Null) {
}
TEST_F(DnsProbeServiceTest, Probe) {
service_.set_mock_results(DnsProbeJob::SERVERS_CORRECT,
DnsProbeJob::SERVERS_CORRECT);
Probe();
EXPECT_TRUE(service_.jobs_created());
EXPECT_FALSE(callback_called_);
RunUntilIdle();
EXPECT_TRUE(callback_called_);
EXPECT_EQ(chrome_common_net::DNS_PROBE_NXDOMAIN, callback_result_);
}
TEST_F(DnsProbeServiceTest, Cache) {
service_.set_mock_results(DnsProbeJob::SERVERS_CORRECT,
DnsProbeJob::SERVERS_CORRECT);
Probe();
RunUntilIdle();
Reset();
// Cached NXDOMAIN result should persist.
Probe();
EXPECT_FALSE(service_.jobs_created());
RunUntilIdle();
EXPECT_TRUE(callback_called_);
EXPECT_EQ(chrome_common_net::DNS_PROBE_NXDOMAIN, callback_result_);
}
TEST_F(DnsProbeServiceTest, Expired) {
service_.set_mock_results(DnsProbeJob::SERVERS_CORRECT,
DnsProbeJob::SERVERS_CORRECT);
Probe();
EXPECT_TRUE(service_.jobs_created());
RunUntilIdle();
EXPECT_TRUE(callback_called_);
EXPECT_EQ(chrome_common_net::DNS_PROBE_NXDOMAIN, callback_result_);
Reset();
service_.MockExpireResults();
Probe();
EXPECT_TRUE(service_.jobs_created());
RunUntilIdle();
EXPECT_TRUE(callback_called_);
EXPECT_EQ(chrome_common_net::DNS_PROBE_NXDOMAIN, callback_result_);
}
TEST_F(DnsProbeServiceTest, SystemFail) {
service_.set_mock_results(DnsProbeJob::SERVERS_CORRECT,
DnsProbeJob::SERVERS_CORRECT);
service_.set_mock_system_fail(true);
Probe();
EXPECT_TRUE(callback_called_);
EXPECT_EQ(chrome_common_net::DNS_PROBE_UNKNOWN, callback_result_);
Reset();
RunUntilIdle();
EXPECT_FALSE(callback_called_);
}
} // namespace
} // namespace chrome_browser_net