| Patrick Williams | 73e278b | 2022-09-16 08:31:36 -0500 | [diff] [blame] | 1 | #include <sdbusplus/async.hpp> | 
|  | 2 |  | 
|  | 3 | #include <gtest/gtest.h> | 
|  | 4 |  | 
| Patrick Williams | 78e436f | 2022-09-21 10:06:20 -0500 | [diff] [blame] | 5 | struct Context : public testing::Test | 
| Patrick Williams | 73e278b | 2022-09-16 08:31:36 -0500 | [diff] [blame] | 6 | { | 
| Patrick Williams | 78e436f | 2022-09-21 10:06:20 -0500 | [diff] [blame] | 7 | ~Context() noexcept = default; | 
|  | 8 |  | 
|  | 9 | void TearDown() override | 
|  | 10 | { | 
|  | 11 | // Destructing the context can throw, so we have to do it in | 
|  | 12 | // the TearDown in order to make our destructor noexcept. | 
|  | 13 | ctx.reset(); | 
|  | 14 | } | 
|  | 15 |  | 
| Patrick Williams | 1b7b54c | 2022-09-21 10:49:45 -0500 | [diff] [blame] | 16 | void runToStop() | 
|  | 17 | { | 
|  | 18 | ctx->run(std::execution::just() | | 
|  | 19 | std::execution::then([this]() { ctx->request_stop(); })); | 
|  | 20 | } | 
|  | 21 |  | 
| Patrick Williams | 78e436f | 2022-09-21 10:06:20 -0500 | [diff] [blame] | 22 | std::optional<sdbusplus::async::context> ctx{std::in_place}; | 
|  | 23 | }; | 
|  | 24 |  | 
|  | 25 | TEST_F(Context, RunSimple) | 
|  | 26 | { | 
| Patrick Williams | 1b7b54c | 2022-09-21 10:49:45 -0500 | [diff] [blame] | 27 | runToStop(); | 
| Patrick Williams | 73e278b | 2022-09-16 08:31:36 -0500 | [diff] [blame] | 28 | } | 
| Patrick Williams | 0139cac | 2022-09-20 17:04:17 -0500 | [diff] [blame] | 29 |  | 
| Patrick Williams | 78e436f | 2022-09-21 10:06:20 -0500 | [diff] [blame] | 30 | TEST_F(Context, SpawnedTask) | 
| Patrick Williams | 0139cac | 2022-09-20 17:04:17 -0500 | [diff] [blame] | 31 | { | 
| Patrick Williams | 78e436f | 2022-09-21 10:06:20 -0500 | [diff] [blame] | 32 | ctx->spawn(std::execution::just()); | 
| Patrick Williams | 1b7b54c | 2022-09-21 10:49:45 -0500 | [diff] [blame] | 33 | runToStop(); | 
| Patrick Williams | 78e436f | 2022-09-21 10:06:20 -0500 | [diff] [blame] | 34 | } | 
| Patrick Williams | 0139cac | 2022-09-20 17:04:17 -0500 | [diff] [blame] | 35 |  | 
| Patrick Williams | 78e436f | 2022-09-21 10:06:20 -0500 | [diff] [blame] | 36 | TEST_F(Context, SpawnDelayedTask) | 
|  | 37 | { | 
|  | 38 | using namespace std::literals; | 
|  | 39 | static constexpr auto timeout = 500ms; | 
|  | 40 |  | 
|  | 41 | auto start = std::chrono::steady_clock::now(); | 
|  | 42 |  | 
|  | 43 | bool ran = false; | 
|  | 44 | ctx->spawn(sdbusplus::async::sleep_for(*ctx, timeout) | | 
|  | 45 | std::execution::then([&ran]() { ran = true; })); | 
|  | 46 |  | 
| Patrick Williams | 1b7b54c | 2022-09-21 10:49:45 -0500 | [diff] [blame] | 47 | runToStop(); | 
| Patrick Williams | 78e436f | 2022-09-21 10:06:20 -0500 | [diff] [blame] | 48 |  | 
|  | 49 | auto stop = std::chrono::steady_clock::now(); | 
|  | 50 |  | 
|  | 51 | EXPECT_TRUE(ran); | 
|  | 52 | EXPECT_GT(stop - start, timeout); | 
|  | 53 | EXPECT_LT(stop - start, timeout * 2); | 
| Patrick Williams | 0139cac | 2022-09-20 17:04:17 -0500 | [diff] [blame] | 54 | } | 
| Patrick Williams | 1b7b54c | 2022-09-21 10:49:45 -0500 | [diff] [blame] | 55 |  | 
|  | 56 | TEST_F(Context, DestructMatcherWithPendingAwait) | 
|  | 57 | { | 
|  | 58 | using namespace std::literals; | 
|  | 59 |  | 
|  | 60 | bool ran = false; | 
|  | 61 | auto m = std::make_optional<sdbusplus::async::match>( | 
|  | 62 | *ctx, sdbusplus::bus::match::rules::interfacesAdded( | 
|  | 63 | "/this/is/a/bogus/path/for/SpawnMatcher")); | 
|  | 64 |  | 
|  | 65 | // Await the match completion (which will never happen). | 
|  | 66 | ctx->spawn(m->next() | std::execution::then([&ran](...) { ran = true; })); | 
|  | 67 |  | 
|  | 68 | // Destruct the match. | 
|  | 69 | ctx->spawn(sdbusplus::async::sleep_for(*ctx, 1ms) | | 
|  | 70 | std::execution::then([&m](...) { m.reset(); })); | 
|  | 71 |  | 
| Patrick Williams | 4cfc284 | 2022-09-22 09:53:33 -0500 | [diff] [blame] | 72 | EXPECT_THROW(runToStop(), sdbusplus::exception::UnhandledStop); | 
| Patrick Williams | 1b7b54c | 2022-09-21 10:49:45 -0500 | [diff] [blame] | 73 | EXPECT_FALSE(ran); | 
|  | 74 | } | 
|  | 75 |  | 
|  | 76 | TEST_F(Context, DestructMatcherWithPendingAwaitAsTask) | 
|  | 77 | { | 
|  | 78 | using namespace std::literals; | 
|  | 79 |  | 
|  | 80 | auto m = std::make_optional<sdbusplus::async::match>( | 
|  | 81 | *ctx, sdbusplus::bus::match::rules::interfacesAdded( | 
|  | 82 | "/this/is/a/bogus/path/for/SpawnMatcher")); | 
|  | 83 |  | 
|  | 84 | struct _ | 
|  | 85 | { | 
|  | 86 | static auto fn(decltype(m->next()) snd, bool& ran) | 
|  | 87 | -> sdbusplus::async::task<> | 
|  | 88 | { | 
|  | 89 | co_await std::move(snd); | 
|  | 90 | ran = true; | 
|  | 91 | co_return; | 
|  | 92 | } | 
|  | 93 | }; | 
|  | 94 |  | 
|  | 95 | bool ran = false; | 
|  | 96 | ctx->spawn(_::fn(m->next(), ran)); | 
|  | 97 | ctx->spawn(sdbusplus::async::sleep_for(*ctx, 1ms) | | 
|  | 98 | std::execution::then([&]() { m.reset(); })); | 
|  | 99 |  | 
| Patrick Williams | 4cfc284 | 2022-09-22 09:53:33 -0500 | [diff] [blame] | 100 | EXPECT_THROW(runToStop(), sdbusplus::exception::UnhandledStop); | 
| Patrick Williams | 1b7b54c | 2022-09-21 10:49:45 -0500 | [diff] [blame] | 101 | EXPECT_FALSE(ran); | 
|  | 102 | } |