blob: 6870c75ff6ed1d0c8e580a0ec5fe3319efd53ded [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>
23#include <chromeos/dbus/service_constants.h>
24#include <chromeos/process_mock.h>
25#include <gmock/gmock.h>
26#include <gtest/gtest.h>
27
28#include "apmanager/mock_config.h"
Peter Qiubf8e36c2014-12-03 22:59:45 -080029#include "apmanager/mock_dhcp_server.h"
30#include "apmanager/mock_dhcp_server_factory.h"
Peter Qiu77517302015-01-08 16:22:16 -080031#include "apmanager/mock_file_writer.h"
Peter Qiufda548c2015-01-13 14:39:19 -080032#include "apmanager/mock_hostapd_monitor.h"
Peter Qiufb39ba42014-11-21 09:09:59 -080033#include "apmanager/mock_manager.h"
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080034#include "apmanager/mock_process_factory.h"
Peter Qiu376e4042014-11-13 09:40:28 -080035
36using chromeos::ProcessMock;
37using ::testing::_;
38using ::testing::Mock;
39using ::testing::Return;
40using ::testing::SetArgPointee;
41
42namespace {
43 const int kServiceIdentifier = 1;
44 const char kHostapdConfig[] = "ssid=test\n";
David Pursell8b9b2542014-12-02 10:15:35 -080045 const char kBinSleep[] = "/bin/sleep";
Peter Qiu77517302015-01-08 16:22:16 -080046 const char kHostapdConfigFilePath[] =
47 "/var/run/apmanager/hostapd/hostapd-1.conf";
Peter Qiu376e4042014-11-13 09:40:28 -080048} // namespace
49
50namespace apmanager {
51
52class ServiceTest : public testing::Test {
53 public:
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080054 ServiceTest()
Peter Qiu943cf3a2015-02-24 10:59:17 -080055 : dhcp_server_factory_(MockDHCPServerFactory::GetInstance()),
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080056 file_writer_(MockFileWriter::GetInstance()),
Peter Qiufda548c2015-01-13 14:39:19 -080057 process_factory_(MockProcessFactory::GetInstance()),
Peter Qiu943cf3a2015-02-24 10:59:17 -080058 hostapd_monitor_(new MockHostapdMonitor()),
59 service_(&manager_, kServiceIdentifier) {}
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080060
61 virtual void SetUp() {
62 service_.dhcp_server_factory_ = dhcp_server_factory_;
63 service_.file_writer_ = file_writer_;
64 service_.process_factory_ = process_factory_;
Peter Qiufda548c2015-01-13 14:39:19 -080065 service_.hostapd_monitor_.reset(hostapd_monitor_);
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080066 }
Peter Qiu376e4042014-11-13 09:40:28 -080067
68 void StartDummyProcess() {
69 service_.hostapd_process_.reset(new chromeos::ProcessImpl);
David Pursell8b9b2542014-12-02 10:15:35 -080070 service_.hostapd_process_->AddArg(kBinSleep);
Peter Qiu376e4042014-11-13 09:40:28 -080071 service_.hostapd_process_->AddArg("12345");
72 CHECK(service_.hostapd_process_->Start());
73 LOG(INFO) << "DummyProcess: " << service_.hostapd_process_->pid();
74 }
75
76 void SetConfig(Config* config) {
77 service_.config_.reset(config);
78 }
79
80 protected:
Peter Qiufb39ba42014-11-21 09:09:59 -080081 MockManager manager_;
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080082 MockDHCPServerFactory* dhcp_server_factory_;
83 MockFileWriter* file_writer_;
84 MockProcessFactory* process_factory_;
Peter Qiufda548c2015-01-13 14:39:19 -080085 MockHostapdMonitor* hostapd_monitor_;
Peter Qiu943cf3a2015-02-24 10:59:17 -080086 Service service_;
Peter Qiu376e4042014-11-13 09:40:28 -080087};
88
89MATCHER_P(IsServiceErrorStartingWith, message, "") {
90 return arg != nullptr &&
Alex Vakulenkoe8f58982015-06-15 12:53:22 -070091 arg->GetDomain() == chromeos::errors::dbus::kDomain &&
92 arg->GetCode() == kServiceError &&
93 base::EndsWith(arg->GetMessage(), message, false);
Peter Qiu376e4042014-11-13 09:40:28 -080094}
95
96TEST_F(ServiceTest, StartWhenServiceAlreadyRunning) {
97 StartDummyProcess();
98
99 chromeos::ErrorPtr error;
100 EXPECT_FALSE(service_.Start(&error));
101 EXPECT_THAT(error, IsServiceErrorStartingWith("Service already running"));
102}
103
104TEST_F(ServiceTest, StartWhenConfigFileFailed) {
105 MockConfig* config = new MockConfig();
106 SetConfig(config);
107
108 chromeos::ErrorPtr error;
109 EXPECT_CALL(*config, GenerateConfigFile(_, _)).WillOnce(Return(false));
110 EXPECT_FALSE(service_.Start(&error));
111 EXPECT_THAT(error, IsServiceErrorStartingWith(
112 "Failed to generate config file"));
113}
114
115TEST_F(ServiceTest, StartSuccess) {
116 MockConfig* config = new MockConfig();
117 SetConfig(config);
118
Peter Qiubf8e36c2014-12-03 22:59:45 -0800119 // Setup mock DHCP server.
Peter Qiubf8e36c2014-12-03 22:59:45 -0800120 MockDHCPServer* dhcp_server = new MockDHCPServer();
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800121 // Setup mock process.
122 ProcessMock* process = new ProcessMock();
Peter Qiu77517302015-01-08 16:22:16 -0800123
Peter Qiu376e4042014-11-13 09:40:28 -0800124 std::string config_str(kHostapdConfig);
125 chromeos::ErrorPtr error;
126 EXPECT_CALL(*config, GenerateConfigFile(_, _)).WillOnce(
127 DoAll(SetArgPointee<1>(config_str), Return(true)));
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800128 EXPECT_CALL(*file_writer_, Write(kHostapdConfigFilePath, kHostapdConfig))
Peter Qiu77517302015-01-08 16:22:16 -0800129 .WillOnce(Return(true));
Peter Qiufb39ba42014-11-21 09:09:59 -0800130 EXPECT_CALL(*config, ClaimDevice()).WillOnce(Return(true));
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800131 EXPECT_CALL(*process_factory_, CreateProcess()).WillOnce(Return(process));
132 EXPECT_CALL(*process, Start()).WillOnce(Return(true));
133 EXPECT_CALL(*dhcp_server_factory_, CreateDHCPServer(_, _))
Peter Qiubf8e36c2014-12-03 22:59:45 -0800134 .WillOnce(Return(dhcp_server));
135 EXPECT_CALL(*dhcp_server, Start()).WillOnce(Return(true));
Peter Qiu943cf3a2015-02-24 10:59:17 -0800136 EXPECT_CALL(manager_, RequestDHCPPortAccess(_));
Peter Qiufda548c2015-01-13 14:39:19 -0800137 EXPECT_CALL(*hostapd_monitor_, Start());
Peter Qiu376e4042014-11-13 09:40:28 -0800138 EXPECT_TRUE(service_.Start(&error));
139 EXPECT_EQ(nullptr, error);
140}
141
142TEST_F(ServiceTest, StopWhenServiceNotRunning) {
143 chromeos::ErrorPtr error;
144 EXPECT_FALSE(service_.Stop(&error));
145 EXPECT_THAT(error, IsServiceErrorStartingWith(
146 "Service is not currently running"));
147}
148
149TEST_F(ServiceTest, StopSuccess) {
150 StartDummyProcess();
151
Peter Qiufb39ba42014-11-21 09:09:59 -0800152 MockConfig* config = new MockConfig();
153 SetConfig(config);
Peter Qiu376e4042014-11-13 09:40:28 -0800154 chromeos::ErrorPtr error;
Peter Qiufb39ba42014-11-21 09:09:59 -0800155 EXPECT_CALL(*config, ReleaseDevice()).Times(1);
Peter Qiu376e4042014-11-13 09:40:28 -0800156 EXPECT_TRUE(service_.Stop(&error));
157}
158
159} // namespace apmanager