apmanager: add ProcessFactory for better unittesting
Use ProcessMock instead of real process when starting hostapd and
dnsmasq during unittest.
BUG=chromium:431759
TEST=USE="asan clang" FEATURES=test emerge-$BOARD apmanager
Start AP service using apmanager and verify client can connect
to it.
Change-Id: Ifea32a2dd08247db9ea4306ecef5947b305a3c8d
Reviewed-on: https://chromium-review.googlesource.com/239975
Trybot-Ready: Zeping Qiu <zqiu@chromium.org>
Tested-by: Zeping Qiu <zqiu@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Queue: Zeping Qiu <zqiu@chromium.org>
diff --git a/dhcp_server_unittest.cc b/dhcp_server_unittest.cc
index 76ab959..dd90546 100644
--- a/dhcp_server_unittest.cc
+++ b/dhcp_server_unittest.cc
@@ -16,6 +16,7 @@
#include <shill/net/mock_rtnl_handler.h>
#include "apmanager/mock_file_writer.h"
+#include "apmanager/mock_process_factory.h"
using chromeos::ProcessMock;
using ::testing::_;
@@ -46,11 +47,15 @@
public:
DHCPServerTest()
: dhcp_server_(new DHCPServer(kServerAddressIndex, kTestInterfaceName)),
- rtnl_handler_(new shill::MockRTNLHandler()) {}
+ rtnl_handler_(new shill::MockRTNLHandler()),
+ file_writer_(MockFileWriter::GetInstance()),
+ process_factory_(MockProcessFactory::GetInstance()) {}
virtual ~DHCPServerTest() {}
virtual void SetUp() {
dhcp_server_->rtnl_handler_ = rtnl_handler_.get();
+ dhcp_server_->file_writer_ = file_writer_;
+ dhcp_server_->process_factory_ = process_factory_;
}
virtual void TearDown() {
@@ -69,13 +74,11 @@
return dhcp_server_->GenerateConfigFile();
}
- void SetFileWriter(FileWriter* file_writer) {
- dhcp_server_->file_writer_ = file_writer;
- }
-
protected:
std::unique_ptr<DHCPServer> dhcp_server_;
std::unique_ptr<shill::MockRTNLHandler> rtnl_handler_;
+ MockFileWriter* file_writer_;
+ MockProcessFactory* process_factory_;
};
@@ -94,12 +97,10 @@
}
TEST_F(DHCPServerTest, StartSuccess) {
- // Setup mock file writer.
- MockFileWriter* file_writer = MockFileWriter::GetInstance();
- SetFileWriter(file_writer);
+ ProcessMock* process = new ProcessMock();
const int kInterfaceIndex = 1;
- EXPECT_CALL(*file_writer,
+ EXPECT_CALL(*file_writer_,
Write(kDnsmasqConfigFilePath, kExpectedDnsmasqConfigFile))
.WillOnce(Return(true));
EXPECT_CALL(*rtnl_handler_.get(), GetInterfaceIndex(kTestInterfaceName))
@@ -108,10 +109,8 @@
AddInterfaceAddress(kInterfaceIndex, _, _, _)).Times(1);
EXPECT_CALL(*rtnl_handler_.get(),
SetInterfaceFlags(kInterfaceIndex, IFF_UP, IFF_UP)).Times(1);
- // This will attempt to start a real dnsmasq process, and won't cause any
- // trouble since the interface name specified is invalid. This can be avoid
- // once we move to use ProcessFactory for process creation, which allows us
- // to use the MockProcess instead of the real Process.
+ EXPECT_CALL(*process_factory_, CreateProcess()).WillOnce(Return(process));
+ EXPECT_CALL(*process, Start()).WillOnce(Return(true));
EXPECT_TRUE(dhcp_server_->Start());
Mock::VerifyAndClearExpectations(rtnl_handler_.get());
}