blob: f73d561e6ccd864939093aa1f2a33b553a430925 [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 Qiufb39ba42014-11-21 09:09:59 -080020#include "apmanager/mock_manager.h"
Peter Qiu376e4042014-11-13 09:40:28 -080021
22using chromeos::ProcessMock;
23using ::testing::_;
24using ::testing::Mock;
25using ::testing::Return;
26using ::testing::SetArgPointee;
27
28namespace {
29 const int kServiceIdentifier = 1;
30 const char kHostapdConfig[] = "ssid=test\n";
David Pursell8b9b2542014-12-02 10:15:35 -080031 const char kBinSleep[] = "/bin/sleep";
Peter Qiu77517302015-01-08 16:22:16 -080032 const char kHostapdConfigFilePath[] =
33 "/var/run/apmanager/hostapd/hostapd-1.conf";
Peter Qiu376e4042014-11-13 09:40:28 -080034} // namespace
35
36namespace apmanager {
37
38class ServiceTest : public testing::Test {
39 public:
Peter Qiufb39ba42014-11-21 09:09:59 -080040 ServiceTest() : service_(&manager_, kServiceIdentifier) {}
Peter Qiu376e4042014-11-13 09:40:28 -080041
42 void StartDummyProcess() {
43 service_.hostapd_process_.reset(new chromeos::ProcessImpl);
David Pursell8b9b2542014-12-02 10:15:35 -080044 service_.hostapd_process_->AddArg(kBinSleep);
Peter Qiu376e4042014-11-13 09:40:28 -080045 service_.hostapd_process_->AddArg("12345");
46 CHECK(service_.hostapd_process_->Start());
47 LOG(INFO) << "DummyProcess: " << service_.hostapd_process_->pid();
48 }
49
50 void SetConfig(Config* config) {
51 service_.config_.reset(config);
52 }
53
Peter Qiubf8e36c2014-12-03 22:59:45 -080054 void SetDHCPServerFactory(DHCPServerFactory* factory) {
55 service_.dhcp_server_factory_ = factory;
56 }
57
Peter Qiu77517302015-01-08 16:22:16 -080058 void SetFileWriter(FileWriter* file_writer) {
59 service_.file_writer_ = file_writer;
60 }
61
Peter Qiu376e4042014-11-13 09:40:28 -080062 protected:
63 Service service_;
Peter Qiufb39ba42014-11-21 09:09:59 -080064 MockManager manager_;
Peter Qiu376e4042014-11-13 09:40:28 -080065};
66
67MATCHER_P(IsServiceErrorStartingWith, message, "") {
68 return arg != nullptr &&
69 arg->GetDomain() == chromeos::errors::dbus::kDomain &&
70 arg->GetCode() == kServiceError &&
71 EndsWith(arg->GetMessage(), message, false);
72}
73
74TEST_F(ServiceTest, StartWhenServiceAlreadyRunning) {
75 StartDummyProcess();
76
77 chromeos::ErrorPtr error;
78 EXPECT_FALSE(service_.Start(&error));
79 EXPECT_THAT(error, IsServiceErrorStartingWith("Service already running"));
80}
81
82TEST_F(ServiceTest, StartWhenConfigFileFailed) {
83 MockConfig* config = new MockConfig();
84 SetConfig(config);
85
86 chromeos::ErrorPtr error;
87 EXPECT_CALL(*config, GenerateConfigFile(_, _)).WillOnce(Return(false));
88 EXPECT_FALSE(service_.Start(&error));
89 EXPECT_THAT(error, IsServiceErrorStartingWith(
90 "Failed to generate config file"));
91}
92
93TEST_F(ServiceTest, StartSuccess) {
94 MockConfig* config = new MockConfig();
95 SetConfig(config);
96
Peter Qiubf8e36c2014-12-03 22:59:45 -080097 // Setup mock DHCP server.
98 MockDHCPServerFactory* dhcp_server_factory =
99 MockDHCPServerFactory::GetInstance();
100 MockDHCPServer* dhcp_server = new MockDHCPServer();
101 SetDHCPServerFactory(dhcp_server_factory);
102
Peter Qiu77517302015-01-08 16:22:16 -0800103 // Setup mock file writer.
104 MockFileWriter* file_writer = MockFileWriter::GetInstance();
105 SetFileWriter(file_writer);
106
Peter Qiu376e4042014-11-13 09:40:28 -0800107 std::string config_str(kHostapdConfig);
108 chromeos::ErrorPtr error;
109 EXPECT_CALL(*config, GenerateConfigFile(_, _)).WillOnce(
110 DoAll(SetArgPointee<1>(config_str), Return(true)));
Peter Qiu77517302015-01-08 16:22:16 -0800111 EXPECT_CALL(*file_writer, Write(kHostapdConfigFilePath, kHostapdConfig))
112 .WillOnce(Return(true));
Peter Qiufb39ba42014-11-21 09:09:59 -0800113 EXPECT_CALL(*config, ClaimDevice()).WillOnce(Return(true));
Peter Qiubf8e36c2014-12-03 22:59:45 -0800114 EXPECT_CALL(*dhcp_server_factory, CreateDHCPServer(_, _))
115 .WillOnce(Return(dhcp_server));
116 EXPECT_CALL(*dhcp_server, Start()).WillOnce(Return(true));
Peter Qiu376e4042014-11-13 09:40:28 -0800117 EXPECT_TRUE(service_.Start(&error));
118 EXPECT_EQ(nullptr, error);
119}
120
121TEST_F(ServiceTest, StopWhenServiceNotRunning) {
122 chromeos::ErrorPtr error;
123 EXPECT_FALSE(service_.Stop(&error));
124 EXPECT_THAT(error, IsServiceErrorStartingWith(
125 "Service is not currently running"));
126}
127
128TEST_F(ServiceTest, StopSuccess) {
129 StartDummyProcess();
130
Peter Qiufb39ba42014-11-21 09:09:59 -0800131 MockConfig* config = new MockConfig();
132 SetConfig(config);
Peter Qiu376e4042014-11-13 09:40:28 -0800133 chromeos::ErrorPtr error;
Peter Qiufb39ba42014-11-21 09:09:59 -0800134 EXPECT_CALL(*config, ReleaseDevice()).Times(1);
Peter Qiu376e4042014-11-13 09:40:28 -0800135 EXPECT_TRUE(service_.Stop(&error));
136}
137
138} // namespace apmanager