1 #include <gtest/gtest.h>
3 #include <sys/eventfd.h>
7 #include "AllocationTestHarness.h"
10 #include "osi/include/reactor.h"
13 class ReactorTest : public AllocationTestHarness {};
15 static pthread_t thread;
16 static volatile bool thread_running;
18 static void *reactor_thread(void *ptr) {
19 reactor_t *reactor = (reactor_t *)ptr;
21 thread_running = true;
22 reactor_start(reactor);
23 thread_running = false;
28 static void spawn_reactor_thread(reactor_t *reactor) {
29 int ret = pthread_create(&thread, NULL, reactor_thread, reactor);
33 static void join_reactor_thread() {
34 pthread_join(thread, NULL);
37 TEST_F(ReactorTest, reactor_new) {
38 reactor_t *reactor = reactor_new();
39 EXPECT_TRUE(reactor != NULL);
40 reactor_free(reactor);
43 TEST_F(ReactorTest, reactor_free_null) {
47 TEST_F(ReactorTest, reactor_stop_start) {
48 reactor_t *reactor = reactor_new();
49 reactor_stop(reactor);
50 reactor_start(reactor);
51 reactor_free(reactor);
54 TEST_F(ReactorTest, reactor_repeated_stop_start) {
55 reactor_t *reactor = reactor_new();
56 for (int i = 0; i < 10; ++i) {
57 reactor_stop(reactor);
58 reactor_start(reactor);
60 reactor_free(reactor);
63 TEST_F(ReactorTest, reactor_start_wait_stop) {
64 reactor_t *reactor = reactor_new();
66 spawn_reactor_thread(reactor);
68 EXPECT_TRUE(thread_running);
70 reactor_stop(reactor);
71 join_reactor_thread();
72 EXPECT_FALSE(thread_running);
74 reactor_free(reactor);
79 reactor_object_t *object;
82 static void unregister_cb(void *context) {
83 unregister_arg_t *arg = (unregister_arg_t *)context;
84 reactor_unregister(arg->object);
85 reactor_stop(arg->reactor);
88 TEST_F(ReactorTest, reactor_unregister_from_callback) {
89 reactor_t *reactor = reactor_new();
91 int fd = eventfd(0, 0);
93 arg.reactor = reactor;
94 arg.object = reactor_register(reactor, fd, &arg, unregister_cb, NULL);
95 spawn_reactor_thread(reactor);
98 join_reactor_thread();
101 reactor_free(reactor);
104 TEST_F(ReactorTest, reactor_unregister_from_separate_thread) {
105 reactor_t *reactor = reactor_new();
107 int fd = eventfd(0, 0);
109 reactor_object_t *object = reactor_register(reactor, fd, NULL, NULL, NULL);
110 spawn_reactor_thread(reactor);
112 reactor_unregister(object);
114 reactor_stop(reactor);
115 join_reactor_thread();
118 reactor_free(reactor);