blob: dd905467bb92ba79153633e2fdddab121d6b5749 [file] [log] [blame]
Peter Qiubf8e36c2014-12-03 22:59:45 -08001// Copyright 2014 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 "apmanager/dhcp_server.h"
6
7#include <string>
8
9#include <net/if.h>
10
11#include <base/strings/string_util.h>
12#include <base/strings/stringprintf.h>
Peter Qiubf8e36c2014-12-03 22:59:45 -080013#include <chromeos/process_mock.h>
14#include <gmock/gmock.h>
15#include <gtest/gtest.h>
16#include <shill/net/mock_rtnl_handler.h>
17
Peter Qiu77517302015-01-08 16:22:16 -080018#include "apmanager/mock_file_writer.h"
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080019#include "apmanager/mock_process_factory.h"
Peter Qiu77517302015-01-08 16:22:16 -080020
Peter Qiubf8e36c2014-12-03 22:59:45 -080021using chromeos::ProcessMock;
22using ::testing::_;
23using ::testing::Mock;
24using ::testing::Return;
25using std::string;
26
27namespace {
28 const uint16_t kServerAddressIndex = 1;
29 const char kTestInterfaceName[] = "test_interface";
30 const char kBinSleep[] = "/bin/sleep";
31 const char kExpectedDnsmasqConfigFile[] =
32 "port=0\n"
33 "bind-interfaces\n"
34 "log-dhcp\n"
Peter Qiue1ed1cd2014-12-06 16:03:35 -080035 "keep-in-foreground\n"
Peter Qiu58676b62014-12-16 16:47:12 -080036 "user=apmanager\n"
Peter Qiubf8e36c2014-12-03 22:59:45 -080037 "dhcp-range=192.168.1.1,192.168.1.128\n"
38 "interface=test_interface\n"
Peter Qiu77517302015-01-08 16:22:16 -080039 "dhcp-leasefile=/var/run/apmanager/dnsmasq/dhcpd-1.leases\n";
40 const char kDnsmasqConfigFilePath[] =
41 "/var/run/apmanager/dnsmasq/dhcpd-1.conf";
Peter Qiubf8e36c2014-12-03 22:59:45 -080042} // namespace
43
44namespace apmanager {
45
46class DHCPServerTest : public testing::Test {
47 public:
48 DHCPServerTest()
49 : dhcp_server_(new DHCPServer(kServerAddressIndex, kTestInterfaceName)),
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080050 rtnl_handler_(new shill::MockRTNLHandler()),
51 file_writer_(MockFileWriter::GetInstance()),
52 process_factory_(MockProcessFactory::GetInstance()) {}
Peter Qiubf8e36c2014-12-03 22:59:45 -080053 virtual ~DHCPServerTest() {}
54
55 virtual void SetUp() {
56 dhcp_server_->rtnl_handler_ = rtnl_handler_.get();
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080057 dhcp_server_->file_writer_ = file_writer_;
58 dhcp_server_->process_factory_ = process_factory_;
Peter Qiubf8e36c2014-12-03 22:59:45 -080059 }
60
61 virtual void TearDown() {
62 // Reset DHCP server now while RTNLHandler is still valid.
63 dhcp_server_.reset();
64 }
65
66 void StartDummyProcess() {
67 dhcp_server_->dnsmasq_process_.reset(new chromeos::ProcessImpl);
68 dhcp_server_->dnsmasq_process_->AddArg(kBinSleep);
69 dhcp_server_->dnsmasq_process_->AddArg("12345");
70 CHECK(dhcp_server_->dnsmasq_process_->Start());
71 }
72
73 string GenerateConfigFile() {
74 return dhcp_server_->GenerateConfigFile();
75 }
76
77 protected:
78 std::unique_ptr<DHCPServer> dhcp_server_;
79 std::unique_ptr<shill::MockRTNLHandler> rtnl_handler_;
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080080 MockFileWriter* file_writer_;
81 MockProcessFactory* process_factory_;
Peter Qiubf8e36c2014-12-03 22:59:45 -080082};
83
84
85TEST_F(DHCPServerTest, GenerateConfigFile) {
86 string config_content = GenerateConfigFile();
87 EXPECT_STREQ(kExpectedDnsmasqConfigFile, config_content.c_str())
88 << "Expected to find the following config...\n"
89 << kExpectedDnsmasqConfigFile << ".....\n"
90 << config_content;
91}
92
93TEST_F(DHCPServerTest, StartWhenServerAlreadyStarted) {
94 StartDummyProcess();
95
96 EXPECT_FALSE(dhcp_server_->Start());
97}
98
99TEST_F(DHCPServerTest, StartSuccess) {
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800100 ProcessMock* process = new ProcessMock();
Peter Qiu77517302015-01-08 16:22:16 -0800101
Peter Qiubf8e36c2014-12-03 22:59:45 -0800102 const int kInterfaceIndex = 1;
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800103 EXPECT_CALL(*file_writer_,
Peter Qiu77517302015-01-08 16:22:16 -0800104 Write(kDnsmasqConfigFilePath, kExpectedDnsmasqConfigFile))
105 .WillOnce(Return(true));
Peter Qiubf8e36c2014-12-03 22:59:45 -0800106 EXPECT_CALL(*rtnl_handler_.get(), GetInterfaceIndex(kTestInterfaceName))
107 .WillOnce(Return(kInterfaceIndex));
108 EXPECT_CALL(*rtnl_handler_.get(),
109 AddInterfaceAddress(kInterfaceIndex, _, _, _)).Times(1);
110 EXPECT_CALL(*rtnl_handler_.get(),
111 SetInterfaceFlags(kInterfaceIndex, IFF_UP, IFF_UP)).Times(1);
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800112 EXPECT_CALL(*process_factory_, CreateProcess()).WillOnce(Return(process));
113 EXPECT_CALL(*process, Start()).WillOnce(Return(true));
Peter Qiubf8e36c2014-12-03 22:59:45 -0800114 EXPECT_TRUE(dhcp_server_->Start());
115 Mock::VerifyAndClearExpectations(rtnl_handler_.get());
116}
117
118} // namespace apmanager