blob: 6877bc1c225e9e4077f9912de2268c15d75de63b [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 Qiu376e4042014-11-13 09:40:28 -080016
17#include "apmanager/service.h"
18
19#include <string>
20
21#include <base/strings/string_util.h>
22#include <base/strings/stringprintf.h>
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -070023#include <brillo/process_mock.h>
Peter Qiu376e4042014-11-13 09:40:28 -080024#include <gmock/gmock.h>
25#include <gtest/gtest.h>
26
Peter Qiu7a420d32015-09-22 11:25:15 -070027#if !defined(__ANDROID__)
28#include <chromeos/dbus/service_constants.h>
29#else
30#include "dbus/apmanager/dbus-constants.h"
31#endif // __ANDROID__
32
Peter Qiu376e4042014-11-13 09:40:28 -080033#include "apmanager/mock_config.h"
Peter Qiubf8e36c2014-12-03 22:59:45 -080034#include "apmanager/mock_dhcp_server.h"
35#include "apmanager/mock_dhcp_server_factory.h"
Peter Qiu77517302015-01-08 16:22:16 -080036#include "apmanager/mock_file_writer.h"
Peter Qiufda548c2015-01-13 14:39:19 -080037#include "apmanager/mock_hostapd_monitor.h"
Peter Qiufb39ba42014-11-21 09:09:59 -080038#include "apmanager/mock_manager.h"
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080039#include "apmanager/mock_process_factory.h"
Peter Qiu376e4042014-11-13 09:40:28 -080040
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -070041using brillo::ProcessMock;
Peter Qiu376e4042014-11-13 09:40:28 -080042using ::testing::_;
43using ::testing::Mock;
44using ::testing::Return;
45using ::testing::SetArgPointee;
46
47namespace {
48 const int kServiceIdentifier = 1;
49 const char kHostapdConfig[] = "ssid=test\n";
Peter Qiu6789bcb2015-10-26 15:45:13 -070050#if !defined(__ANDROID__)
David Pursell8b9b2542014-12-02 10:15:35 -080051 const char kBinSleep[] = "/bin/sleep";
Peter Qiu77517302015-01-08 16:22:16 -080052 const char kHostapdConfigFilePath[] =
53 "/var/run/apmanager/hostapd/hostapd-1.conf";
Peter Qiu015a4992015-10-06 13:30:32 -070054#else
Peter Qiu6789bcb2015-10-26 15:45:13 -070055 const char kBinSleep[] = "/system/bin/sleep";
56 const char kHostapdConfigFilePath[] =
Peter Qiu015a4992015-10-06 13:30:32 -070057 "/data/misc/apmanager/hostapd/hostapd-1.conf";
58#endif // __ANDROID__
Peter Qiu376e4042014-11-13 09:40:28 -080059} // namespace
60
61namespace apmanager {
62
63class ServiceTest : public testing::Test {
64 public:
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080065 ServiceTest()
Peter Qiu6789bcb2015-10-26 15:45:13 -070066 : hostapd_monitor_(new MockHostapdMonitor()),
Peter Qiu943cf3a2015-02-24 10:59:17 -080067 service_(&manager_, kServiceIdentifier) {}
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080068
69 virtual void SetUp() {
Peter Qiu6789bcb2015-10-26 15:45:13 -070070 service_.dhcp_server_factory_ = &dhcp_server_factory_;
71 service_.file_writer_ = &file_writer_;
72 service_.process_factory_ = &process_factory_;
Peter Qiufda548c2015-01-13 14:39:19 -080073 service_.hostapd_monitor_.reset(hostapd_monitor_);
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080074 }
Peter Qiu376e4042014-11-13 09:40:28 -080075
76 void StartDummyProcess() {
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -070077 service_.hostapd_process_.reset(new brillo::ProcessImpl);
David Pursell8b9b2542014-12-02 10:15:35 -080078 service_.hostapd_process_->AddArg(kBinSleep);
Peter Qiu376e4042014-11-13 09:40:28 -080079 service_.hostapd_process_->AddArg("12345");
80 CHECK(service_.hostapd_process_->Start());
81 LOG(INFO) << "DummyProcess: " << service_.hostapd_process_->pid();
82 }
83
84 void SetConfig(Config* config) {
85 service_.config_.reset(config);
86 }
87
88 protected:
Peter Qiufb39ba42014-11-21 09:09:59 -080089 MockManager manager_;
Peter Qiu6789bcb2015-10-26 15:45:13 -070090 MockDHCPServerFactory dhcp_server_factory_;
91 MockFileWriter file_writer_;
92 MockProcessFactory process_factory_;
Peter Qiufda548c2015-01-13 14:39:19 -080093 MockHostapdMonitor* hostapd_monitor_;
Peter Qiu943cf3a2015-02-24 10:59:17 -080094 Service service_;
Peter Qiu376e4042014-11-13 09:40:28 -080095};
96
97MATCHER_P(IsServiceErrorStartingWith, message, "") {
98 return arg != nullptr &&
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -070099 arg->GetDomain() == brillo::errors::dbus::kDomain &&
Alex Vakulenkoe8f58982015-06-15 12:53:22 -0700100 arg->GetCode() == kServiceError &&
101 base::EndsWith(arg->GetMessage(), message, false);
Peter Qiu376e4042014-11-13 09:40:28 -0800102}
103
104TEST_F(ServiceTest, StartWhenServiceAlreadyRunning) {
105 StartDummyProcess();
106
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -0700107 brillo::ErrorPtr error;
Peter Qiu376e4042014-11-13 09:40:28 -0800108 EXPECT_FALSE(service_.Start(&error));
109 EXPECT_THAT(error, IsServiceErrorStartingWith("Service already running"));
110}
111
112TEST_F(ServiceTest, StartWhenConfigFileFailed) {
113 MockConfig* config = new MockConfig();
114 SetConfig(config);
115
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -0700116 brillo::ErrorPtr error;
Peter Qiu376e4042014-11-13 09:40:28 -0800117 EXPECT_CALL(*config, GenerateConfigFile(_, _)).WillOnce(Return(false));
118 EXPECT_FALSE(service_.Start(&error));
119 EXPECT_THAT(error, IsServiceErrorStartingWith(
120 "Failed to generate config file"));
121}
122
123TEST_F(ServiceTest, StartSuccess) {
124 MockConfig* config = new MockConfig();
125 SetConfig(config);
126
Peter Qiubf8e36c2014-12-03 22:59:45 -0800127 // Setup mock DHCP server.
Peter Qiubf8e36c2014-12-03 22:59:45 -0800128 MockDHCPServer* dhcp_server = new MockDHCPServer();
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800129 // Setup mock process.
130 ProcessMock* process = new ProcessMock();
Peter Qiu77517302015-01-08 16:22:16 -0800131
Peter Qiu376e4042014-11-13 09:40:28 -0800132 std::string config_str(kHostapdConfig);
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -0700133 brillo::ErrorPtr error;
Peter Qiu376e4042014-11-13 09:40:28 -0800134 EXPECT_CALL(*config, GenerateConfigFile(_, _)).WillOnce(
135 DoAll(SetArgPointee<1>(config_str), Return(true)));
Peter Qiu6789bcb2015-10-26 15:45:13 -0700136 EXPECT_CALL(file_writer_, Write(kHostapdConfigFilePath, kHostapdConfig))
Peter Qiu77517302015-01-08 16:22:16 -0800137 .WillOnce(Return(true));
Peter Qiufb39ba42014-11-21 09:09:59 -0800138 EXPECT_CALL(*config, ClaimDevice()).WillOnce(Return(true));
Peter Qiu6789bcb2015-10-26 15:45:13 -0700139 EXPECT_CALL(process_factory_, CreateProcess()).WillOnce(Return(process));
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800140 EXPECT_CALL(*process, Start()).WillOnce(Return(true));
Peter Qiu6789bcb2015-10-26 15:45:13 -0700141 EXPECT_CALL(dhcp_server_factory_, CreateDHCPServer(_, _))
Peter Qiubf8e36c2014-12-03 22:59:45 -0800142 .WillOnce(Return(dhcp_server));
143 EXPECT_CALL(*dhcp_server, Start()).WillOnce(Return(true));
Peter Qiu943cf3a2015-02-24 10:59:17 -0800144 EXPECT_CALL(manager_, RequestDHCPPortAccess(_));
Peter Qiufda548c2015-01-13 14:39:19 -0800145 EXPECT_CALL(*hostapd_monitor_, Start());
Peter Qiu376e4042014-11-13 09:40:28 -0800146 EXPECT_TRUE(service_.Start(&error));
147 EXPECT_EQ(nullptr, error);
148}
149
150TEST_F(ServiceTest, StopWhenServiceNotRunning) {
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -0700151 brillo::ErrorPtr error;
Peter Qiu376e4042014-11-13 09:40:28 -0800152 EXPECT_FALSE(service_.Stop(&error));
153 EXPECT_THAT(error, IsServiceErrorStartingWith(
154 "Service is not currently running"));
155}
156
157TEST_F(ServiceTest, StopSuccess) {
158 StartDummyProcess();
159
Peter Qiufb39ba42014-11-21 09:09:59 -0800160 MockConfig* config = new MockConfig();
161 SetConfig(config);
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -0700162 brillo::ErrorPtr error;
Peter Qiufb39ba42014-11-21 09:09:59 -0800163 EXPECT_CALL(*config, ReleaseDevice()).Times(1);
Peter Qiu376e4042014-11-13 09:40:28 -0800164 EXPECT_TRUE(service_.Stop(&error));
Peter Qiu6789bcb2015-10-26 15:45:13 -0700165 Mock::VerifyAndClearExpectations(config);
Peter Qiu376e4042014-11-13 09:40:28 -0800166}
167
168} // namespace apmanager