xref: /btstack/test/gap/hci_test.cpp (revision d3762d1522654aa68b34234382bdbff5b8407d29)
1*d3762d15SMatthias Ringwald #include <stdint.h>
2*d3762d15SMatthias Ringwald #include <stdio.h>
3*d3762d15SMatthias Ringwald #include <stdlib.h>
4*d3762d15SMatthias Ringwald #include <string.h>
5*d3762d15SMatthias Ringwald 
6*d3762d15SMatthias Ringwald #include "CppUTest/TestHarness.h"
7*d3762d15SMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
8*d3762d15SMatthias Ringwald #include "CppUTestExt/MockSupport.h"
9*d3762d15SMatthias Ringwald 
10*d3762d15SMatthias Ringwald #include "hci_cmd.h"
11*d3762d15SMatthias Ringwald 
12*d3762d15SMatthias Ringwald #include "btstack_memory.h"
13*d3762d15SMatthias Ringwald #include "hci.h"
14*d3762d15SMatthias Ringwald #include "ble/gatt_client.h"
15*d3762d15SMatthias Ringwald #include "btstack_event.h"
16*d3762d15SMatthias Ringwald #include "hci_dump.h"
17*d3762d15SMatthias Ringwald #include "hci_dump_posix_fs.h"
18*d3762d15SMatthias Ringwald #include "btstack_debug.h"
19*d3762d15SMatthias Ringwald 
20*d3762d15SMatthias Ringwald typedef struct {
21*d3762d15SMatthias Ringwald     uint8_t type;
22*d3762d15SMatthias Ringwald     uint16_t size;
23*d3762d15SMatthias Ringwald     uint8_t  buffer[258];
24*d3762d15SMatthias Ringwald } hci_packet_t;
25*d3762d15SMatthias Ringwald 
26*d3762d15SMatthias Ringwald #define MAX_HCI_PACKETS 10
27*d3762d15SMatthias Ringwald static uint16_t transport_count_packets;
28*d3762d15SMatthias Ringwald static hci_packet_t transport_packets[MAX_HCI_PACKETS];
29*d3762d15SMatthias Ringwald 
30*d3762d15SMatthias Ringwald static  void (*packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size);
31*d3762d15SMatthias Ringwald 
32*d3762d15SMatthias Ringwald static const uint8_t packet_sent_event[] = { HCI_EVENT_TRANSPORT_PACKET_SENT, 0};
33*d3762d15SMatthias Ringwald 
34*d3762d15SMatthias Ringwald static int hci_transport_test_set_baudrate(uint32_t baudrate){
35*d3762d15SMatthias Ringwald     return 0;
36*d3762d15SMatthias Ringwald }
37*d3762d15SMatthias Ringwald 
38*d3762d15SMatthias Ringwald static int hci_transport_test_can_send_now(uint8_t packet_type){
39*d3762d15SMatthias Ringwald     return 1;
40*d3762d15SMatthias Ringwald }
41*d3762d15SMatthias Ringwald 
42*d3762d15SMatthias Ringwald static int hci_transport_test_send_packet(uint8_t packet_type, uint8_t * packet, int size){
43*d3762d15SMatthias Ringwald     btstack_assert(transport_count_packets < MAX_HCI_PACKETS);
44*d3762d15SMatthias Ringwald     memcpy(transport_packets[transport_count_packets].buffer, packet, size);
45*d3762d15SMatthias Ringwald     transport_packets[transport_count_packets].type = packet_type;
46*d3762d15SMatthias Ringwald     transport_packets[transport_count_packets].size = size;
47*d3762d15SMatthias Ringwald     transport_count_packets++;
48*d3762d15SMatthias Ringwald     // notify upper stack that it can send again
49*d3762d15SMatthias Ringwald     packet_handler(HCI_EVENT_PACKET, (uint8_t *) &packet_sent_event[0], sizeof(packet_sent_event));
50*d3762d15SMatthias Ringwald     return 0;
51*d3762d15SMatthias Ringwald }
52*d3762d15SMatthias Ringwald 
53*d3762d15SMatthias Ringwald static void hci_transport_test_init(const void * transport_config){
54*d3762d15SMatthias Ringwald }
55*d3762d15SMatthias Ringwald 
56*d3762d15SMatthias Ringwald static int hci_transport_test_open(void){
57*d3762d15SMatthias Ringwald     return 0;
58*d3762d15SMatthias Ringwald }
59*d3762d15SMatthias Ringwald 
60*d3762d15SMatthias Ringwald static int hci_transport_test_close(void){
61*d3762d15SMatthias Ringwald     return 0;
62*d3762d15SMatthias Ringwald }
63*d3762d15SMatthias Ringwald 
64*d3762d15SMatthias Ringwald static void hci_transport_test_register_packet_handler(void (*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size)){
65*d3762d15SMatthias Ringwald     packet_handler = handler;
66*d3762d15SMatthias Ringwald }
67*d3762d15SMatthias Ringwald 
68*d3762d15SMatthias Ringwald static const hci_transport_t hci_transport_test = {
69*d3762d15SMatthias Ringwald         /* const char * name; */                                        "TEST",
70*d3762d15SMatthias Ringwald         /* void   (*init) (const void *transport_config); */            &hci_transport_test_init,
71*d3762d15SMatthias Ringwald         /* int    (*open)(void); */                                     &hci_transport_test_open,
72*d3762d15SMatthias Ringwald         /* int    (*close)(void); */                                    &hci_transport_test_close,
73*d3762d15SMatthias Ringwald         /* void   (*register_packet_handler)(void (*handler)(...); */   &hci_transport_test_register_packet_handler,
74*d3762d15SMatthias Ringwald         /* int    (*can_send_packet_now)(uint8_t packet_type); */       &hci_transport_test_can_send_now,
75*d3762d15SMatthias Ringwald         /* int    (*send_packet)(...); */                               &hci_transport_test_send_packet,
76*d3762d15SMatthias Ringwald         /* int    (*set_baudrate)(uint32_t baudrate); */                &hci_transport_test_set_baudrate,
77*d3762d15SMatthias Ringwald         /* void   (*reset_link)(void); */                               NULL,
78*d3762d15SMatthias Ringwald         /* void   (*set_sco_config)(uint16_t voice_setting, int num_connections); */ NULL,
79*d3762d15SMatthias Ringwald };
80*d3762d15SMatthias Ringwald 
81*d3762d15SMatthias Ringwald static uint16_t next_hci_packet;
82*d3762d15SMatthias Ringwald 
83*d3762d15SMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){
84*d3762d15SMatthias Ringwald     for (int i=0; i<size; i++){
85*d3762d15SMatthias Ringwald         BYTES_EQUAL(expected[i], actual[i]);
86*d3762d15SMatthias Ringwald     }
87*d3762d15SMatthias Ringwald }
88*d3762d15SMatthias Ringwald 
89*d3762d15SMatthias Ringwald void CHECK_HCI_COMMAND(const hci_cmd_t * expected_hci_command){
90*d3762d15SMatthias Ringwald     uint16_t actual_opcode = little_endian_read_16(transport_packets[next_hci_packet].buffer, 0);
91*d3762d15SMatthias Ringwald     next_hci_packet++;
92*d3762d15SMatthias Ringwald     CHECK_EQUAL(expected_hci_command->opcode, actual_opcode);
93*d3762d15SMatthias Ringwald }
94*d3762d15SMatthias Ringwald 
95*d3762d15SMatthias Ringwald TEST_GROUP(HCI){
96*d3762d15SMatthias Ringwald         void setup(void){
97*d3762d15SMatthias Ringwald             transport_count_packets = 0;
98*d3762d15SMatthias Ringwald             next_hci_packet = 0;
99*d3762d15SMatthias Ringwald             hci_init(&hci_transport_test, NULL);
100*d3762d15SMatthias Ringwald             hci_simulate_working_fuzz();
101*d3762d15SMatthias Ringwald             hci_setup_test_connections_fuzz();
102*d3762d15SMatthias Ringwald             // register for HCI events
103*d3762d15SMatthias Ringwald             mock().expectOneCall("hci_can_send_packet_now_using_packet_buffer").andReturnValue(1);
104*d3762d15SMatthias Ringwald         }
105*d3762d15SMatthias Ringwald         void teardown(void){
106*d3762d15SMatthias Ringwald             mock().clear();
107*d3762d15SMatthias Ringwald         }
108*d3762d15SMatthias Ringwald };
109*d3762d15SMatthias Ringwald 
110*d3762d15SMatthias Ringwald TEST(HCI, GetSetConnectionRange){
111*d3762d15SMatthias Ringwald     le_connection_parameter_range_t range;
112*d3762d15SMatthias Ringwald     gap_get_connection_parameter_range(&range);
113*d3762d15SMatthias Ringwald     gap_set_connection_parameter_range(&range);
114*d3762d15SMatthias Ringwald }
115*d3762d15SMatthias Ringwald 
116*d3762d15SMatthias Ringwald TEST(HCI, ConnectionRangeValid){
117*d3762d15SMatthias Ringwald     le_connection_parameter_range_t range = {
118*d3762d15SMatthias Ringwald             1, 10,
119*d3762d15SMatthias Ringwald             1, 10,
120*d3762d15SMatthias Ringwald             1,10
121*d3762d15SMatthias Ringwald     };
122*d3762d15SMatthias Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 0, 0, 0, 0));
123*d3762d15SMatthias Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 0, 0, 0));
124*d3762d15SMatthias Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 0, 0));
125*d3762d15SMatthias Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 10, 0));
126*d3762d15SMatthias Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 5, 0));
127*d3762d15SMatthias Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 5, 11));
128*d3762d15SMatthias Ringwald     CHECK_EQUAL( 1, gap_connection_parameter_range_included(&range, 2, 9, 5, 5));
129*d3762d15SMatthias Ringwald }
130*d3762d15SMatthias Ringwald 
131*d3762d15SMatthias Ringwald TEST(HCI, NumPeripherals){
132*d3762d15SMatthias Ringwald     gap_set_max_number_peripheral_connections(1);
133*d3762d15SMatthias Ringwald }
134*d3762d15SMatthias Ringwald 
135*d3762d15SMatthias Ringwald TEST(HCI, MaxAclLen){
136*d3762d15SMatthias Ringwald     hci_max_acl_data_packet_length();
137*d3762d15SMatthias Ringwald }
138*d3762d15SMatthias Ringwald 
139*d3762d15SMatthias Ringwald TEST(HCI, Flushable){
140*d3762d15SMatthias Ringwald     hci_non_flushable_packet_boundary_flag_supported();
141*d3762d15SMatthias Ringwald }
142*d3762d15SMatthias Ringwald 
143*d3762d15SMatthias Ringwald TEST(HCI, DoubleReserve){
144*d3762d15SMatthias Ringwald     CHECK_TRUE(hci_reserve_packet_buffer());
145*d3762d15SMatthias Ringwald     CHECK_FALSE(hci_reserve_packet_buffer());
146*d3762d15SMatthias Ringwald }
147*d3762d15SMatthias Ringwald 
148*d3762d15SMatthias Ringwald TEST(HCI, RemovePacketHandler){
149*d3762d15SMatthias Ringwald     hci_remove_event_handler(NULL);
150*d3762d15SMatthias Ringwald }
151*d3762d15SMatthias Ringwald 
152*d3762d15SMatthias Ringwald static void dummy_fn(const void * config){};
153*d3762d15SMatthias Ringwald TEST(HCI, SetChipset){
154*d3762d15SMatthias Ringwald     hci_set_chipset(NULL);
155*d3762d15SMatthias Ringwald     btstack_chipset_t chipset_driver = { 0 };
156*d3762d15SMatthias Ringwald     hci_set_chipset(NULL);
157*d3762d15SMatthias Ringwald     chipset_driver.init = dummy_fn;
158*d3762d15SMatthias Ringwald }
159*d3762d15SMatthias Ringwald 
160*d3762d15SMatthias Ringwald TEST(HCI, SetControl){
161*d3762d15SMatthias Ringwald     btstack_control_t hardware_control = { .init = &dummy_fn};
162*d3762d15SMatthias Ringwald     hci_set_control(&hardware_control);
163*d3762d15SMatthias Ringwald }
164*d3762d15SMatthias Ringwald 
165*d3762d15SMatthias Ringwald //TEST(HCI, Close){
166*d3762d15SMatthias Ringwald //    hci_close();
167*d3762d15SMatthias Ringwald //}
168*d3762d15SMatthias Ringwald 
169*d3762d15SMatthias Ringwald TEST(HCI, SetPublicAddress){
170*d3762d15SMatthias Ringwald     bd_addr_t addr = { 0 };
171*d3762d15SMatthias Ringwald     hci_set_bd_addr(addr);
172*d3762d15SMatthias Ringwald }
173*d3762d15SMatthias Ringwald 
174*d3762d15SMatthias Ringwald TEST(HCI, DisconnectSecurityBlock){
175*d3762d15SMatthias Ringwald     hci_disconnect_security_block(HCI_CON_HANDLE_INVALID);
176*d3762d15SMatthias Ringwald     hci_disconnect_security_block(3);
177*d3762d15SMatthias Ringwald }
178*d3762d15SMatthias Ringwald 
179*d3762d15SMatthias Ringwald TEST(HCI, SetDuplicateFilter){
180*d3762d15SMatthias Ringwald     gap_set_scan_duplicate_filter(true);
181*d3762d15SMatthias Ringwald }
182*d3762d15SMatthias Ringwald 
183*d3762d15SMatthias Ringwald TEST(HCI, ConnectCancel){
184*d3762d15SMatthias Ringwald     gap_connect_cancel();
185*d3762d15SMatthias Ringwald }
186*d3762d15SMatthias Ringwald 
187*d3762d15SMatthias Ringwald TEST(HCI, SetGapConnParams){
188*d3762d15SMatthias Ringwald     gap_set_connection_parameters(0, 0, 0, 0, 0, 0, 0, 0);
189*d3762d15SMatthias Ringwald }
190*d3762d15SMatthias Ringwald 
191*d3762d15SMatthias Ringwald TEST(HCI, UpdateConnParams){
192*d3762d15SMatthias Ringwald     gap_update_connection_parameters(HCI_CON_HANDLE_INVALID, 0, 0, 0, 0);
193*d3762d15SMatthias Ringwald     gap_update_connection_parameters(5, 0, 0, 0, 0);
194*d3762d15SMatthias Ringwald }
195*d3762d15SMatthias Ringwald 
196*d3762d15SMatthias Ringwald TEST(HCI, RequestConnParamUpdate){
197*d3762d15SMatthias Ringwald     gap_request_connection_parameter_update(HCI_CON_HANDLE_INVALID, 0, 0, 0, 0);
198*d3762d15SMatthias Ringwald     gap_request_connection_parameter_update(5, 0, 0, 0, 0);
199*d3762d15SMatthias Ringwald }
200*d3762d15SMatthias Ringwald 
201*d3762d15SMatthias Ringwald TEST(HCI, SetScanResponse){
202*d3762d15SMatthias Ringwald     gap_scan_response_set_data(0, NULL);
203*d3762d15SMatthias Ringwald }
204*d3762d15SMatthias Ringwald 
205*d3762d15SMatthias Ringwald TEST(HCI, SetAddrType){
206*d3762d15SMatthias Ringwald     hci_le_set_own_address_type(0);
207*d3762d15SMatthias Ringwald     hci_le_set_own_address_type(1);
208*d3762d15SMatthias Ringwald }
209*d3762d15SMatthias Ringwald 
210*d3762d15SMatthias Ringwald TEST(HCI, AdvEnable){
211*d3762d15SMatthias Ringwald     gap_advertisements_enable(0);
212*d3762d15SMatthias Ringwald     gap_advertisements_enable(1);
213*d3762d15SMatthias Ringwald }
214*d3762d15SMatthias Ringwald 
215*d3762d15SMatthias Ringwald TEST(HCI, SetRandomAddr){
216*d3762d15SMatthias Ringwald     bd_addr_t addr = { 0 };
217*d3762d15SMatthias Ringwald     hci_le_random_address_set(addr);
218*d3762d15SMatthias Ringwald }
219*d3762d15SMatthias Ringwald 
220*d3762d15SMatthias Ringwald TEST(HCI, Disconnect){
221*d3762d15SMatthias Ringwald     gap_disconnect(HCI_CON_HANDLE_INVALID);
222*d3762d15SMatthias Ringwald     gap_disconnect(5);
223*d3762d15SMatthias Ringwald }
224*d3762d15SMatthias Ringwald 
225*d3762d15SMatthias Ringwald TEST(HCI, GetRole){
226*d3762d15SMatthias Ringwald     gap_get_role(HCI_CON_HANDLE_INVALID);
227*d3762d15SMatthias Ringwald     gap_get_role(5);
228*d3762d15SMatthias Ringwald }
229*d3762d15SMatthias Ringwald 
230*d3762d15SMatthias Ringwald int main (int argc, const char * argv[]){
231*d3762d15SMatthias Ringwald     return CommandLineTestRunner::RunAllTests(argc, argv);
232*d3762d15SMatthias Ringwald }
233