blob: ce0046855c306cd2caa1e172f936739b2e511667 [file] [log] [blame]
Sharvil Nanavati19084c62014-06-23 16:30:46 -07001#include <gtest/gtest.h>
2#include <pthread.h>
3#include <sys/time.h>
4#include <unistd.h>
5
6extern "C" {
7#include "reactor.h"
8}
9
10static pthread_t thread;
11static volatile bool thread_running;
12
13static void *reactor_thread(void *ptr) {
14 reactor_t *reactor = (reactor_t *)ptr;
15
16 thread_running = true;
17 reactor_start(reactor);
18 thread_running = false;
19
20 return NULL;
21}
22
23static void spawn_reactor_thread(reactor_t *reactor) {
24 int ret = pthread_create(&thread, NULL, reactor_thread, reactor);
25 EXPECT_EQ(ret, 0);
26}
27
28static void join_reactor_thread() {
29 pthread_join(thread, NULL);
30}
31
32static uint64_t get_timestamp(void) {
33 struct timeval tv;
34 gettimeofday(&tv, NULL);
35 return tv.tv_sec * 1000 + tv.tv_usec / 1000;
36}
37
38TEST(ReactorTest, reactor_new) {
39 reactor_t *reactor = reactor_new();
40 EXPECT_TRUE(reactor != NULL);
41 reactor_free(reactor);
42}
43
44TEST(ReactorTest, reactor_free_null) {
45 reactor_free(NULL);
46}
47
48TEST(ReactorTest, reactor_stop_start) {
49 reactor_t *reactor = reactor_new();
50 reactor_stop(reactor);
51 reactor_start(reactor);
52 reactor_free(reactor);
53}
54
55TEST(ReactorTest, reactor_repeated_stop_start) {
56 reactor_t *reactor = reactor_new();
57 for (int i = 0; i < 10; ++i) {
58 reactor_stop(reactor);
59 reactor_start(reactor);
60 }
61 reactor_free(reactor);
62}
63
64TEST(ReactorTest, reactor_multi_stop_start) {
65 reactor_t *reactor = reactor_new();
66
67 reactor_stop(reactor);
68 reactor_stop(reactor);
69 reactor_stop(reactor);
70
71 reactor_start(reactor);
72 reactor_start(reactor);
73 reactor_start(reactor);
74
75 reactor_free(reactor);
76}
77
78TEST(ReactorTest, reactor_start_wait_stop) {
79 reactor_t *reactor = reactor_new();
80
81 spawn_reactor_thread(reactor);
Sharvil Nanavati405b5c92016-06-17 14:15:46 -070082 TEMP_FAILURE_RETRY(usleep(50 * 1000));
Sharvil Nanavati19084c62014-06-23 16:30:46 -070083 EXPECT_TRUE(thread_running);
84
85 reactor_stop(reactor);
86 join_reactor_thread();
87 EXPECT_FALSE(thread_running);
88
89 reactor_free(reactor);
90}
91
92TEST(ReactorTest, reactor_run_once_timeout) {
93 reactor_t *reactor = reactor_new();
94
95 uint64_t start = get_timestamp();
96 reactor_status_t status = reactor_run_once_timeout(reactor, 50);
Narayan Kamath6c039542014-07-03 11:48:20 +010097 EXPECT_GE(get_timestamp() - start, static_cast<uint64_t>(50));
Sharvil Nanavati19084c62014-06-23 16:30:46 -070098 EXPECT_EQ(status, REACTOR_STATUS_TIMEOUT);
99
100 reactor_free(reactor);
101}