blob: 9c6eb3a65ab68649ee10323ffe171720e3421bcc [file] [log] [blame]
Peter Qiud670d032014-06-03 15:04:43 -07001// Copyright (c) 2012 The Chromium OS 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 "shill/dns_server_tester.h"
6
7#include <string>
8
9#include <base/bind.h>
10#include <base/memory/scoped_ptr.h>
11#include <gmock/gmock.h>
12#include <gtest/gtest.h>
13
14#include "shill/mock_connection.h"
15#include "shill/mock_control.h"
16#include "shill/mock_device_info.h"
Peter Qiud670d032014-06-03 15:04:43 -070017#include "shill/mock_dns_client.h"
18#include "shill/mock_dns_client_factory.h"
Alex Vakulenkoa41ab512014-07-23 14:24:23 -070019#include "shill/mock_event_dispatcher.h"
Peter Qiud670d032014-06-03 15:04:43 -070020#include "shill/mock_time.h"
21
22using base::Bind;
23using base::Callback;
24using base::Unretained;
25using std::string;
26using std::vector;
27using testing::_;
28using testing::AtLeast;
29using testing::DoAll;
30using testing::InSequence;
31using testing::Mock;
32using testing::NiceMock;
33using testing::Return;
34using testing::ReturnRef;
35using testing::SetArgumentPointee;
36using testing::StrictMock;
37using testing::Test;
38
39namespace shill {
40
41namespace {
42const char kInterfaceName[] = "int0";
43const char kDNSServer0[] = "8.8.8.8";
44const char kDNSServer1[] = "8.8.4.4";
45const char *kDNSServers[] = { kDNSServer0, kDNSServer1 };
46} // namespace
47
48class DNSServerTesterTest : public Test {
49 public:
50 DNSServerTesterTest()
51 : device_info_(new NiceMock<MockDeviceInfo>(
52 &control_,
53 reinterpret_cast<EventDispatcher *>(NULL),
54 reinterpret_cast<Metrics *>(NULL),
55 reinterpret_cast<Manager *>(NULL))),
56 connection_(new StrictMock<MockConnection>(device_info_.get())),
57 interface_name_(kInterfaceName),
58 dns_servers_(kDNSServers, kDNSServers + 2) {}
59
60 virtual void SetUp() {
61 EXPECT_CALL(*connection_.get(), interface_name())
62 .WillRepeatedly(ReturnRef(interface_name_));
63 dns_server_tester_.reset(
64 new DNSServerTester(connection_.get(),
65 &dispatcher_,
66 dns_servers_,
67 false,
68 callback_target_.result_callback()));
69 }
70
71 protected:
72 class CallbackTarget {
73 public:
74 CallbackTarget()
75 : result_callback_(Bind(&CallbackTarget::ResultCallback,
76 Unretained(this))) {
77 }
78
79 MOCK_METHOD1(ResultCallback, void(const DNSServerTester::Status status));
80 Callback<void(const DNSServerTester::Status)> &result_callback() {
81 return result_callback_;
82 }
83
84 private:
85 Callback<void(const DNSServerTester::Status)> result_callback_;
86 };
87
88 DNSServerTester *dns_server_tester() { return dns_server_tester_.get(); }
89 MockEventDispatcher &dispatcher() { return dispatcher_; }
90 CallbackTarget &callback_target() { return callback_target_; }
91
92 void ExpectReset() {
93 EXPECT_TRUE(callback_target_.result_callback().Equals(
94 dns_server_tester_->dns_result_callback_));
95 }
96
97 private:
98 StrictMock<MockEventDispatcher> dispatcher_;
99 MockControl control_;
100 scoped_ptr<MockDeviceInfo> device_info_;
101 scoped_refptr<MockConnection> connection_;
102 CallbackTarget callback_target_;
103 const string interface_name_;
104 vector<string> dns_servers_;
105 scoped_ptr<DNSServerTester> dns_server_tester_;
106};
107
108TEST_F(DNSServerTesterTest, Constructor) {
109 ExpectReset();
110}
111
112TEST_F(DNSServerTesterTest, StartAttempt) {
113 // Start attempt with no delay.
114 EXPECT_CALL(dispatcher(), PostDelayedTask(_, 0));
115 dns_server_tester()->StartAttempt(0);
116
117 // Start attempt with delay.
118 EXPECT_CALL(dispatcher(), PostDelayedTask(_, 100));
119 dns_server_tester()->StartAttempt(100);
120}
121
122TEST_F(DNSServerTesterTest, StartAttemptTask) {
123 // Setup mock DNS test client.
124 MockDNSClient *dns_test_client = new MockDNSClient();
125 dns_server_tester()->dns_test_client_.reset(dns_test_client);
126
127 // DNS test task started successfully.
128 EXPECT_CALL(*dns_test_client, Start(_, _)).WillOnce(Return(true));
129 EXPECT_CALL(callback_target(), ResultCallback(_)).Times(0);
130 dns_server_tester()->StartAttemptTask();
131 Mock::VerifyAndClearExpectations(dns_test_client);
132
133 // DNS test task failed to start.
134 EXPECT_CALL(*dns_test_client, Start(_, _)).WillOnce(Return(false));
135 EXPECT_CALL(callback_target(),
136 ResultCallback(DNSServerTester::kStatusFailure)).Times(1);
137 dns_server_tester()->StartAttemptTask();
138 Mock::VerifyAndClearExpectations(dns_test_client);
139}
140
141TEST_F(DNSServerTesterTest, AttemptCompleted) {
142 // DNS test attempt succeed with retry_until_success_ not set.
143 dns_server_tester()->retry_until_success_ = false;
144 EXPECT_CALL(callback_target(),
145 ResultCallback(DNSServerTester::kStatusSuccess)).Times(1);
146 dns_server_tester()->CompleteAttempt(DNSServerTester::kStatusSuccess);
147
148 // DNS test attempt succeed with retry_until_success_ being set.
149 dns_server_tester()->retry_until_success_ = true;
150 EXPECT_CALL(callback_target(),
151 ResultCallback(DNSServerTester::kStatusSuccess)).Times(1);
152 dns_server_tester()->CompleteAttempt(DNSServerTester::kStatusSuccess);
153
154 // DNS test attempt failed with retry_until_success_ not set.
155 dns_server_tester()->retry_until_success_ = false;
156 EXPECT_CALL(callback_target(),
157 ResultCallback(DNSServerTester::kStatusFailure)).Times(1);
158 dns_server_tester()->CompleteAttempt(DNSServerTester::kStatusFailure);
159
160 // DNS test attempt failed with retry_until_success_ being set.
161 dns_server_tester()->retry_until_success_ = true;
162 EXPECT_CALL(callback_target(), ResultCallback(_)).Times(0);
163 EXPECT_CALL(dispatcher(), PostDelayedTask(_, _)).Times(1);
164 dns_server_tester()->CompleteAttempt(DNSServerTester::kStatusFailure);
165}
166
167TEST_F(DNSServerTesterTest, StopAttempt) {
168 // Setup mock DNS test client.
169 MockDNSClient *dns_test_client = new MockDNSClient();
170 dns_server_tester()->dns_test_client_.reset(dns_test_client);
171
172 // DNS test task started successfully.
173 EXPECT_CALL(*dns_test_client, Start(_, _)).WillOnce(Return(true));
174 EXPECT_CALL(callback_target(), ResultCallback(_)).Times(0);
175 dns_server_tester()->StartAttemptTask();
176 Mock::VerifyAndClearExpectations(dns_test_client);
177
178 // Stop the DNS test attempt.
179 EXPECT_CALL(*dns_test_client, Stop()).Times(1);
180 EXPECT_CALL(callback_target(), ResultCallback(_)).Times(0);
181 dns_server_tester()->StopAttempt();
182 Mock::VerifyAndClearExpectations(dns_test_client);
183}
184
185} // namespace shill