1*4902524cSMatthias Ringwald #include "CppUTest/TestHarness.h"
2*4902524cSMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
3*4902524cSMatthias Ringwald
4*4902524cSMatthias Ringwald #include "btstack_run_loop.h"
5*4902524cSMatthias Ringwald #include "btstack_memory.h"
6*4902524cSMatthias Ringwald
7*4902524cSMatthias Ringwald #define HEARTBEAT_PERIOD_MS 1000
8*4902524cSMatthias Ringwald
9*4902524cSMatthias Ringwald static btstack_timer_source_t timer_1;
10*4902524cSMatthias Ringwald static btstack_timer_source_t timer_2;
11*4902524cSMatthias Ringwald static btstack_data_source_t data_source;
12*4902524cSMatthias Ringwald static bool data_source_called;
13*4902524cSMatthias Ringwald static bool timer_called;
14*4902524cSMatthias Ringwald
heartbeat_timeout_handler(btstack_timer_source_t * ts)15*4902524cSMatthias Ringwald static void heartbeat_timeout_handler(btstack_timer_source_t * ts){
16*4902524cSMatthias Ringwald UNUSED(ts);
17*4902524cSMatthias Ringwald timer_called = true;
18*4902524cSMatthias Ringwald }
data_source_handler(btstack_data_source_t * ds,btstack_data_source_callback_type_t callback_type)19*4902524cSMatthias Ringwald static void data_source_handler(btstack_data_source_t * ds, btstack_data_source_callback_type_t callback_type){
20*4902524cSMatthias Ringwald UNUSED(ds);
21*4902524cSMatthias Ringwald UNUSED(callback_type);
22*4902524cSMatthias Ringwald data_source_called = true;
23*4902524cSMatthias Ringwald }
24*4902524cSMatthias Ringwald
TEST_GROUP(RunLoopBase)25*4902524cSMatthias Ringwald TEST_GROUP(RunLoopBase){
26*4902524cSMatthias Ringwald void setup(void){
27*4902524cSMatthias Ringwald btstack_memory_init();
28*4902524cSMatthias Ringwald btstack_run_loop_base_init();
29*4902524cSMatthias Ringwald data_source_called = false;
30*4902524cSMatthias Ringwald timer_called = false;
31*4902524cSMatthias Ringwald }
32*4902524cSMatthias Ringwald void teardown(void){
33*4902524cSMatthias Ringwald btstack_memory_deinit();
34*4902524cSMatthias Ringwald }
35*4902524cSMatthias Ringwald };
36*4902524cSMatthias Ringwald
TEST(RunLoopBase,DataSource)37*4902524cSMatthias Ringwald TEST(RunLoopBase, DataSource){
38*4902524cSMatthias Ringwald btstack_run_loop_set_data_source_handler(&data_source, &data_source_handler);
39*4902524cSMatthias Ringwald btstack_run_loop_base_enable_data_source_callbacks(&data_source, DATA_SOURCE_CALLBACK_POLL);
40*4902524cSMatthias Ringwald btstack_run_loop_base_add_data_source(&data_source);
41*4902524cSMatthias Ringwald btstack_run_loop_base_disable_data_source_callbacks(&data_source, DATA_SOURCE_CALLBACK_POLL);
42*4902524cSMatthias Ringwald btstack_run_loop_base_remove_data_source(&data_source);
43*4902524cSMatthias Ringwald }
44*4902524cSMatthias Ringwald
TEST(RunLoopBase,Timer)45*4902524cSMatthias Ringwald TEST(RunLoopBase,Timer){
46*4902524cSMatthias Ringwald const uint32_t timeout_1 = 7;
47*4902524cSMatthias Ringwald const uint32_t timeout_2 = 10;
48*4902524cSMatthias Ringwald const uint32_t now_1 = 5;
49*4902524cSMatthias Ringwald const uint32_t now_2 = 11;
50*4902524cSMatthias Ringwald const uint32_t now_3 = 33;
51*4902524cSMatthias Ringwald
52*4902524cSMatthias Ringwald btstack_run_loop_set_timer_handler(&timer_1, heartbeat_timeout_handler);
53*4902524cSMatthias Ringwald timer_1.timeout = timeout_1;
54*4902524cSMatthias Ringwald
55*4902524cSMatthias Ringwald btstack_run_loop_set_timer_handler(&timer_2, heartbeat_timeout_handler);
56*4902524cSMatthias Ringwald timer_2.timeout = timeout_2;
57*4902524cSMatthias Ringwald
58*4902524cSMatthias Ringwald // test add/remove
59*4902524cSMatthias Ringwald
60*4902524cSMatthias Ringwald // add timer 2
61*4902524cSMatthias Ringwald btstack_run_loop_base_add_timer(&timer_2);
62*4902524cSMatthias Ringwald CHECK(btstack_run_loop_base_timers != NULL);
63*4902524cSMatthias Ringwald // remove timer
64*4902524cSMatthias Ringwald btstack_run_loop_base_remove_timer(&timer_2);
65*4902524cSMatthias Ringwald CHECK(btstack_run_loop_base_timers == NULL);
66*4902524cSMatthias Ringwald
67*4902524cSMatthias Ringwald // add timer 2
68*4902524cSMatthias Ringwald btstack_run_loop_base_add_timer(&timer_2);
69*4902524cSMatthias Ringwald // add timer 1
70*4902524cSMatthias Ringwald btstack_run_loop_base_add_timer(&timer_1);
71*4902524cSMatthias Ringwald // dump timers
72*4902524cSMatthias Ringwald btstack_run_loop_base_dump_timer();
73*4902524cSMatthias Ringwald // process timers for now_1
74*4902524cSMatthias Ringwald btstack_run_loop_base_process_timers(now_1);
75*4902524cSMatthias Ringwald CHECK(timer_called == false);
76*4902524cSMatthias Ringwald CHECK(btstack_run_loop_base_timers != NULL);
77*4902524cSMatthias Ringwald // get next timeout
78*4902524cSMatthias Ringwald int next_timeout = btstack_run_loop_base_get_time_until_timeout(now_1);
79*4902524cSMatthias Ringwald CHECK(next_timeout == (timeout_1 - now_1));
80*4902524cSMatthias Ringwald // get next timeout in future - timeout should be 0 = now
81*4902524cSMatthias Ringwald next_timeout = btstack_run_loop_base_get_time_until_timeout(now_3);
82*4902524cSMatthias Ringwald CHECK(next_timeout == 0);
83*4902524cSMatthias Ringwald // process timers for now_2
84*4902524cSMatthias Ringwald btstack_run_loop_base_process_timers(now_2);
85*4902524cSMatthias Ringwald CHECK(timer_called == true);
86*4902524cSMatthias Ringwald CHECK(btstack_run_loop_base_timers == NULL);
87*4902524cSMatthias Ringwald // get next timeout
88*4902524cSMatthias Ringwald next_timeout = btstack_run_loop_base_get_time_until_timeout(now_2);
89*4902524cSMatthias Ringwald CHECK(next_timeout == -1);
90*4902524cSMatthias Ringwald }
91*4902524cSMatthias Ringwald
TEST(RunLoopBase,Overrun)92*4902524cSMatthias Ringwald TEST(RunLoopBase, Overrun){
93*4902524cSMatthias Ringwald const uint32_t t1 = 0xfffffff0UL; // -16
94*4902524cSMatthias Ringwald const uint32_t t2 = 0xfffffff8UL; // -8
95*4902524cSMatthias Ringwald const uint32_t t3 = 50UL;
96*4902524cSMatthias Ringwald int next_timeout;
97*4902524cSMatthias Ringwald
98*4902524cSMatthias Ringwald btstack_run_loop_set_timer_handler(&timer_1, heartbeat_timeout_handler);
99*4902524cSMatthias Ringwald timer_1.timeout = t1 + 20; // overrun
100*4902524cSMatthias Ringwald // add timer
101*4902524cSMatthias Ringwald btstack_run_loop_base_add_timer(&timer_1);
102*4902524cSMatthias Ringwald // verify timeout until correct
103*4902524cSMatthias Ringwald next_timeout = btstack_run_loop_base_get_time_until_timeout(t1);
104*4902524cSMatthias Ringwald CHECK(next_timeout == 20);
105*4902524cSMatthias Ringwald // process timers for t2
106*4902524cSMatthias Ringwald btstack_run_loop_base_process_timers(t2);
107*4902524cSMatthias Ringwald CHECK(timer_called == false);
108*4902524cSMatthias Ringwald // process timers for t3
109*4902524cSMatthias Ringwald btstack_run_loop_base_process_timers(t3);
110*4902524cSMatthias Ringwald CHECK(timer_called == true);
111*4902524cSMatthias Ringwald }
112*4902524cSMatthias Ringwald
main(int argc,const char * argv[])113*4902524cSMatthias Ringwald int main (int argc, const char * argv[]){
114*4902524cSMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv);
115*4902524cSMatthias Ringwald }
116