blob: 73a6ae07be541433d6980c86de192b3a5953f6bc [file] [log] [blame]
Sharvil Nanavati19084c62014-06-23 16:30:46 -07001#include <gtest/gtest.h>
2#include <pthread.h>
Sharvil Nanavatifbf89082014-08-13 00:40:49 -07003#include <sys/eventfd.h>
Sharvil Nanavati19084c62014-06-23 16:30:46 -07004#include <sys/time.h>
5#include <unistd.h>
6
Zach Johnson384f8a92014-08-25 23:22:24 -07007#include "AllocationTestHarness.h"
8
Sharvil Nanavati19084c62014-06-23 16:30:46 -07009extern "C" {
10#include "reactor.h"
11}
12
Zach Johnson384f8a92014-08-25 23:22:24 -070013class ReactorTest : public AllocationTestHarness {};
14
Sharvil Nanavati19084c62014-06-23 16:30:46 -070015static pthread_t thread;
16static volatile bool thread_running;
17
18static void *reactor_thread(void *ptr) {
19 reactor_t *reactor = (reactor_t *)ptr;
20
21 thread_running = true;
22 reactor_start(reactor);
23 thread_running = false;
24
25 return NULL;
26}
27
28static void spawn_reactor_thread(reactor_t *reactor) {
29 int ret = pthread_create(&thread, NULL, reactor_thread, reactor);
30 EXPECT_EQ(ret, 0);
31}
32
33static void join_reactor_thread() {
34 pthread_join(thread, NULL);
35}
36
Zach Johnson384f8a92014-08-25 23:22:24 -070037TEST_F(ReactorTest, reactor_new) {
Sharvil Nanavati19084c62014-06-23 16:30:46 -070038 reactor_t *reactor = reactor_new();
39 EXPECT_TRUE(reactor != NULL);
40 reactor_free(reactor);
41}
42
Zach Johnson384f8a92014-08-25 23:22:24 -070043TEST_F(ReactorTest, reactor_free_null) {
Sharvil Nanavati19084c62014-06-23 16:30:46 -070044 reactor_free(NULL);
45}
46
Zach Johnson384f8a92014-08-25 23:22:24 -070047TEST_F(ReactorTest, reactor_stop_start) {
Sharvil Nanavati19084c62014-06-23 16:30:46 -070048 reactor_t *reactor = reactor_new();
49 reactor_stop(reactor);
50 reactor_start(reactor);
51 reactor_free(reactor);
52}
53
Zach Johnson384f8a92014-08-25 23:22:24 -070054TEST_F(ReactorTest, reactor_repeated_stop_start) {
Sharvil Nanavati19084c62014-06-23 16:30:46 -070055 reactor_t *reactor = reactor_new();
56 for (int i = 0; i < 10; ++i) {
57 reactor_stop(reactor);
58 reactor_start(reactor);
59 }
60 reactor_free(reactor);
61}
62
Zach Johnson384f8a92014-08-25 23:22:24 -070063TEST_F(ReactorTest, reactor_start_wait_stop) {
Sharvil Nanavati19084c62014-06-23 16:30:46 -070064 reactor_t *reactor = reactor_new();
65
66 spawn_reactor_thread(reactor);
Sharvil Nanavatiae973d52016-06-20 19:16:12 -070067 TEMP_FAILURE_RETRY(usleep(50 * 1000));
Sharvil Nanavati19084c62014-06-23 16:30:46 -070068 EXPECT_TRUE(thread_running);
69
70 reactor_stop(reactor);
71 join_reactor_thread();
72 EXPECT_FALSE(thread_running);
73
74 reactor_free(reactor);
75}
76
Sharvil Nanavatifbf89082014-08-13 00:40:49 -070077typedef struct {
78 reactor_t *reactor;
79 reactor_object_t *object;
80} unregister_arg_t;
81
82static void unregister_cb(void *context) {
83 unregister_arg_t *arg = (unregister_arg_t *)context;
84 reactor_unregister(arg->object);
85 reactor_stop(arg->reactor);
86}
87
Zach Johnson384f8a92014-08-25 23:22:24 -070088TEST_F(ReactorTest, reactor_unregister_from_callback) {
Sharvil Nanavati19084c62014-06-23 16:30:46 -070089 reactor_t *reactor = reactor_new();
90
Sharvil Nanavatifbf89082014-08-13 00:40:49 -070091 int fd = eventfd(0, 0);
92 unregister_arg_t arg;
93 arg.reactor = reactor;
94 arg.object = reactor_register(reactor, fd, &arg, unregister_cb, NULL);
95 spawn_reactor_thread(reactor);
96 eventfd_write(fd, 1);
Sharvil Nanavati19084c62014-06-23 16:30:46 -070097
Sharvil Nanavatifbf89082014-08-13 00:40:49 -070098 join_reactor_thread();
99
100 close(fd);
101 reactor_free(reactor);
102}
103
Zach Johnson384f8a92014-08-25 23:22:24 -0700104TEST_F(ReactorTest, reactor_unregister_from_separate_thread) {
Sharvil Nanavatifbf89082014-08-13 00:40:49 -0700105 reactor_t *reactor = reactor_new();
106
107 int fd = eventfd(0, 0);
108
109 reactor_object_t *object = reactor_register(reactor, fd, NULL, NULL, NULL);
110 spawn_reactor_thread(reactor);
Sharvil Nanavatiae973d52016-06-20 19:16:12 -0700111 TEMP_FAILURE_RETRY(usleep(50 * 1000));
Sharvil Nanavatifbf89082014-08-13 00:40:49 -0700112 reactor_unregister(object);
113
114 reactor_stop(reactor);
115 join_reactor_thread();
116
117 close(fd);
Sharvil Nanavati19084c62014-06-23 16:30:46 -0700118 reactor_free(reactor);
119}