blob: d4cd2c5c9b1bbd8e25f14c3899e6663971fa3089 [file] [log] [blame]
Peter Qiu326b6cf2015-09-02 11:11:42 -07001//
2// Copyright (C) 2014 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
Peter Qiubf8e36c2014-12-03 22:59:45 -080016
17#include "apmanager/dhcp_server.h"
18
19#include <string>
20
21#include <net/if.h>
22
23#include <base/strings/string_util.h>
24#include <base/strings/stringprintf.h>
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -070025#include <brillo/process_mock.h>
Peter Qiubf8e36c2014-12-03 22:59:45 -080026#include <gmock/gmock.h>
27#include <gtest/gtest.h>
28#include <shill/net/mock_rtnl_handler.h>
29
Peter Qiu77517302015-01-08 16:22:16 -080030#include "apmanager/mock_file_writer.h"
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080031#include "apmanager/mock_process_factory.h"
Peter Qiu77517302015-01-08 16:22:16 -080032
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -070033using brillo::ProcessMock;
Peter Qiubf8e36c2014-12-03 22:59:45 -080034using ::testing::_;
35using ::testing::Mock;
36using ::testing::Return;
37using std::string;
38
39namespace {
40 const uint16_t kServerAddressIndex = 1;
41 const char kTestInterfaceName[] = "test_interface";
42 const char kBinSleep[] = "/bin/sleep";
43 const char kExpectedDnsmasqConfigFile[] =
44 "port=0\n"
45 "bind-interfaces\n"
46 "log-dhcp\n"
Peter Qiue1ed1cd2014-12-06 16:03:35 -080047 "keep-in-foreground\n"
Peter Qiubf8e36c2014-12-03 22:59:45 -080048 "dhcp-range=192.168.1.1,192.168.1.128\n"
49 "interface=test_interface\n"
Peter Qiu015a4992015-10-06 13:30:32 -070050#if !defined(__ANDROID__)
51 "user=apmanager\n"
Peter Qiu77517302015-01-08 16:22:16 -080052 "dhcp-leasefile=/var/run/apmanager/dnsmasq/dhcpd-1.leases\n";
Peter Qiu015a4992015-10-06 13:30:32 -070053#else
54 "user=system\n"
55 "dhcp-leasefile=/data/misc/apmanager/dnsmasq/dhcpd-1.leases\n";
56#endif // __ANDROID__
57
Peter Qiu77517302015-01-08 16:22:16 -080058 const char kDnsmasqConfigFilePath[] =
Peter Qiu015a4992015-10-06 13:30:32 -070059#if !defined(__ANDROID__)
Peter Qiu77517302015-01-08 16:22:16 -080060 "/var/run/apmanager/dnsmasq/dhcpd-1.conf";
Peter Qiu015a4992015-10-06 13:30:32 -070061#else
62 "/data/misc/apmanager/dnsmasq/dhcpd-1.conf";
63#endif // __ANDROID__
Peter Qiubf8e36c2014-12-03 22:59:45 -080064} // namespace
65
66namespace apmanager {
67
68class DHCPServerTest : public testing::Test {
69 public:
70 DHCPServerTest()
71 : dhcp_server_(new DHCPServer(kServerAddressIndex, kTestInterfaceName)),
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080072 rtnl_handler_(new shill::MockRTNLHandler()),
73 file_writer_(MockFileWriter::GetInstance()),
74 process_factory_(MockProcessFactory::GetInstance()) {}
Peter Qiubf8e36c2014-12-03 22:59:45 -080075 virtual ~DHCPServerTest() {}
76
77 virtual void SetUp() {
78 dhcp_server_->rtnl_handler_ = rtnl_handler_.get();
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080079 dhcp_server_->file_writer_ = file_writer_;
80 dhcp_server_->process_factory_ = process_factory_;
Peter Qiubf8e36c2014-12-03 22:59:45 -080081 }
82
83 virtual void TearDown() {
84 // Reset DHCP server now while RTNLHandler is still valid.
85 dhcp_server_.reset();
86 }
87
88 void StartDummyProcess() {
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -070089 dhcp_server_->dnsmasq_process_.reset(new brillo::ProcessImpl);
Peter Qiubf8e36c2014-12-03 22:59:45 -080090 dhcp_server_->dnsmasq_process_->AddArg(kBinSleep);
91 dhcp_server_->dnsmasq_process_->AddArg("12345");
92 CHECK(dhcp_server_->dnsmasq_process_->Start());
93 }
94
95 string GenerateConfigFile() {
96 return dhcp_server_->GenerateConfigFile();
97 }
98
99 protected:
100 std::unique_ptr<DHCPServer> dhcp_server_;
101 std::unique_ptr<shill::MockRTNLHandler> rtnl_handler_;
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800102 MockFileWriter* file_writer_;
103 MockProcessFactory* process_factory_;
Peter Qiubf8e36c2014-12-03 22:59:45 -0800104};
105
106
107TEST_F(DHCPServerTest, GenerateConfigFile) {
108 string config_content = GenerateConfigFile();
109 EXPECT_STREQ(kExpectedDnsmasqConfigFile, config_content.c_str())
110 << "Expected to find the following config...\n"
111 << kExpectedDnsmasqConfigFile << ".....\n"
112 << config_content;
113}
114
115TEST_F(DHCPServerTest, StartWhenServerAlreadyStarted) {
116 StartDummyProcess();
117
118 EXPECT_FALSE(dhcp_server_->Start());
119}
120
121TEST_F(DHCPServerTest, StartSuccess) {
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800122 ProcessMock* process = new ProcessMock();
Peter Qiu77517302015-01-08 16:22:16 -0800123
Peter Qiubf8e36c2014-12-03 22:59:45 -0800124 const int kInterfaceIndex = 1;
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800125 EXPECT_CALL(*file_writer_,
Peter Qiu77517302015-01-08 16:22:16 -0800126 Write(kDnsmasqConfigFilePath, kExpectedDnsmasqConfigFile))
127 .WillOnce(Return(true));
Peter Qiubf8e36c2014-12-03 22:59:45 -0800128 EXPECT_CALL(*rtnl_handler_.get(), GetInterfaceIndex(kTestInterfaceName))
129 .WillOnce(Return(kInterfaceIndex));
130 EXPECT_CALL(*rtnl_handler_.get(),
131 AddInterfaceAddress(kInterfaceIndex, _, _, _)).Times(1);
132 EXPECT_CALL(*rtnl_handler_.get(),
133 SetInterfaceFlags(kInterfaceIndex, IFF_UP, IFF_UP)).Times(1);
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800134 EXPECT_CALL(*process_factory_, CreateProcess()).WillOnce(Return(process));
135 EXPECT_CALL(*process, Start()).WillOnce(Return(true));
Peter Qiubf8e36c2014-12-03 22:59:45 -0800136 EXPECT_TRUE(dhcp_server_->Start());
137 Mock::VerifyAndClearExpectations(rtnl_handler_.get());
138}
139
140} // namespace apmanager