1 // 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 // 16 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> 25 #include <brillo/process_mock.h> 26 #include <gmock/gmock.h> 27 #include <gtest/gtest.h> 28 #include <shill/net/mock_rtnl_handler.h> 29 30 #include "apmanager/mock_file_writer.h" 31 #include "apmanager/mock_process_factory.h" 32 33 using brillo::ProcessMock; 34 using ::testing::_; 35 using ::testing::Mock; 36 using ::testing::Return; 37 using std::string; 38 39 namespace { 40 const uint16_t kServerAddressIndex = 1; 41 const char kTestInterfaceName[] = "test_interface"; 42 const char kExpectedDnsmasqConfigFile[] = 43 "port=0\n" 44 "bind-interfaces\n" 45 "log-dhcp\n" 46 "keep-in-foreground\n" 47 "dhcp-range=192.168.1.1,192.168.1.128\n" 48 "interface=test_interface\n" 49 #if !defined(__ANDROID__) 50 "user=apmanager\n" 51 "dhcp-leasefile=/var/run/apmanager/dnsmasq/dhcpd-1.leases\n"; 52 #else 53 "user=system\n" 54 "dhcp-leasefile=/data/misc/apmanager/dnsmasq/dhcpd-1.leases\n"; 55 #endif // __ANDROID__ 56 57 #if !defined(__ANDROID__) 58 const char kBinSleep[] = "/bin/sleep"; 59 const char kDnsmasqConfigFilePath[] = 60 "/var/run/apmanager/dnsmasq/dhcpd-1.conf"; 61 #else 62 const char kBinSleep[] = "/system/bin/sleep"; 63 const char kDnsmasqConfigFilePath[] = 64 "/data/misc/apmanager/dnsmasq/dhcpd-1.conf"; 65 #endif // __ANDROID__ 66 } // namespace 67 68 namespace apmanager { 69 70 class DHCPServerTest : public testing::Test { 71 public: 72 DHCPServerTest() 73 : dhcp_server_(new DHCPServer(kServerAddressIndex, kTestInterfaceName)), 74 rtnl_handler_(new shill::MockRTNLHandler()) {} 75 virtual ~DHCPServerTest() {} 76 77 virtual void SetUp() { 78 dhcp_server_->rtnl_handler_ = rtnl_handler_.get(); 79 dhcp_server_->file_writer_ = &file_writer_; 80 dhcp_server_->process_factory_ = &process_factory_; 81 } 82 83 virtual void TearDown() { 84 // Reset DHCP server now while RTNLHandler is still valid. 85 dhcp_server_.reset(); 86 } 87 88 void StartDummyProcess() { 89 dhcp_server_->dnsmasq_process_.reset(new brillo::ProcessImpl); 90 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_; 102 MockFileWriter file_writer_; 103 MockProcessFactory process_factory_; 104 }; 105 106 107 TEST_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 115 TEST_F(DHCPServerTest, StartWhenServerAlreadyStarted) { 116 StartDummyProcess(); 117 118 EXPECT_FALSE(dhcp_server_->Start()); 119 } 120 121 TEST_F(DHCPServerTest, StartSuccess) { 122 ProcessMock* process = new ProcessMock(); 123 124 const int kInterfaceIndex = 1; 125 EXPECT_CALL(file_writer_, 126 Write(kDnsmasqConfigFilePath, kExpectedDnsmasqConfigFile)) 127 .WillOnce(Return(true)); 128 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); 134 EXPECT_CALL(process_factory_, CreateProcess()).WillOnce(Return(process)); 135 EXPECT_CALL(*process, Start()).WillOnce(Return(true)); 136 EXPECT_TRUE(dhcp_server_->Start()); 137 Mock::VerifyAndClearExpectations(rtnl_handler_.get()); 138 } 139 140 } // namespace apmanager 141