blob: 80da773620aa92e6754f6dcb8162599f466c1751 [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
Peter Qiu2ea547f2015-11-20 14:18:11 -080030#include <dbus/apmanager/dbus-constants.h>
Peter Qiu7a420d32015-09-22 11:25:15 -070031#endif // __ANDROID__
32
Peter Qiud9c79aa2015-11-19 15:36:00 -080033#include "apmanager/error.h"
34#include "apmanager/fake_config_adaptor.h"
Peter Qiu376e4042014-11-13 09:40:28 -080035#include "apmanager/mock_config.h"
Peter Qiud9c79aa2015-11-19 15:36:00 -080036#include "apmanager/mock_control.h"
Peter Qiubf8e36c2014-12-03 22:59:45 -080037#include "apmanager/mock_dhcp_server.h"
38#include "apmanager/mock_dhcp_server_factory.h"
Peter Qiu77517302015-01-08 16:22:16 -080039#include "apmanager/mock_file_writer.h"
Peter Qiufda548c2015-01-13 14:39:19 -080040#include "apmanager/mock_hostapd_monitor.h"
Peter Qiufb39ba42014-11-21 09:09:59 -080041#include "apmanager/mock_manager.h"
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080042#include "apmanager/mock_process_factory.h"
Peter Qiu2ea547f2015-11-20 14:18:11 -080043#include "apmanager/mock_service_adaptor.h"
Peter Qiu376e4042014-11-13 09:40:28 -080044
Alex Vakulenko8d0c31b2015-10-13 09:14:24 -070045using brillo::ProcessMock;
Peter Qiu376e4042014-11-13 09:40:28 -080046using ::testing::_;
47using ::testing::Mock;
48using ::testing::Return;
Peter Qiud9c79aa2015-11-19 15:36:00 -080049using ::testing::ReturnNew;
Peter Qiu376e4042014-11-13 09:40:28 -080050using ::testing::SetArgPointee;
51
52namespace {
53 const int kServiceIdentifier = 1;
54 const char kHostapdConfig[] = "ssid=test\n";
Peter Qiu6789bcb2015-10-26 15:45:13 -070055#if !defined(__ANDROID__)
David Pursell8b9b2542014-12-02 10:15:35 -080056 const char kBinSleep[] = "/bin/sleep";
Peter Qiu77517302015-01-08 16:22:16 -080057 const char kHostapdConfigFilePath[] =
58 "/var/run/apmanager/hostapd/hostapd-1.conf";
Peter Qiu015a4992015-10-06 13:30:32 -070059#else
Peter Qiu6789bcb2015-10-26 15:45:13 -070060 const char kBinSleep[] = "/system/bin/sleep";
61 const char kHostapdConfigFilePath[] =
Peter Qiu015a4992015-10-06 13:30:32 -070062 "/data/misc/apmanager/hostapd/hostapd-1.conf";
63#endif // __ANDROID__
Peter Qiu376e4042014-11-13 09:40:28 -080064} // namespace
65
66namespace apmanager {
67
68class ServiceTest : public testing::Test {
69 public:
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080070 ServiceTest()
Peter Qiud9c79aa2015-11-19 15:36:00 -080071 : manager_(&control_interface_),
72 hostapd_monitor_(new MockHostapdMonitor()) {
Peter Qiu2ea547f2015-11-20 14:18:11 -080073 ON_CALL(control_interface_, CreateServiceAdaptorRaw())
74 .WillByDefault(ReturnNew<MockServiceAdaptor>());
Peter Qiud9c79aa2015-11-19 15:36:00 -080075 ON_CALL(control_interface_, CreateConfigAdaptorRaw())
76 .WillByDefault(ReturnNew<FakeConfigAdaptor>());
77 // Defer creation of Service object to allow ControlInterface to
78 // setup expectations for generating fake adaptors.
Peter Qiu7758d8d2015-11-23 14:27:33 -080079 service_ = new Service(&manager_, kServiceIdentifier);
Peter Qiud9c79aa2015-11-19 15:36:00 -080080 }
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080081 virtual void SetUp() {
Peter Qiud9c79aa2015-11-19 15:36:00 -080082 service_->dhcp_server_factory_ = &dhcp_server_factory_;
83 service_->file_writer_ = &file_writer_;
84 service_->process_factory_ = &process_factory_;
85 service_->hostapd_monitor_.reset(hostapd_monitor_);
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080086 }
Peter Qiu376e4042014-11-13 09:40:28 -080087
Peter Qiu2ea547f2015-11-20 14:18:11 -080088 bool StartService(Error* error) {
Peter Qiud9c79aa2015-11-19 15:36:00 -080089 return service_->StartInternal(error);
Peter Qiu682a9322015-10-27 09:41:52 -070090 }
91
Peter Qiu376e4042014-11-13 09:40:28 -080092 void StartDummyProcess() {
Peter Qiud9c79aa2015-11-19 15:36:00 -080093 service_->hostapd_process_.reset(new brillo::ProcessImpl);
94 service_->hostapd_process_->AddArg(kBinSleep);
95 service_->hostapd_process_->AddArg("12345");
96 CHECK(service_->hostapd_process_->Start());
97 LOG(INFO) << "DummyProcess: " << service_->hostapd_process_->pid();
Peter Qiu376e4042014-11-13 09:40:28 -080098 }
99
100 void SetConfig(Config* config) {
Peter Qiud9c79aa2015-11-19 15:36:00 -0800101 service_->config_.reset(config);
Peter Qiu376e4042014-11-13 09:40:28 -0800102 }
103
Peter Qiu2ea547f2015-11-20 14:18:11 -0800104 void VerifyError(const Error& error,
105 Error::Type expected_type,
106 const std::string& expected_message_start) {
107 EXPECT_EQ(expected_type, error.type());
Alex Vakulenkofca478e2016-01-20 07:53:12 -0800108 EXPECT_TRUE(base::StartsWith(error.message(), expected_message_start,
109 base::CompareCase::INSENSITIVE_ASCII));
Peter Qiu2ea547f2015-11-20 14:18:11 -0800110 }
111
Peter Qiu376e4042014-11-13 09:40:28 -0800112 protected:
Peter Qiud9c79aa2015-11-19 15:36:00 -0800113 MockControl control_interface_;
Peter Qiufb39ba42014-11-21 09:09:59 -0800114 MockManager manager_;
Peter Qiu6789bcb2015-10-26 15:45:13 -0700115 MockDHCPServerFactory dhcp_server_factory_;
116 MockFileWriter file_writer_;
117 MockProcessFactory process_factory_;
Peter Qiufda548c2015-01-13 14:39:19 -0800118 MockHostapdMonitor* hostapd_monitor_;
Peter Qiu7758d8d2015-11-23 14:27:33 -0800119 scoped_refptr<Service> service_;
Peter Qiu376e4042014-11-13 09:40:28 -0800120};
121
Peter Qiu376e4042014-11-13 09:40:28 -0800122TEST_F(ServiceTest, StartWhenServiceAlreadyRunning) {
123 StartDummyProcess();
124
Peter Qiu2ea547f2015-11-20 14:18:11 -0800125 Error error;
Peter Qiu682a9322015-10-27 09:41:52 -0700126 EXPECT_FALSE(StartService(&error));
Peter Qiu2ea547f2015-11-20 14:18:11 -0800127 VerifyError(error, Error::kInternalError, "Service already running");
Peter Qiu376e4042014-11-13 09:40:28 -0800128}
129
130TEST_F(ServiceTest, StartWhenConfigFileFailed) {
Peter Qiud9c79aa2015-11-19 15:36:00 -0800131 MockConfig* config = new MockConfig(&manager_);
Peter Qiu376e4042014-11-13 09:40:28 -0800132 SetConfig(config);
133
Peter Qiu2ea547f2015-11-20 14:18:11 -0800134 Error error;
Peter Qiu376e4042014-11-13 09:40:28 -0800135 EXPECT_CALL(*config, GenerateConfigFile(_, _)).WillOnce(Return(false));
Peter Qiu682a9322015-10-27 09:41:52 -0700136 EXPECT_FALSE(StartService(&error));
Peter Qiu376e4042014-11-13 09:40:28 -0800137}
138
139TEST_F(ServiceTest, StartSuccess) {
Peter Qiud9c79aa2015-11-19 15:36:00 -0800140 MockConfig* config = new MockConfig(&manager_);
Peter Qiu376e4042014-11-13 09:40:28 -0800141 SetConfig(config);
142
Peter Qiubf8e36c2014-12-03 22:59:45 -0800143 // Setup mock DHCP server.
Peter Qiubf8e36c2014-12-03 22:59:45 -0800144 MockDHCPServer* dhcp_server = new MockDHCPServer();
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800145 // Setup mock process.
146 ProcessMock* process = new ProcessMock();
Peter Qiu77517302015-01-08 16:22:16 -0800147
Peter Qiu376e4042014-11-13 09:40:28 -0800148 std::string config_str(kHostapdConfig);
Peter Qiu2ea547f2015-11-20 14:18:11 -0800149 Error error;
Peter Qiu376e4042014-11-13 09:40:28 -0800150 EXPECT_CALL(*config, GenerateConfigFile(_, _)).WillOnce(
151 DoAll(SetArgPointee<1>(config_str), Return(true)));
Peter Qiu6789bcb2015-10-26 15:45:13 -0700152 EXPECT_CALL(file_writer_, Write(kHostapdConfigFilePath, kHostapdConfig))
Peter Qiu77517302015-01-08 16:22:16 -0800153 .WillOnce(Return(true));
Peter Qiufb39ba42014-11-21 09:09:59 -0800154 EXPECT_CALL(*config, ClaimDevice()).WillOnce(Return(true));
Peter Qiu6789bcb2015-10-26 15:45:13 -0700155 EXPECT_CALL(process_factory_, CreateProcess()).WillOnce(Return(process));
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800156 EXPECT_CALL(*process, Start()).WillOnce(Return(true));
Peter Qiu6789bcb2015-10-26 15:45:13 -0700157 EXPECT_CALL(dhcp_server_factory_, CreateDHCPServer(_, _))
Peter Qiubf8e36c2014-12-03 22:59:45 -0800158 .WillOnce(Return(dhcp_server));
159 EXPECT_CALL(*dhcp_server, Start()).WillOnce(Return(true));
Peter Qiu943cf3a2015-02-24 10:59:17 -0800160 EXPECT_CALL(manager_, RequestDHCPPortAccess(_));
Peter Qiufda548c2015-01-13 14:39:19 -0800161 EXPECT_CALL(*hostapd_monitor_, Start());
Peter Qiu682a9322015-10-27 09:41:52 -0700162 EXPECT_TRUE(StartService(&error));
Peter Qiu2ea547f2015-11-20 14:18:11 -0800163 EXPECT_TRUE(error.IsSuccess());
Peter Qiu376e4042014-11-13 09:40:28 -0800164}
165
166TEST_F(ServiceTest, StopWhenServiceNotRunning) {
Peter Qiu2ea547f2015-11-20 14:18:11 -0800167 Error error;
Peter Qiud9c79aa2015-11-19 15:36:00 -0800168 EXPECT_FALSE(service_->Stop(&error));
Peter Qiu2ea547f2015-11-20 14:18:11 -0800169 VerifyError(
170 error, Error::kInternalError, "Service is not currently running");
Peter Qiu376e4042014-11-13 09:40:28 -0800171}
172
173TEST_F(ServiceTest, StopSuccess) {
174 StartDummyProcess();
175
Peter Qiud9c79aa2015-11-19 15:36:00 -0800176 MockConfig* config = new MockConfig(&manager_);
Peter Qiufb39ba42014-11-21 09:09:59 -0800177 SetConfig(config);
Peter Qiu2ea547f2015-11-20 14:18:11 -0800178 Error error;
Peter Qiufb39ba42014-11-21 09:09:59 -0800179 EXPECT_CALL(*config, ReleaseDevice()).Times(1);
Peter Qiud9c79aa2015-11-19 15:36:00 -0800180 EXPECT_TRUE(service_->Stop(&error));
Peter Qiu6789bcb2015-10-26 15:45:13 -0700181 Mock::VerifyAndClearExpectations(config);
Peter Qiu376e4042014-11-13 09:40:28 -0800182}
183
184} // namespace apmanager