feat: Async framework submit on strand/ctx (#2751)

This commit is contained in:
Alex Kremer
2025-11-04 19:14:31 +00:00
committed by GitHub
parent d6ab2cc1e4
commit 6d79dd6b2b
14 changed files with 296 additions and 110 deletions

View File

@@ -124,6 +124,6 @@ struct FakeRetryPolicy {
void
retry(Fn&& fn)
{
fn();
std::invoke(std::forward<decltype(fn)>(fn));
}
};

View File

@@ -28,7 +28,6 @@
#include <string_view>
namespace common::util {
class WithMockAssert : virtual public testing::Test {
public:
struct MockAssertException {
@@ -48,30 +47,42 @@ public:
~WithMockAssertNoThrow() override;
};
namespace impl {
template <typename T>
struct MockGuard {
T mock;
~MockGuard()
{
::util::impl::OnAssert::resetAction();
}
};
} // namespace impl
} // namespace common::util
#define EXPECT_CLIO_ASSERT_FAIL_WITH_MESSAGE(statement, message_regex) \
if (dynamic_cast<common::util::WithMockAssert*>(this) != nullptr) { \
EXPECT_THROW( \
{ \
try { \
statement; \
} catch (common::util::WithMockAssert::MockAssertException const& e) { \
EXPECT_THAT(e.message, testing::ContainsRegex(message_regex)); \
throw; \
} \
}, \
common::util::WithMockAssert::MockAssertException \
); \
} else if (dynamic_cast<common::util::WithMockAssertNoThrow*>(this) != nullptr) { \
testing::StrictMock<testing::MockFunction<void(std::string_view)>> callMock; \
::util::impl::OnAssert::setAction([&callMock](std::string_view m) { callMock.Call(m); }); \
EXPECT_CALL(callMock, Call(testing::ContainsRegex(message_regex))); \
statement; \
::util::impl::OnAssert::resetAction(); \
} else { \
std::cerr << "EXPECT_CLIO_ASSERT_FAIL_WITH_MESSAGE() can be used only inside test body" << std::endl; \
std::terminate(); \
#define EXPECT_CLIO_ASSERT_FAIL_WITH_MESSAGE(statement, message_regex) \
if (dynamic_cast<common::util::WithMockAssert*>(this) != nullptr) { \
EXPECT_THROW( \
{ \
try { \
statement; \
} catch (common::util::WithMockAssert::MockAssertException const& e) { \
EXPECT_THAT(e.message, testing::ContainsRegex(message_regex)); \
throw; \
} \
}, \
common::util::WithMockAssert::MockAssertException \
); \
} else if (dynamic_cast<common::util::WithMockAssertNoThrow*>(this) != nullptr) { \
using MockGuardType = \
common::util::impl::MockGuard<testing::StrictMock<testing::MockFunction<void(std::string_view)>>>; \
auto mockGuard = std::make_shared<MockGuardType>(); \
::util::impl::OnAssert::setAction([mockGuard](std::string_view m) { mockGuard->mock.Call(m); }); \
EXPECT_CALL(mockGuard->mock, Call(testing::ContainsRegex(message_regex))); \
statement; \
} else { \
std::cerr << "EXPECT_CLIO_ASSERT_FAIL_WITH_MESSAGE() can be used only inside test body" << std::endl; \
std::terminate(); \
}
#define EXPECT_CLIO_ASSERT_FAIL(statement) EXPECT_CLIO_ASSERT_FAIL_WITH_MESSAGE(statement, ".*")

View File

@@ -84,6 +84,7 @@ struct MockExecutionContext {
(std::chrono::milliseconds, std::function<std::any()>),
()
);
MOCK_METHOD(void, submit, (std::function<void()>), ());
MOCK_METHOD(MockStrand const&, makeStrand, (), ());
MOCK_METHOD(void, stop, (), (const));

View File

@@ -69,4 +69,5 @@ struct MockStrand {
(std::chrono::milliseconds, std::function<std::any()>),
(const)
);
MOCK_METHOD(void, submit, (std::function<void()>), (const));
};