monitor is complete
This commit is contained in:
		
							parent
							
								
									17cd355668
								
							
						
					
					
						commit
						c88ea6a9a0
					
				
					 3 changed files with 125 additions and 20 deletions
				
			
		|  | @ -1,14 +0,0 @@ | ||||||
| #pragma once |  | ||||||
| #include <deque> |  | ||||||
| namespace collector |  | ||||||
| { |  | ||||||
| 	class Event |  | ||||||
| 	{}; |  | ||||||
| 	class Collector |  | ||||||
| 	{ |  | ||||||
| 		private: |  | ||||||
| 			std::deque<Event> _event_queue; |  | ||||||
| 		public: |  | ||||||
| 			const auto get_length() const { return _event_queue.size(); } |  | ||||||
| 	}; |  | ||||||
| } |  | ||||||
							
								
								
									
										90
									
								
								monitor.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								monitor.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,90 @@ | ||||||
|  | /**
 | ||||||
|  |  * @file monitor.hpp | ||||||
|  |  *  A dir_monitor wrapper for specific paths | ||||||
|  |  * | ||||||
|  |  * @author Tobias Schmidl | ||||||
|  |  * @copyright Copyright © 2022, Tobias Schmidl | ||||||
|  |  * SPDX-License-Identifier: MIT | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | #include <dir_monitor/dir_monitor.hpp> | ||||||
|  | #include <filesystem> | ||||||
|  | #include <regex> | ||||||
|  | 
 | ||||||
|  | namespace collector::monitor { | ||||||
|  | 
 | ||||||
|  | class Monitor | ||||||
|  | { | ||||||
|  |   private: | ||||||
|  |     boost::asio::dir_monitor _monitor; | ||||||
|  |     std::filesystem::path _root_path; | ||||||
|  | 
 | ||||||
|  |   public: | ||||||
|  |     explicit Monitor(boost::asio::io_service& io_service, | ||||||
|  |                      std::filesystem::path&& root_path) | ||||||
|  |       : _monitor(io_service) | ||||||
|  |       , _root_path(std::move(root_path)) | ||||||
|  |     { | ||||||
|  |         _monitor.add_directory(_root_path); | ||||||
|  |         for (const auto& dir_entry : | ||||||
|  |              std::filesystem::recursive_directory_iterator(_root_path)) { | ||||||
|  |             if (dir_entry.is_directory()) | ||||||
|  |                 _monitor.add_directory(dir_entry.path()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     explicit Monitor(boost::asio::io_service& io_service, | ||||||
|  |                      const std::filesystem::path& root_path) | ||||||
|  |       : _monitor(io_service) | ||||||
|  |       , _root_path(root_path) | ||||||
|  |     { | ||||||
|  |         _monitor.add_directory(_root_path); | ||||||
|  |         for (const auto& dir_entry : | ||||||
|  |              std::filesystem::recursive_directory_iterator(_root_path)) { | ||||||
|  |             if (dir_entry.is_directory()) | ||||||
|  |                 _monitor.add_directory(dir_entry.path()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * watches any for any event that matches the given search_pattern | ||||||
|  |      */ | ||||||
|  |     boost::asio::dir_monitor_event watch(const std::regex& search_pattern) | ||||||
|  |     { | ||||||
|  |         boost::asio::dir_monitor_event monitored_event; | ||||||
|  |         do { | ||||||
|  |             monitored_event = _monitor.monitor(); | ||||||
|  |         } while (!std::regex_match( | ||||||
|  |           monitored_event.path.filename().generic_string(), search_pattern)); | ||||||
|  |         return monitored_event; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * watches any for the specified event_type that also matches the given | ||||||
|  |      * search_pattern | ||||||
|  |      */ | ||||||
|  |     boost::asio::dir_monitor_event watch( | ||||||
|  |       const std::regex& search_pattern, | ||||||
|  |       const boost::asio::dir_monitor_event::event_type event_type) | ||||||
|  |     { | ||||||
|  |         boost::asio::dir_monitor_event monitored_event; | ||||||
|  |         do { | ||||||
|  |             monitored_event = _monitor.monitor(); | ||||||
|  |         } while ( | ||||||
|  |           !std::regex_match(monitored_event.path.filename().generic_string(), | ||||||
|  |                             search_pattern) || | ||||||
|  |           monitored_event.type != event_type); | ||||||
|  |         return monitored_event; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const auto& get_root_path() const { return _root_path; } | ||||||
|  |     virtual ~Monitor() = default; | ||||||
|  | 
 | ||||||
|  |     Monitor() = delete; | ||||||
|  |     Monitor(Monitor&& other) = delete; | ||||||
|  |     Monitor(const Monitor& other) = delete; | ||||||
|  |     Monitor& operator=(Monitor&& other) = delete; | ||||||
|  |     Monitor& operator=(const Monitor& other) = delete; | ||||||
|  | }; | ||||||
|  | } | ||||||
							
								
								
									
										39
									
								
								test.cpp
									
										
									
									
									
								
							
							
						
						
									
										39
									
								
								test.cpp
									
										
									
									
									
								
							|  | @ -1,13 +1,42 @@ | ||||||
| #include "collector.hpp" | /**
 | ||||||
|  |  * @file test.cpp | ||||||
|  |  *  The unit test executable | ||||||
|  |  * | ||||||
|  |  * @author Tobias Schmidl | ||||||
|  |  * @copyright Copyright © 2022, Tobias Schmidl | ||||||
|  |  * SPDX-License-Identifier: MIT | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "monitor.hpp" | ||||||
| #include "version.hpp" | #include "version.hpp" | ||||||
|  | #include "collector.hpp" | ||||||
| #define BOOST_TEST_MODULE Collector test | #define BOOST_TEST_MODULE Collector test | ||||||
| #include <boost/test/unit_test.hpp> | #include <boost/test/unit_test.hpp> | ||||||
|  | #include <chrono> | ||||||
|  | #include <fstream> | ||||||
|  | #include <future> | ||||||
|  | #include <thread> | ||||||
| 
 | 
 | ||||||
| using namespace collector; | using namespace collector::monitor; | ||||||
|  | using namespace collector::collector; | ||||||
|  | using namespace std::chrono_literals; | ||||||
| 
 | 
 | ||||||
| BOOST_AUTO_TEST_CASE(collector_test) | boost::asio::io_service service; | ||||||
|  | 
 | ||||||
|  | BOOST_AUTO_TEST_CASE(monitor_test) | ||||||
| { | { | ||||||
|     BOOST_TEST_MESSAGE("Test version " << VERSION); |     BOOST_TEST_MESSAGE("Test version " << VERSION); | ||||||
|     Collector foo; |     const std::filesystem::path test_file{ "test_file" }; | ||||||
|     BOOST_TEST(foo.get_length() == 0u); |     std::filesystem::remove(test_file); | ||||||
|  |     const auto create_file_result = std::async([&test_file]() { | ||||||
|  |         std::this_thread::sleep_for(2s); | ||||||
|  |         std::ofstream{ test_file }; | ||||||
|  |     }); | ||||||
|  |     Monitor monitor(service, std::filesystem::current_path()); | ||||||
|  |     const auto& watch_result = | ||||||
|  |       monitor.watch(std::regex(test_file.generic_string()), | ||||||
|  |                     boost::asio::dir_monitor_event::event_type::added); | ||||||
|  |     BOOST_TEST(std::filesystem::equivalent(test_file, | ||||||
|  |                                            watch_result.path.generic_string())); | ||||||
|  |     std::filesystem::remove(test_file); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue