This is an automated email from the ASF dual-hosted git repository.

pengzheng pushed a commit to branch hotfix/shaky-test-timeout
in repository https://gitbox.apache.org/repos/asf/celix.git

commit 94fda8a210bc2fae229a8a02aa6ad46d242831f9
Author: PengZheng <[email protected]>
AuthorDate: Sat Oct 18 15:47:35 2025 +0800

    Use future/promise to replace sleep-based event queue handling for improved 
test reliability.
---
 libs/framework/gtest/src/CelixFrameworkTestSuite.cc | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/libs/framework/gtest/src/CelixFrameworkTestSuite.cc 
b/libs/framework/gtest/src/CelixFrameworkTestSuite.cc
index 82a002bdc..86c625021 100644
--- a/libs/framework/gtest/src/CelixFrameworkTestSuite.cc
+++ b/libs/framework/gtest/src/CelixFrameworkTestSuite.cc
@@ -74,16 +74,21 @@ TEST_F(CelixFrameworkTestSuite, TimedWaitEventQueueTest) {
     //When there is a emtpy event queue
     celix_framework_waitForEmptyEventQueue(framework.get());
 
-    //And a generic event is fired, that block the queue for 20ms
-    auto callback = [](void* /*data*/) {
-        std::this_thread::sleep_for(std::chrono::milliseconds{200});
+    std::promise<int> p;
+    std::future<int> f = p.get_future();
+    //And a generic event is fired, that block the queue until timeout
+    auto callback = [](void* data) {
+        auto* f = static_cast<std::future<std::string>*>(data);
+        f->wait();
     };
-    celix_framework_fireGenericEvent(framework.get(), -1L, -1L, "test", 
nullptr, callback, nullptr, nullptr);
+    celix_framework_fireGenericEvent(framework.get(), -1L, -1L, "test", &f, 
callback, nullptr, nullptr);
 
     //Then a wait for empty event queue for max 5ms will return a timeout
     celix_status_t status = 
celix_framework_waitForEmptyEventQueueFor(framework.get(), 0.005);
     EXPECT_EQ(ETIMEDOUT, status) << "Expected timeout, but got " << 
celix_strerror(status);
 
+    p.set_value(1);
+
     //And a wait for empty event queue for max 1s will return success
     status = celix_framework_waitForEmptyEventQueueFor(framework.get(), 1);
     EXPECT_EQ(CELIX_SUCCESS, status);
@@ -99,7 +104,6 @@ TEST_F(CelixFrameworkTestSuite, 
GenericEventTimeoutPropertyTest) {
     framework_t* fw = celix_frameworkFactory_createFramework(config);
     ASSERT_TRUE(fw != nullptr);
 
-    // Start capturing stdout
     std::promise<std::string> p;
     std::future<std::string> f = p.get_future();
     celix_frameworkLogger_setLogCallback(fw->logger, &p,
@@ -111,7 +115,11 @@ TEST_F(CelixFrameworkTestSuite, 
GenericEventTimeoutPropertyTest) {
             auto log = std::string(buffer);
             auto expected = "Generic event 'test' (id=" + std::to_string(100) 
+ ")";
             if (log.find(expected) != std::string::npos) {
-                p->set_value(log);
+                try {
+                    p->set_value(log);
+                } catch (std::future_error& e) {
+                    EXPECT_EQ(std::future_errc::promise_already_satisfied, 
e.code());
+                }
             }
     });
 

Reply via email to