xref: /btstack/test/embedded/run_loop_base_test.cpp (revision 4902524cc6a45a01cfead054f48b6584dbb1f1cc)
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