Module: check_mk
Branch: master
Commit: 4d6f3693d608832fcaf85c7e8a27987183c56608
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=4d6f3693d60883…
Author: Jukka Aro <ja(a)mathias-kettner.de>
Date: Wed Apr 18 13:42:42 2018 +0200
Win-agent: improve test coverage for WritableFile
---
agents/windows/test/WritableFileTest.cc | 97 ++++++++++++++++++++++++++++++++-
1 file changed, 95 insertions(+), 2 deletions(-)
diff --git a/agents/windows/test/WritableFileTest.cc
b/agents/windows/test/WritableFileTest.cc
index f0acf49..44602e0 100644
--- a/agents/windows/test/WritableFileTest.cc
+++ b/agents/windows/test/WritableFileTest.cc
@@ -1,6 +1,8 @@
#include <unordered_map>
#include <unordered_set>
#include "CustomActions.h"
+#include "MockEnvironment.h"
+#include "MockLogger.h"
#include "MockWinApi.h"
#include "WritableFile.h"
#include "gmock/gmock.h"
@@ -56,7 +58,7 @@ TEST_F(wa_WritableFileTest, constructor_failure) {
FileError);
}
-TEST_F(wa_WritableFileTest, stream_operator_success) {
+TEST_F(wa_WritableFileTest, stream_operator_string_success) {
const std::string testPath{"foo"};
DWORD shareMode = 0x1;
DWORD disposition = 0x2;
@@ -79,7 +81,7 @@ TEST_F(wa_WritableFileTest, stream_operator_success) {
}
}
-TEST_F(wa_WritableFileTest, stream_operator_failure) {
+TEST_F(wa_WritableFileTest, stream_operator_string_failure) {
const std::string testPath{"foo"};
DWORD shareMode = 0x1;
DWORD disposition = 0x2;
@@ -118,6 +120,97 @@ TEST_F(wa_WritableFileTest, stream_operator_failure) {
}
}
+TEST_F(wa_WritableFileTest, stream_operator_bytes_success) {
+ const std::string testPath{"foo"};
+ DWORD shareMode = 0x1;
+ DWORD disposition = 0x2;
+ HANDLE rawHandle = reinterpret_cast<HANDLE>(0x3);
+ const std::array<std::vector<BYTE>, 2> testArrays = {
+ std::vector<BYTE>{6, 1}, std::vector<BYTE>{6, 2}};
+
+ EXPECT_CALL(_mockwinapi,
+ CreateFile(StrEq(testPath), _, shareMode, _, disposition, _, _))
+ .WillOnce(Return(rawHandle));
+ for (const auto &testBytes : testArrays) {
+ EXPECT_CALL(_mockwinapi, WriteFile(rawHandle, testBytes.data(),
+ testBytes.size(), _, _))
+ .WillOnce(Return(1));
+ }
+ EXPECT_CALL(_mockwinapi, CloseHandle(rawHandle));
+ {
+ WritableFile testFile{testPath, shareMode, disposition, _mockwinapi};
+ testFile << testArrays[0] << testArrays[1];
+ }
+}
+
+TEST_F(wa_WritableFileTest, stream_operator_bytes_failure) {
+ const std::string testPath{"foo"};
+ DWORD shareMode = 0x1;
+ DWORD disposition = 0x2;
+ HANDLE rawHandle = reinterpret_cast<HANDLE>(0x3);
+ const std::vector<BYTE> testBytes = {0, 1, 2, 3, 4, 5};
+ DWORD errorCode = ERROR_ACCESS_DENIED;
+ const std::string buf = "Access denied";
+ std::vector<char> errorStr(buf.cbegin(), buf.cend());
+ errorStr.push_back('\0');
+
+ EXPECT_CALL(_mockwinapi,
+ CreateFile(StrEq(testPath), _, shareMode, _, disposition, _, _))
+ .WillOnce(Return(rawHandle));
+ EXPECT_CALL(_mockwinapi, WriteFile(rawHandle, testBytes.data(),
+ testBytes.size(), _, _))
+ .WillOnce(Return(0));
+ EXPECT_CALL(_mockwinapi, CloseHandle(rawHandle));
+ EXPECT_CALL(_mockwinapi, GetLastError()).WillOnce(Return(errorCode));
+ EXPECT_CALL(_mockwinapi, FormatMessageA(_, _, errorCode, _, _, _, _))
+ .WillOnce(DoAll(SetCharBuffer<4>(errorStr.data()),
+ Return(errorStr.size() - 1)));
+ EXPECT_CALL(_mockwinapi, LocalFree(errorStr.data()));
+ {
+ WritableFile testFile{testPath, shareMode, disposition, _mockwinapi};
+ ASSERT_THROW(
+ {
+ try {
+ testFile << testBytes;
+ } catch (const FileError &e) {
+ EXPECT_STREQ("File 'foo': error: Access denied
(5)",
+ e.what());
+ throw;
+ }
+ },
+ FileError);
+ }
+}
+
+TEST_F(wa_WritableFileTest, getDefaultWhitelist_success) {
+ NiceMock<MockLogger> mocklogger;
+ NiceMock<MockWinApi> mockwinapi;
+ StrictMock<MockEnvironment> mockenv{&mocklogger, mockwinapi};
+ const std::string testDir{"foo\\bar"};
+ const std::string testPath{"bazqux.exe"};
+ EXPECT_CALL(mockenv, agentDirectory()).WillOnce(Return(testDir));
+ EXPECT_CALL(mockwinapi, GetModuleFileName(nullptr, _, _MAX_PATH))
+ .WillOnce(DoAll(SetArrayArgument<1>(testPath.cbegin(), testPath.cend()),
Return(10)));
+ const std::unordered_set<std::string> expected{
+ "foo\\bar\\bin\\OpenHardwareMonitorLib.sys", "bazqux.exe"};
+ const auto actual = getDefaultWhitelist(mockenv, mockwinapi);
+ ASSERT_EQ(expected, actual);
+}
+
+TEST_F(wa_WritableFileTest, getDefaultWhitelist_GetModuleFileName_failure) {
+ NiceMock<MockLogger> mocklogger;
+ NiceMock<MockWinApi> mockwinapi;
+ StrictMock<MockEnvironment> mockenv{&mocklogger, mockwinapi};
+ const std::string testDir{"foo\\bar"};
+ EXPECT_CALL(mockenv, agentDirectory()).WillOnce(Return(testDir));
+ EXPECT_CALL(mockwinapi, GetModuleFileName(nullptr, _, _MAX_PATH))
+ .WillOnce(Return(0));
+ const std::unordered_set<std::string> expected{
+ "foo\\bar\\bin\\OpenHardwareMonitorLib.sys"};
+ const auto actual = getDefaultWhitelist(mockenv, mockwinapi);
+ ASSERT_EQ(expected, actual);
+}
+
using CallTuple = std::tuple<BOOL, std::string, DWORD>;
template <size_t U>
using CallArray = std::array<CallTuple, U>;