mirror of
https://github.com/mutouyun/cpp-ipc.git
synced 2025-12-06 16:56:45 +08:00
100 lines
2.6 KiB
C++
100 lines
2.6 KiB
C++
|
|
#include <thread>
|
|
|
|
#include "gtest/gtest.h"
|
|
|
|
#include <libipc/event.h>
|
|
|
|
TEST(event, open_close) {
|
|
auto evt = ipc::evt_open("test");
|
|
ASSERT_TRUE(evt);
|
|
ASSERT_EQ(ipc::evt_name(*evt), "test");
|
|
ASSERT_TRUE(ipc::evt_close(*evt));
|
|
}
|
|
|
|
TEST(event, wait_timeout) {
|
|
auto evt = ipc::evt_open("test");
|
|
ASSERT_TRUE(evt);
|
|
ASSERT_FALSE(*ipc::evt_wait(*evt, 0));
|
|
ASSERT_TRUE(ipc::evt_close(*evt));
|
|
}
|
|
|
|
TEST(event, set_wait) {
|
|
auto evt = ipc::evt_open("test");
|
|
ASSERT_TRUE(evt);
|
|
ASSERT_TRUE(ipc::evt_set(*evt));
|
|
ASSERT_TRUE(*ipc::evt_wait(*evt, 0));
|
|
ASSERT_TRUE(ipc::evt_close(*evt));
|
|
}
|
|
|
|
TEST(event, unicast) {
|
|
auto evt = ipc::evt_open("test");
|
|
ASSERT_TRUE(evt);
|
|
int success = 0;
|
|
auto wait = [evt, &success] {
|
|
if (*ipc::evt_wait(*evt, 200)) ++success;
|
|
};
|
|
auto th1 = std::thread(wait);
|
|
auto th2 = std::thread(wait);
|
|
auto th3 = std::thread(wait);
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
ASSERT_TRUE(ipc::evt_set(*evt));
|
|
th1.join();
|
|
th2.join();
|
|
th3.join();
|
|
ASSERT_TRUE(ipc::evt_close(*evt));
|
|
ASSERT_EQ(success, 1);
|
|
}
|
|
|
|
TEST(event, wait_multi_timeout) {
|
|
auto evt1 = ipc::evt_open("test1");
|
|
ASSERT_TRUE(evt1);
|
|
auto evt2 = ipc::evt_open("test2");
|
|
ASSERT_TRUE(evt2);
|
|
auto evt3 = ipc::evt_open("test3");
|
|
ASSERT_TRUE(evt3);
|
|
ASSERT_FALSE(*ipc::evt_wait(imp::make_span({*evt1, *evt2, *evt3}), 0));
|
|
ASSERT_TRUE(ipc::evt_close(*evt1));
|
|
ASSERT_TRUE(ipc::evt_close(*evt2));
|
|
ASSERT_TRUE(ipc::evt_close(*evt3));
|
|
}
|
|
|
|
TEST(event, set_wait_multi) {
|
|
auto evt1 = ipc::evt_open("test1");
|
|
ASSERT_TRUE(evt1);
|
|
auto evt2 = ipc::evt_open("test2");
|
|
ASSERT_TRUE(evt2);
|
|
auto evt3 = ipc::evt_open("test3");
|
|
ASSERT_TRUE(evt3);
|
|
ASSERT_TRUE(ipc::evt_set(*evt2));
|
|
ASSERT_TRUE(*ipc::evt_wait(imp::make_span({*evt1, *evt2, *evt3}), 0));
|
|
ASSERT_TRUE(ipc::evt_close(*evt1));
|
|
ASSERT_TRUE(ipc::evt_close(*evt2));
|
|
ASSERT_TRUE(ipc::evt_close(*evt3));
|
|
}
|
|
|
|
TEST(event, unicast_multi) {
|
|
auto evt1 = ipc::evt_open("test1");
|
|
ASSERT_TRUE(evt1);
|
|
auto evt2 = ipc::evt_open("test2");
|
|
ASSERT_TRUE(evt2);
|
|
auto evt3 = ipc::evt_open("test3");
|
|
ASSERT_TRUE(evt3);
|
|
int success = 0;
|
|
auto wait = [evt1, evt2, evt3, &success] {
|
|
if (*ipc::evt_wait(imp::make_span({*evt1, *evt2, *evt3}), 200)) ++success;
|
|
};
|
|
auto th1 = std::thread(wait);
|
|
auto th2 = std::thread(wait);
|
|
auto th3 = std::thread(wait);
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
ASSERT_TRUE(ipc::evt_set(*evt3));
|
|
th1.join();
|
|
th2.join();
|
|
th3.join();
|
|
ASSERT_TRUE(ipc::evt_close(*evt1));
|
|
ASSERT_TRUE(ipc::evt_close(*evt2));
|
|
ASSERT_TRUE(ipc::evt_close(*evt3));
|
|
ASSERT_EQ(success, 1);
|
|
}
|