From 7bb7afa2270c87b6033c6ceaf8f215db863dad15 Mon Sep 17 00:00:00 2001 From: Sascha Kuehl Date: Sun, 14 Apr 2024 11:41:36 +0200 Subject: [PATCH] integrated auto_reset_event into test utils --- include/matador/sql/connection_pool.hpp | 1 + test/CMakeLists.txt | 4 +- test/ConnectionPoolTest.cpp | 53 +++++++------------------ test/utils/auto_reset_event.cpp | 26 ++++++++++++ test/utils/auto_reset_event.hpp | 29 ++++++++++++++ 5 files changed, 73 insertions(+), 40 deletions(-) create mode 100644 test/utils/auto_reset_event.cpp create mode 100644 test/utils/auto_reset_event.hpp diff --git a/include/matador/sql/connection_pool.hpp b/include/matador/sql/connection_pool.hpp index 9c977a6..8afca66 100644 --- a/include/matador/sql/connection_pool.hpp +++ b/include/matador/sql/connection_pool.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 05f2679..c4aa1de 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -40,7 +40,9 @@ add_executable(tests FieldTest.cpp models/recipe.hpp ValueTest.cpp - ResultTest.cpp) + ResultTest.cpp + utils/auto_reset_event.hpp + utils/auto_reset_event.cpp) target_link_libraries(tests PRIVATE Catch2::Catch2WithMain diff --git a/test/ConnectionPoolTest.cpp b/test/ConnectionPoolTest.cpp index 1f231f1..7860320 100644 --- a/test/ConnectionPoolTest.cpp +++ b/test/ConnectionPoolTest.cpp @@ -1,37 +1,12 @@ #include -#include -#include +#include "matador/sql/connection_pool.hpp" +#include "matador/sql/noop_connection.hpp" -class AutoResetEvent -{ -public: - AutoResetEvent() : state(false) {} - AutoResetEvent(const AutoResetEvent& other) = delete; - - void WaitOne() { - std::unique_lock lock(sync); - underlying.wait(lock, [this](){return state.load();}); - } - - void Set() { - std::unique_lock lock(sync); - state = true; - underlying.notify_all(); - } - - void Reset() { - std::unique_lock lock(sync); - state = false; - } - -private: - std::condition_variable underlying; - std::mutex sync; - std::atomic state; -}; +#include "utils/auto_reset_event.hpp" using namespace matador::sql; +using namespace matador::test::utils; TEST_CASE("Create connection pool", "[connection pool]") { using pool_t = connection_pool; @@ -145,31 +120,31 @@ TEST_CASE("Try acquire connection", "[connection pool][try acquire]") { pool.release(ptr2); - AutoResetEvent reset_event1; - AutoResetEvent reset_event2; - AutoResetEvent reset_event3; + auto_reset_event reset_main_event; + auto_reset_event reset_thread_event; - std::thread t([&reset_event1, &reset_event2, &reset_event3, &pool]() { + std::thread t([&reset_main_event, &reset_thread_event, &pool]() { auto c1 = pool.acquire(); REQUIRE(c1.valid()); REQUIRE(c1.id()); REQUIRE(c1.id().value() > 0); - reset_event1.Set(); + reset_main_event.set(); + + reset_thread_event.wait_one(); - reset_event2.WaitOne(); pool.release(c1); REQUIRE(!c1.valid()); - reset_event3.Set(); + reset_main_event.set(); }); - reset_event1.WaitOne(); + reset_main_event.wait_one(); ptr2 = pool.try_acquire(); REQUIRE(!ptr2.valid()); - reset_event2.Set(); + reset_thread_event.set(); - reset_event3.WaitOne(); + reset_main_event.wait_one(); ptr2 = pool.try_acquire(); REQUIRE(ptr2.valid()); REQUIRE(ptr2.id()); diff --git a/test/utils/auto_reset_event.cpp b/test/utils/auto_reset_event.cpp new file mode 100644 index 0000000..aa4fd76 --- /dev/null +++ b/test/utils/auto_reset_event.cpp @@ -0,0 +1,26 @@ +#include "auto_reset_event.hpp" + +namespace matador::test::utils { + +auto_reset_event::auto_reset_event() : state(false) {} + +void auto_reset_event::wait_one() +{ + std::unique_lock lock(sync); + underlying.wait(lock, [this](){return state.load();}); + state = false; +} + +void auto_reset_event::set() +{ + std::unique_lock lock(sync); + state = true; + underlying.notify_one(); +} + +void auto_reset_event::reset() +{ + std::unique_lock lock(sync); + state = false; +} +} \ No newline at end of file diff --git a/test/utils/auto_reset_event.hpp b/test/utils/auto_reset_event.hpp new file mode 100644 index 0000000..cd1d25d --- /dev/null +++ b/test/utils/auto_reset_event.hpp @@ -0,0 +1,29 @@ +#ifndef QUERY_AUTO_RESET_EVENT_HPP +#define QUERY_AUTO_RESET_EVENT_HPP + +#include +#include +#include + +namespace matador::test::utils { + +class auto_reset_event +{ +public: + auto_reset_event(); + auto_reset_event(const auto_reset_event& other) = delete; + + void wait_one(); + void set(); + void reset(); + +private: + std::condition_variable underlying; + std::mutex sync; + std::atomic state; +}; + + +} + +#endif //QUERY_AUTO_RESET_EVENT_HPP