blob: da58e91717cc98e9caeef798223cec3e82acacfb [file] [log] [blame]
Peter Qiu376e4042014-11-13 09:40:28 -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/service.h"
6
7#include <string>
8
9#include <base/strings/string_util.h>
10#include <base/strings/stringprintf.h>
11#include <chromeos/dbus/service_constants.h>
12#include <chromeos/process_mock.h>
13#include <gmock/gmock.h>
14#include <gtest/gtest.h>
15
16#include "apmanager/mock_config.h"
Peter Qiubf8e36c2014-12-03 22:59:45 -080017#include "apmanager/mock_dhcp_server.h"
18#include "apmanager/mock_dhcp_server_factory.h"
Peter Qiu77517302015-01-08 16:22:16 -080019#include "apmanager/mock_file_writer.h"
Peter Qiufda548c2015-01-13 14:39:19 -080020#include "apmanager/mock_hostapd_monitor.h"
Peter Qiufb39ba42014-11-21 09:09:59 -080021#include "apmanager/mock_manager.h"
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080022#include "apmanager/mock_process_factory.h"
Peter Qiu376e4042014-11-13 09:40:28 -080023
24using chromeos::ProcessMock;
25using ::testing::_;
26using ::testing::Mock;
27using ::testing::Return;
28using ::testing::SetArgPointee;
29
30namespace {
31 const int kServiceIdentifier = 1;
32 const char kHostapdConfig[] = "ssid=test\n";
David Pursell8b9b2542014-12-02 10:15:35 -080033 const char kBinSleep[] = "/bin/sleep";
Peter Qiu77517302015-01-08 16:22:16 -080034 const char kHostapdConfigFilePath[] =
35 "/var/run/apmanager/hostapd/hostapd-1.conf";
Peter Qiu376e4042014-11-13 09:40:28 -080036} // namespace
37
38namespace apmanager {
39
40class ServiceTest : public testing::Test {
41 public:
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080042 ServiceTest()
43 : service_(&manager_, kServiceIdentifier),
44 dhcp_server_factory_(MockDHCPServerFactory::GetInstance()),
45 file_writer_(MockFileWriter::GetInstance()),
Peter Qiufda548c2015-01-13 14:39:19 -080046 process_factory_(MockProcessFactory::GetInstance()),
47 hostapd_monitor_(new MockHostapdMonitor()) {}
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080048
49 virtual void SetUp() {
50 service_.dhcp_server_factory_ = dhcp_server_factory_;
51 service_.file_writer_ = file_writer_;
52 service_.process_factory_ = process_factory_;
Peter Qiufda548c2015-01-13 14:39:19 -080053 service_.hostapd_monitor_.reset(hostapd_monitor_);
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080054 }
Peter Qiu376e4042014-11-13 09:40:28 -080055
56 void StartDummyProcess() {
57 service_.hostapd_process_.reset(new chromeos::ProcessImpl);
David Pursell8b9b2542014-12-02 10:15:35 -080058 service_.hostapd_process_->AddArg(kBinSleep);
Peter Qiu376e4042014-11-13 09:40:28 -080059 service_.hostapd_process_->AddArg("12345");
60 CHECK(service_.hostapd_process_->Start());
61 LOG(INFO) << "DummyProcess: " << service_.hostapd_process_->pid();
62 }
63
64 void SetConfig(Config* config) {
65 service_.config_.reset(config);
66 }
67
68 protected:
69 Service service_;
Peter Qiufb39ba42014-11-21 09:09:59 -080070 MockManager manager_;
Peter Qiu1dbf9fd2015-01-09 13:36:55 -080071 MockDHCPServerFactory* dhcp_server_factory_;
72 MockFileWriter* file_writer_;
73 MockProcessFactory* process_factory_;
Peter Qiufda548c2015-01-13 14:39:19 -080074 MockHostapdMonitor* hostapd_monitor_;
Peter Qiu376e4042014-11-13 09:40:28 -080075};
76
77MATCHER_P(IsServiceErrorStartingWith, message, "") {
78 return arg != nullptr &&
79 arg->GetDomain() == chromeos::errors::dbus::kDomain &&
80 arg->GetCode() == kServiceError &&
81 EndsWith(arg->GetMessage(), message, false);
82}
83
84TEST_F(ServiceTest, StartWhenServiceAlreadyRunning) {
85 StartDummyProcess();
86
87 chromeos::ErrorPtr error;
88 EXPECT_FALSE(service_.Start(&error));
89 EXPECT_THAT(error, IsServiceErrorStartingWith("Service already running"));
90}
91
92TEST_F(ServiceTest, StartWhenConfigFileFailed) {
93 MockConfig* config = new MockConfig();
94 SetConfig(config);
95
96 chromeos::ErrorPtr error;
97 EXPECT_CALL(*config, GenerateConfigFile(_, _)).WillOnce(Return(false));
98 EXPECT_FALSE(service_.Start(&error));
99 EXPECT_THAT(error, IsServiceErrorStartingWith(
100 "Failed to generate config file"));
101}
102
103TEST_F(ServiceTest, StartSuccess) {
104 MockConfig* config = new MockConfig();
105 SetConfig(config);
106
Peter Qiubf8e36c2014-12-03 22:59:45 -0800107 // Setup mock DHCP server.
Peter Qiubf8e36c2014-12-03 22:59:45 -0800108 MockDHCPServer* dhcp_server = new MockDHCPServer();
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800109 // Setup mock process.
110 ProcessMock* process = new ProcessMock();
Peter Qiu77517302015-01-08 16:22:16 -0800111
Peter Qiu376e4042014-11-13 09:40:28 -0800112 std::string config_str(kHostapdConfig);
113 chromeos::ErrorPtr error;
114 EXPECT_CALL(*config, GenerateConfigFile(_, _)).WillOnce(
115 DoAll(SetArgPointee<1>(config_str), Return(true)));
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800116 EXPECT_CALL(*file_writer_, Write(kHostapdConfigFilePath, kHostapdConfig))
Peter Qiu77517302015-01-08 16:22:16 -0800117 .WillOnce(Return(true));
Peter Qiufb39ba42014-11-21 09:09:59 -0800118 EXPECT_CALL(*config, ClaimDevice()).WillOnce(Return(true));
Peter Qiu1dbf9fd2015-01-09 13:36:55 -0800119 EXPECT_CALL(*process_factory_, CreateProcess()).WillOnce(Return(process));
120 EXPECT_CALL(*process, Start()).WillOnce(Return(true));
121 EXPECT_CALL(*dhcp_server_factory_, CreateDHCPServer(_, _))
Peter Qiubf8e36c2014-12-03 22:59:45 -0800122 .WillOnce(Return(dhcp_server));
123 EXPECT_CALL(*dhcp_server, Start()).WillOnce(Return(true));
Peter Qiufda548c2015-01-13 14:39:19 -0800124 EXPECT_CALL(*hostapd_monitor_, Start());
Peter Qiu376e4042014-11-13 09:40:28 -0800125 EXPECT_TRUE(service_.Start(&error));
126 EXPECT_EQ(nullptr, error);
127}
128
129TEST_F(ServiceTest, StopWhenServiceNotRunning) {
130 chromeos::ErrorPtr error;
131 EXPECT_FALSE(service_.Stop(&error));
132 EXPECT_THAT(error, IsServiceErrorStartingWith(
133 "Service is not currently running"));
134}
135
136TEST_F(ServiceTest, StopSuccess) {
137 StartDummyProcess();
138
Peter Qiufb39ba42014-11-21 09:09:59 -0800139 MockConfig* config = new MockConfig();
140 SetConfig(config);
Peter Qiu376e4042014-11-13 09:40:28 -0800141 chromeos::ErrorPtr error;
Peter Qiufb39ba42014-11-21 09:09:59 -0800142 EXPECT_CALL(*config, ReleaseDevice()).Times(1);
Peter Qiu376e4042014-11-13 09:40:28 -0800143 EXPECT_TRUE(service_.Stop(&error));
144}
145
146} // namespace apmanager