diff --git a/producer/event_monitor_producer/CMakeLists.txt b/producer/event_monitor_producer/CMakeLists.txt index dd3ec147dc90ddb8732c1520169c9f3787da3417..8809a62247447bf36f6b5f9c72df2be81b79ae96 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 0000000000000000000000000000000000000000..390e0fef8643af6bd3ff6b6d924ad46f1ba8ea14 --- /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 0000000000000000000000000000000000000000..0a537984de64dea44c03891805725eabde5c8299 --- /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 c721862cd7dd254fbba4820cc85e78e5655cb85a..7c9367877d2ad5dbbf1565895de3bc956819d209 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 2cfe53a85d5f9ecc54eb150fabde463abc556389..b4d936e308f0997b4653151e8c5b36834ab1d41c 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 0000000000000000000000000000000000000000..300f6f8f1882eeb8f2cd2c81cf8de3bdc94dc20c --- /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