From 29d1d177a4baf7325a9a2f3025d37afda75c5fa4 Mon Sep 17 00:00:00 2001 From: Sergey Yakubov <sergey.yakubov@desy.de> Date: Tue, 4 Sep 2018 15:43:35 +0200 Subject: [PATCH] started windows folder monitor --- .../event_monitor_producer/CMakeLists.txt | 6 +- .../src/single_folder_monitor.cpp | 13 +++ .../src/single_folder_monitor.h | 19 +++++ .../src/system_folder_watch_windows.cpp | 28 +++++++ .../src/system_folder_watch_windows.h | 6 +- .../test_system_folder_watch_windows.cpp | 83 +++++++++++++++++++ 6 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 producer/event_monitor_producer/src/single_folder_monitor.cpp create mode 100644 producer/event_monitor_producer/src/single_folder_monitor.h create mode 100644 producer/event_monitor_producer/unittests/test_system_folder_watch_windows.cpp diff --git a/producer/event_monitor_producer/CMakeLists.txt b/producer/event_monitor_producer/CMakeLists.txt index dd3ec147d..8809a6224 100644 --- a/producer/event_monitor_producer/CMakeLists.txt +++ b/producer/event_monitor_producer/CMakeLists.txt @@ -7,7 +7,7 @@ set(SOURCE_FILES ) IF(WIN32) - set(SOURCE_FILES ${SOURCE_FILES} src/system_folder_watch_windows.cpp) + set(SOURCE_FILES ${SOURCE_FILES} src/system_folder_watch_windows.cpp src/single_folder_monitor.cpp) ELSEIF(UNIX) set(SOURCE_FILES ${SOURCE_FILES} src/system_folder_watch_linux.cpp src/inotify_event.cpp src/inotify_linux.cpp) ENDIF(WIN32) @@ -55,7 +55,9 @@ set(TEST_SOURCE_FILES IF(UNIX) set(TEST_SOURCE_FILES ${TEST_SOURCE_FILES} unittests/test_system_folder_watch_linux.cpp) -ENDIF(WIN32) +ELSE() +set(TEST_SOURCE_FILES ${TEST_SOURCE_FILES} unittests/test_system_folder_watch_windows.cpp) +ENDIF(UNIX) set(TEST_LIBRARIES "${TARGET_NAME}") diff --git a/producer/event_monitor_producer/src/single_folder_monitor.cpp b/producer/event_monitor_producer/src/single_folder_monitor.cpp new file mode 100644 index 000000000..390e0fef8 --- /dev/null +++ b/producer/event_monitor_producer/src/single_folder_monitor.cpp @@ -0,0 +1,13 @@ +#include "single_folder_monitor.h" + +namespace asapo { + +SingleFolderMonitor::SingleFolderMonitor(std::string root_folder, std::string folder) : root_folder_{std::move(root_folder)}, + folder_{std::move(folder)} { + +} + +void SingleFolderMonitor::Monitor() { +} + +} diff --git a/producer/event_monitor_producer/src/single_folder_monitor.h b/producer/event_monitor_producer/src/single_folder_monitor.h new file mode 100644 index 000000000..0a537984d --- /dev/null +++ b/producer/event_monitor_producer/src/single_folder_monitor.h @@ -0,0 +1,19 @@ +#ifndef ASAPO_SINGLE_FOLDER_MONITOR_H +#define ASAPO_SINGLE_FOLDER_MONITOR_H + +#include <string> + +namespace asapo { + +class SingleFolderMonitor { + public: + explicit SingleFolderMonitor(std::string root_folder,std::string folder); + void Monitor(); + private: + std::string root_folder_; + std::string folder_; +}; + +} + +#endif //ASAPO_SINGLE_FOLDER_MONITOR_H diff --git a/producer/event_monitor_producer/src/system_folder_watch_windows.cpp b/producer/event_monitor_producer/src/system_folder_watch_windows.cpp index c721862cd..7c9367877 100644 --- a/producer/event_monitor_producer/src/system_folder_watch_windows.cpp +++ b/producer/event_monitor_producer/src/system_folder_watch_windows.cpp @@ -1,9 +1,35 @@ #include "system_folder_watch_windows.h" +#include <windows.h> +#include <memory> + +#include "io/io_factory.h" +#include "single_folder_monitor.h" + namespace asapo { Error SystemFolderWatch::StartFolderMonitor(const std::string& root_folder, const std::vector<std::string>& monitored_folders) { + for (auto& folder:monitored_folders ) { + auto thread = io__->NewThread([root_folder, folder] { + auto folder_monitor = std::unique_ptr<SingleFolderMonitor>(new SingleFolderMonitor(root_folder, folder)); + folder_monitor->Monitor(); + }); + + if (thread) { + thread->detach(); + } + } +/* + HANDLE hDir = CreateFile( + root_folder.c_str(), + FILE_LIST_DIRECTORY, + FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL); +*/ return nullptr; } @@ -12,7 +38,9 @@ FilesToSend SystemFolderWatch::GetFileList(Error* err) { *err = nullptr; return events; } +SystemFolderWatch::SystemFolderWatch() :io__{GenerateDefaultIO()}{ +} } diff --git a/producer/event_monitor_producer/src/system_folder_watch_windows.h b/producer/event_monitor_producer/src/system_folder_watch_windows.h index 2cfe53a85..b4d936e30 100644 --- a/producer/event_monitor_producer/src/system_folder_watch_windows.h +++ b/producer/event_monitor_producer/src/system_folder_watch_windows.h @@ -15,9 +15,13 @@ namespace asapo { class SystemFolderWatch { public: - VIRTUAL Error StartFolderMonitor(const std::string& root_folder, + SystemFolderWatch(); + VIRTUAL Error StartFolderMonitor(const std::string& root_folder, const std::vector<std::string>& monitored_folders); VIRTUAL FilesToSend GetFileList(Error* err); + std::unique_ptr<IO> io__; + private: + }; } diff --git a/producer/event_monitor_producer/unittests/test_system_folder_watch_windows.cpp b/producer/event_monitor_producer/unittests/test_system_folder_watch_windows.cpp new file mode 100644 index 000000000..300f6f8f1 --- /dev/null +++ b/producer/event_monitor_producer/unittests/test_system_folder_watch_windows.cpp @@ -0,0 +1,83 @@ +#include <gtest/gtest.h> +#include <gmock/gmock.h> + +#include "../src/system_folder_watch_windows.h" +#include "../src/event_monitor_error.h" +#include "../src/common.h" + +#include <unittests/MockIO.h> + + + +using ::testing::Return; +using ::testing::_; +using ::testing::DoAll; +using ::testing::SetArgReferee; +using ::testing::SetArgPointee; +using ::testing::Gt; +using ::testing::Eq; +using ::testing::Ne; +using ::testing::Mock; +using ::testing::InSequence; +using ::testing::HasSubstr; +using testing::StrEq; + +using ::asapo::Error; +using ::asapo::ErrorInterface; +using asapo::FilesToSend; +using asapo::SystemFolderWatch; +using asapo::FileInfos; +using asapo::FileInfo; + +namespace { + + +TEST(SystemFolderWatch, Constructor) { + SystemFolderWatch watch; + ASSERT_THAT(dynamic_cast<asapo::IO*>(watch.io__.get()), Ne(nullptr)); +} + +FileInfos CreateTestFileInfos() { + FileInfos file_infos; + FileInfo fi; + fi.size = 100; + fi.name = "file1"; + file_infos.push_back(fi); + fi.name = "subfolder/file2"; + file_infos.push_back(fi); + return file_infos; +} + + +class SystemFolderWatchTests : public testing::Test { + public: + Error err; + ::testing::NiceMock<asapo::MockIO> mock_io; + SystemFolderWatch watch{}; + std::string expected_root_folder = "/tmp"; + std::vector<std::string> expected_folders{"test1", "test2"}; + void SetUp() override { + watch.io__ = std::unique_ptr<asapo::IO> {&mock_io}; + } + void TearDown() override { + watch.io__.release(); + } +}; + +TEST_F(SystemFolderWatchTests, ErrorInitInotifyStartMonitoring) { + + + EXPECT_CALL(mock_io, NewThread_t(_)).Times(expected_folders.size()). + WillRepeatedly( + Return(nullptr) + ); + + auto err = watch.StartFolderMonitor(expected_root_folder, expected_folders); + ASSERT_THAT(err, Eq(nullptr)); +} + + + + + +} \ No newline at end of file -- GitLab