xref: /btstack/test/gap/hci_test.cpp (revision 28739e5f5d48d67aa332bdb9a67aaa26d8d43e2c)
1d3762d15SMatthias Ringwald #include <stdint.h>
2d3762d15SMatthias Ringwald #include <stdio.h>
3d3762d15SMatthias Ringwald #include <stdlib.h>
4d3762d15SMatthias Ringwald #include <string.h>
5d3762d15SMatthias Ringwald 
6d3762d15SMatthias Ringwald #include "CppUTest/TestHarness.h"
7d3762d15SMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
8d3762d15SMatthias Ringwald #include "CppUTestExt/MockSupport.h"
9d3762d15SMatthias Ringwald 
10d3762d15SMatthias Ringwald #include "hci_cmd.h"
11d3762d15SMatthias Ringwald 
12d3762d15SMatthias Ringwald #include "btstack_memory.h"
13d3762d15SMatthias Ringwald #include "hci.h"
14d3762d15SMatthias Ringwald #include "ble/gatt_client.h"
15d3762d15SMatthias Ringwald #include "btstack_event.h"
16d3762d15SMatthias Ringwald #include "hci_dump.h"
17d3762d15SMatthias Ringwald #include "hci_dump_posix_fs.h"
18d3762d15SMatthias Ringwald #include "btstack_debug.h"
19fcebe167SMilanka Ringwald #include "btstack_util.h"
20fcebe167SMilanka Ringwald #include "btstack_run_loop_posix.h"
21d3762d15SMatthias Ringwald 
22d3762d15SMatthias Ringwald typedef struct {
23d3762d15SMatthias Ringwald     uint8_t type;
24d3762d15SMatthias Ringwald     uint16_t size;
25d3762d15SMatthias Ringwald     uint8_t  buffer[258];
26d3762d15SMatthias Ringwald } hci_packet_t;
27d3762d15SMatthias Ringwald 
28d3762d15SMatthias Ringwald #define MAX_HCI_PACKETS 10
29d3762d15SMatthias Ringwald static uint16_t transport_count_packets;
30d3762d15SMatthias Ringwald static hci_packet_t transport_packets[MAX_HCI_PACKETS];
31*28739e5fSMatthias Ringwald static int can_send_now = 1;
32d3762d15SMatthias Ringwald static  void (*packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size);
33d3762d15SMatthias Ringwald 
34d3762d15SMatthias Ringwald static const uint8_t packet_sent_event[] = { HCI_EVENT_TRANSPORT_PACKET_SENT, 0};
35d3762d15SMatthias Ringwald 
36d3762d15SMatthias Ringwald static int hci_transport_test_set_baudrate(uint32_t baudrate){
37d3762d15SMatthias Ringwald     return 0;
38d3762d15SMatthias Ringwald }
39d3762d15SMatthias Ringwald 
40d3762d15SMatthias Ringwald static int hci_transport_test_can_send_now(uint8_t packet_type){
41*28739e5fSMatthias Ringwald     return can_send_now;
42d3762d15SMatthias Ringwald }
43d3762d15SMatthias Ringwald 
44d3762d15SMatthias Ringwald static int hci_transport_test_send_packet(uint8_t packet_type, uint8_t * packet, int size){
45d3762d15SMatthias Ringwald     btstack_assert(transport_count_packets < MAX_HCI_PACKETS);
46d3762d15SMatthias Ringwald     memcpy(transport_packets[transport_count_packets].buffer, packet, size);
47d3762d15SMatthias Ringwald     transport_packets[transport_count_packets].type = packet_type;
48d3762d15SMatthias Ringwald     transport_packets[transport_count_packets].size = size;
49d3762d15SMatthias Ringwald     transport_count_packets++;
50d3762d15SMatthias Ringwald     // notify upper stack that it can send again
51d3762d15SMatthias Ringwald     packet_handler(HCI_EVENT_PACKET, (uint8_t *) &packet_sent_event[0], sizeof(packet_sent_event));
52d3762d15SMatthias Ringwald     return 0;
53d3762d15SMatthias Ringwald }
54d3762d15SMatthias Ringwald 
55d3762d15SMatthias Ringwald static void hci_transport_test_init(const void * transport_config){
56d3762d15SMatthias Ringwald }
57d3762d15SMatthias Ringwald 
58d3762d15SMatthias Ringwald static int hci_transport_test_open(void){
59d3762d15SMatthias Ringwald     return 0;
60d3762d15SMatthias Ringwald }
61d3762d15SMatthias Ringwald 
62d3762d15SMatthias Ringwald static int hci_transport_test_close(void){
63d3762d15SMatthias Ringwald     return 0;
64d3762d15SMatthias Ringwald }
65d3762d15SMatthias Ringwald 
66d3762d15SMatthias Ringwald static void hci_transport_test_register_packet_handler(void (*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size)){
67d3762d15SMatthias Ringwald     packet_handler = handler;
68d3762d15SMatthias Ringwald }
69d3762d15SMatthias Ringwald 
70d3762d15SMatthias Ringwald static const hci_transport_t hci_transport_test = {
71d3762d15SMatthias Ringwald         /* const char * name; */                                        "TEST",
72d3762d15SMatthias Ringwald         /* void   (*init) (const void *transport_config); */            &hci_transport_test_init,
73d3762d15SMatthias Ringwald         /* int    (*open)(void); */                                     &hci_transport_test_open,
74d3762d15SMatthias Ringwald         /* int    (*close)(void); */                                    &hci_transport_test_close,
75d3762d15SMatthias Ringwald         /* void   (*register_packet_handler)(void (*handler)(...); */   &hci_transport_test_register_packet_handler,
76d3762d15SMatthias Ringwald         /* int    (*can_send_packet_now)(uint8_t packet_type); */       &hci_transport_test_can_send_now,
77d3762d15SMatthias Ringwald         /* int    (*send_packet)(...); */                               &hci_transport_test_send_packet,
78d3762d15SMatthias Ringwald         /* int    (*set_baudrate)(uint32_t baudrate); */                &hci_transport_test_set_baudrate,
79d3762d15SMatthias Ringwald         /* void   (*reset_link)(void); */                               NULL,
80d3762d15SMatthias Ringwald         /* void   (*set_sco_config)(uint16_t voice_setting, int num_connections); */ NULL,
81d3762d15SMatthias Ringwald };
82d3762d15SMatthias Ringwald 
83d3762d15SMatthias Ringwald static uint16_t next_hci_packet;
84d3762d15SMatthias Ringwald 
85d3762d15SMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){
86d3762d15SMatthias Ringwald     for (int i=0; i<size; i++){
87d3762d15SMatthias Ringwald         BYTES_EQUAL(expected[i], actual[i]);
88d3762d15SMatthias Ringwald     }
89d3762d15SMatthias Ringwald }
90d3762d15SMatthias Ringwald 
91d3762d15SMatthias Ringwald void CHECK_HCI_COMMAND(const hci_cmd_t * expected_hci_command){
92d3762d15SMatthias Ringwald     uint16_t actual_opcode = little_endian_read_16(transport_packets[next_hci_packet].buffer, 0);
93d3762d15SMatthias Ringwald     next_hci_packet++;
94d3762d15SMatthias Ringwald     CHECK_EQUAL(expected_hci_command->opcode, actual_opcode);
95d3762d15SMatthias Ringwald }
96d3762d15SMatthias Ringwald 
97d3762d15SMatthias Ringwald TEST_GROUP(HCI){
98d3762d15SMatthias Ringwald         void setup(void){
99d3762d15SMatthias Ringwald             transport_count_packets = 0;
100*28739e5fSMatthias Ringwald             can_send_now = 1;
101d3762d15SMatthias Ringwald             next_hci_packet = 0;
102d3762d15SMatthias Ringwald             hci_init(&hci_transport_test, NULL);
103d3762d15SMatthias Ringwald             hci_simulate_working_fuzz();
104d3762d15SMatthias Ringwald             hci_setup_test_connections_fuzz();
105d3762d15SMatthias Ringwald             // register for HCI events
106d3762d15SMatthias Ringwald             mock().expectOneCall("hci_can_send_packet_now_using_packet_buffer").andReturnValue(1);
107d3762d15SMatthias Ringwald         }
108d3762d15SMatthias Ringwald         void teardown(void){
109d3762d15SMatthias Ringwald             mock().clear();
110d3762d15SMatthias Ringwald         }
111d3762d15SMatthias Ringwald };
112d3762d15SMatthias Ringwald 
113d3762d15SMatthias Ringwald TEST(HCI, GetSetConnectionRange){
114d3762d15SMatthias Ringwald     le_connection_parameter_range_t range;
115d3762d15SMatthias Ringwald     gap_get_connection_parameter_range(&range);
116d3762d15SMatthias Ringwald     gap_set_connection_parameter_range(&range);
117d3762d15SMatthias Ringwald }
118d3762d15SMatthias Ringwald 
119d3762d15SMatthias Ringwald TEST(HCI, ConnectionRangeValid){
120d3762d15SMatthias Ringwald     le_connection_parameter_range_t range = {
121fcebe167SMilanka Ringwald             .le_conn_interval_min = 1,
122fcebe167SMilanka Ringwald             .le_conn_interval_max = 10,
123fcebe167SMilanka Ringwald             .le_conn_latency_min = 1,
124fcebe167SMilanka Ringwald             .le_conn_latency_max = 10,
125fcebe167SMilanka Ringwald             .le_supervision_timeout_min = 1,
126fcebe167SMilanka Ringwald             .le_supervision_timeout_max = 10
127d3762d15SMatthias Ringwald     };
128d3762d15SMatthias Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 0, 0, 0, 0));
129fcebe167SMilanka Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 11, 0, 0));
130fcebe167SMilanka Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 11, 0));
131d3762d15SMatthias Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 0, 0, 0));
132d3762d15SMatthias Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 0, 0));
133d3762d15SMatthias Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 10, 0));
134d3762d15SMatthias Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 5, 0));
135d3762d15SMatthias Ringwald     CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 5, 11));
136d3762d15SMatthias Ringwald     CHECK_EQUAL( 1, gap_connection_parameter_range_included(&range, 2, 9, 5, 5));
137d3762d15SMatthias Ringwald }
138d3762d15SMatthias Ringwald 
139fcebe167SMilanka Ringwald TEST(HCI, other_functions){
140fcebe167SMilanka Ringwald     gap_set_scan_phys(1);
141fcebe167SMilanka Ringwald     gap_set_connection_phys(1);
142fcebe167SMilanka Ringwald     hci_enable_custom_pre_init();
143fcebe167SMilanka Ringwald     gap_whitelist_clear();
144fcebe167SMilanka Ringwald }
145fcebe167SMilanka Ringwald 
146fcebe167SMilanka Ringwald TEST(HCI, gap_whitelist_add_remove){
147fcebe167SMilanka Ringwald     bd_addr_type_t addr_type = BD_ADDR_TYPE_ACL;
148fcebe167SMilanka Ringwald     bd_addr_t addr = { 0 };
149fcebe167SMilanka Ringwald 
150fcebe167SMilanka Ringwald     uint8_t status = gap_whitelist_add(addr_type, addr);
151fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
152fcebe167SMilanka Ringwald 
153fcebe167SMilanka Ringwald     status = gap_whitelist_add(addr_type, addr);
154fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_COMMAND_DISALLOWED, status);
155fcebe167SMilanka Ringwald 
156fcebe167SMilanka Ringwald     status = gap_whitelist_remove(addr_type, addr);
157fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
158fcebe167SMilanka Ringwald 
159fcebe167SMilanka Ringwald     status = gap_whitelist_remove(addr_type, addr);
160e406aa8dSMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
161fcebe167SMilanka Ringwald 
162fcebe167SMilanka Ringwald     status = gap_whitelist_remove(BD_ADDR_TYPE_SCO, addr);
163fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
164fcebe167SMilanka Ringwald }
165fcebe167SMilanka Ringwald 
166fcebe167SMilanka Ringwald TEST(HCI, gap_connect_with_whitelist){
167fcebe167SMilanka Ringwald     uint8_t status = gap_connect_with_whitelist();
168fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
169fcebe167SMilanka Ringwald 
170*28739e5fSMatthias Ringwald     bd_addr_type_t addr_type = BD_ADDR_TYPE_LE_PUBLIC;
171*28739e5fSMatthias Ringwald     bd_addr_t addr = { 0 };
172*28739e5fSMatthias Ringwald     gap_auto_connection_start(addr_type, addr);
173*28739e5fSMatthias Ringwald 
174fcebe167SMilanka Ringwald     status = gap_connect_with_whitelist();
175fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_COMMAND_DISALLOWED, status);
176fcebe167SMilanka Ringwald }
177fcebe167SMilanka Ringwald 
178fcebe167SMilanka Ringwald TEST(HCI, gap_auto_connection_start_stop){
179fcebe167SMilanka Ringwald     bd_addr_type_t addr_type = BD_ADDR_TYPE_LE_PUBLIC;
180fcebe167SMilanka Ringwald     bd_addr_t addr = { 0 };
181fcebe167SMilanka Ringwald 
182fcebe167SMilanka Ringwald     uint8_t status = gap_auto_connection_start(addr_type, addr);
183fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
184fcebe167SMilanka Ringwald 
185fcebe167SMilanka Ringwald     status = gap_auto_connection_stop(addr_type, addr);
186fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
187fcebe167SMilanka Ringwald }
188fcebe167SMilanka Ringwald 
189fcebe167SMilanka Ringwald TEST(HCI, gap_auto_connection_stop_all){
190fcebe167SMilanka Ringwald     bd_addr_type_t addr_type = BD_ADDR_TYPE_LE_PUBLIC;
191fcebe167SMilanka Ringwald     bd_addr_t addr = { 0 };
192fcebe167SMilanka Ringwald 
193fcebe167SMilanka Ringwald     uint8_t status = gap_auto_connection_start(addr_type, addr);
194fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
195fcebe167SMilanka Ringwald 
196fcebe167SMilanka Ringwald     status = gap_auto_connection_stop_all();
197fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
198fcebe167SMilanka Ringwald }
199fcebe167SMilanka Ringwald 
200fcebe167SMilanka Ringwald TEST(HCI, gap_read_rssi){
201fcebe167SMilanka Ringwald     int status = gap_read_rssi(HCI_CON_HANDLE_INVALID);
202fcebe167SMilanka Ringwald     CHECK_EQUAL(0, status);
203fcebe167SMilanka Ringwald 
204fcebe167SMilanka Ringwald     status = gap_read_rssi(0x01);
205fcebe167SMilanka Ringwald     CHECK_EQUAL(1, status);
206fcebe167SMilanka Ringwald }
207fcebe167SMilanka Ringwald 
208fcebe167SMilanka Ringwald TEST(HCI, gap_le_connection_interval){
209fcebe167SMilanka Ringwald     uint16_t con_interval = gap_le_connection_interval(HCI_CON_HANDLE_INVALID);
210fcebe167SMilanka Ringwald     CHECK_EQUAL(0, con_interval);
211fcebe167SMilanka Ringwald 
212fcebe167SMilanka Ringwald     con_interval = gap_le_connection_interval(0x01);
213fcebe167SMilanka Ringwald     CHECK_EQUAL(0, con_interval);
214fcebe167SMilanka Ringwald }
215fcebe167SMilanka Ringwald 
216fcebe167SMilanka Ringwald 
217fcebe167SMilanka Ringwald TEST(HCI, gap_get_connection_type){
218fcebe167SMilanka Ringwald     gap_connection_type_t type = gap_get_connection_type(HCI_CON_HANDLE_INVALID);
219fcebe167SMilanka Ringwald     CHECK_EQUAL(GAP_CONNECTION_INVALID, type);
220fcebe167SMilanka Ringwald 
221fcebe167SMilanka Ringwald     type = gap_get_connection_type(0x01);
222fcebe167SMilanka Ringwald     CHECK_EQUAL(GAP_CONNECTION_ACL, type);
223fcebe167SMilanka Ringwald }
224fcebe167SMilanka Ringwald 
225fcebe167SMilanka Ringwald TEST(HCI, gap_le_set_phy){
226fcebe167SMilanka Ringwald     uint8_t status = gap_le_set_phy(HCI_CON_HANDLE_INVALID, 0, 0, 0, 0);
227fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
228fcebe167SMilanka Ringwald 
229fcebe167SMilanka Ringwald     status = gap_le_set_phy(0x01, 0, 0, 0, 0);
230fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
231fcebe167SMilanka Ringwald }
232fcebe167SMilanka Ringwald 
233fcebe167SMilanka Ringwald TEST(HCI, hci_connection_for_bd_addr_and_type){
234fcebe167SMilanka Ringwald     bd_addr_type_t addr_type = BD_ADDR_TYPE_ACL;
235fcebe167SMilanka Ringwald     bd_addr_t addr = { 0 };
236fcebe167SMilanka Ringwald 
237fcebe167SMilanka Ringwald     hci_connection_t * con = hci_connection_for_bd_addr_and_type(addr , addr_type);
238fcebe167SMilanka Ringwald     CHECK_EQUAL(NULL, con);
239fcebe167SMilanka Ringwald }
240fcebe167SMilanka Ringwald 
241fcebe167SMilanka Ringwald TEST(HCI, hci_number_free_acl_slots_for_handle){
242fcebe167SMilanka Ringwald     int free_acl_slots_num = hci_number_free_acl_slots_for_handle(HCI_CON_HANDLE_INVALID);
243fcebe167SMilanka Ringwald     CHECK_EQUAL(0, free_acl_slots_num);
244fcebe167SMilanka Ringwald }
245fcebe167SMilanka Ringwald 
246fcebe167SMilanka Ringwald TEST(HCI, hci_send_acl_packet_buffer){
247fcebe167SMilanka Ringwald     hci_reserve_packet_buffer();
248fcebe167SMilanka Ringwald     uint8_t status = hci_send_acl_packet_buffer(HCI_CON_HANDLE_INVALID);
249fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
250fcebe167SMilanka Ringwald }
251fcebe167SMilanka Ringwald 
252fcebe167SMilanka Ringwald TEST(HCI, hci_send_cmd_packet){
253fcebe167SMilanka Ringwald     bd_addr_t addr = { 0 };
254fcebe167SMilanka Ringwald 
255fcebe167SMilanka Ringwald     uint8_t status = hci_send_cmd(&hci_write_loopback_mode, 1);
256fcebe167SMilanka Ringwald     CHECK_EQUAL(0, status);
257fcebe167SMilanka Ringwald 
258fcebe167SMilanka Ringwald     uint8_t i;
259fcebe167SMilanka Ringwald     for (i = 0; i < 3; i++){
260fcebe167SMilanka Ringwald         status = hci_send_cmd(&hci_le_create_connection,
261fcebe167SMilanka Ringwald             1000,      // scan interval: 625 ms
262fcebe167SMilanka Ringwald             1000,      // scan interval: 625 ms
263fcebe167SMilanka Ringwald             i,         // don't use whitelist
264fcebe167SMilanka Ringwald             0,         // peer address type: public
265fcebe167SMilanka Ringwald             addr,      // remote bd addr
266fcebe167SMilanka Ringwald             0, // random or public
267fcebe167SMilanka Ringwald             80,        // conn interval min
268fcebe167SMilanka Ringwald             80,        // conn interval max (3200 * 0.625)
269fcebe167SMilanka Ringwald             0,         // conn latency
270fcebe167SMilanka Ringwald             2000,      // supervision timeout
271fcebe167SMilanka Ringwald             0,         // min ce length
272fcebe167SMilanka Ringwald             1000       // max ce length
273fcebe167SMilanka Ringwald         );
274fcebe167SMilanka Ringwald         CHECK_EQUAL(0, status);
275fcebe167SMilanka Ringwald     }
276fcebe167SMilanka Ringwald }
277fcebe167SMilanka Ringwald 
278fcebe167SMilanka Ringwald TEST(HCI, hci_send_cmd_va_arg){
279fcebe167SMilanka Ringwald     hci_reserve_packet_buffer();
280fcebe167SMilanka Ringwald     uint8_t status = hci_send_cmd(&hci_write_loopback_mode, 1);
281fcebe167SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_COMMAND_DISALLOWED, status);
282fcebe167SMilanka Ringwald }
283fcebe167SMilanka Ringwald 
284fcebe167SMilanka Ringwald TEST(HCI, hci_power_control){
285fcebe167SMilanka Ringwald     int status = hci_power_control(HCI_POWER_ON);
286fcebe167SMilanka Ringwald     CHECK_EQUAL(0, status);
287fcebe167SMilanka Ringwald }
288fcebe167SMilanka Ringwald 
289d3762d15SMatthias Ringwald TEST(HCI, NumPeripherals){
290d3762d15SMatthias Ringwald     gap_set_max_number_peripheral_connections(1);
291d3762d15SMatthias Ringwald }
292d3762d15SMatthias Ringwald 
293d3762d15SMatthias Ringwald TEST(HCI, MaxAclLen){
294d3762d15SMatthias Ringwald     hci_max_acl_data_packet_length();
295d3762d15SMatthias Ringwald }
296d3762d15SMatthias Ringwald 
297d3762d15SMatthias Ringwald TEST(HCI, Flushable){
298d3762d15SMatthias Ringwald     hci_non_flushable_packet_boundary_flag_supported();
299d3762d15SMatthias Ringwald }
300d3762d15SMatthias Ringwald 
301d3762d15SMatthias Ringwald TEST(HCI, RemovePacketHandler){
302d3762d15SMatthias Ringwald     hci_remove_event_handler(NULL);
303d3762d15SMatthias Ringwald }
304d3762d15SMatthias Ringwald 
305d3762d15SMatthias Ringwald static void dummy_fn(const void * config){};
306d3762d15SMatthias Ringwald TEST(HCI, SetChipset){
307d3762d15SMatthias Ringwald     hci_set_chipset(NULL);
308d3762d15SMatthias Ringwald     btstack_chipset_t chipset_driver = { 0 };
309d3762d15SMatthias Ringwald     hci_set_chipset(NULL);
310d3762d15SMatthias Ringwald     chipset_driver.init = dummy_fn;
311d3762d15SMatthias Ringwald }
312d3762d15SMatthias Ringwald 
313d3762d15SMatthias Ringwald TEST(HCI, SetControl){
314d3762d15SMatthias Ringwald     btstack_control_t hardware_control = { .init = &dummy_fn};
315d3762d15SMatthias Ringwald     hci_set_control(&hardware_control);
316d3762d15SMatthias Ringwald }
317d3762d15SMatthias Ringwald 
318d3762d15SMatthias Ringwald //TEST(HCI, Close){
319d3762d15SMatthias Ringwald //    hci_close();
320d3762d15SMatthias Ringwald //}
321d3762d15SMatthias Ringwald 
322d3762d15SMatthias Ringwald TEST(HCI, SetPublicAddress){
323d3762d15SMatthias Ringwald     bd_addr_t addr = { 0 };
324d3762d15SMatthias Ringwald     hci_set_bd_addr(addr);
325d3762d15SMatthias Ringwald }
326d3762d15SMatthias Ringwald 
327d3762d15SMatthias Ringwald TEST(HCI, DisconnectSecurityBlock){
328d3762d15SMatthias Ringwald     hci_disconnect_security_block(HCI_CON_HANDLE_INVALID);
329d3762d15SMatthias Ringwald     hci_disconnect_security_block(3);
330d3762d15SMatthias Ringwald }
331d3762d15SMatthias Ringwald 
332d3762d15SMatthias Ringwald TEST(HCI, SetDuplicateFilter){
333d3762d15SMatthias Ringwald     gap_set_scan_duplicate_filter(true);
334d3762d15SMatthias Ringwald }
335d3762d15SMatthias Ringwald 
336d3762d15SMatthias Ringwald TEST(HCI, ConnectCancel){
337*28739e5fSMatthias Ringwald     uint8_t status;
338*28739e5fSMatthias Ringwald     status = gap_connect_with_whitelist();
339*28739e5fSMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
340*28739e5fSMatthias Ringwald     gap_connect_cancel();
341*28739e5fSMatthias Ringwald 
342*28739e5fSMatthias Ringwald     bd_addr_type_t addr_type = BD_ADDR_TYPE_LE_PUBLIC;
343*28739e5fSMatthias Ringwald     bd_addr_t addr = { 0 };
344*28739e5fSMatthias Ringwald     gap_connect(addr, addr_type);
345d3762d15SMatthias Ringwald     gap_connect_cancel();
346d3762d15SMatthias Ringwald }
347d3762d15SMatthias Ringwald 
348d3762d15SMatthias Ringwald TEST(HCI, SetGapConnParams){
349d3762d15SMatthias Ringwald     gap_set_connection_parameters(0, 0, 0, 0, 0, 0, 0, 0);
350d3762d15SMatthias Ringwald }
351d3762d15SMatthias Ringwald 
352d3762d15SMatthias Ringwald TEST(HCI, UpdateConnParams){
353d3762d15SMatthias Ringwald     gap_update_connection_parameters(HCI_CON_HANDLE_INVALID, 0, 0, 0, 0);
354d3762d15SMatthias Ringwald     gap_update_connection_parameters(5, 0, 0, 0, 0);
355d3762d15SMatthias Ringwald }
356d3762d15SMatthias Ringwald 
357d3762d15SMatthias Ringwald TEST(HCI, RequestConnParamUpdate){
358d3762d15SMatthias Ringwald     gap_request_connection_parameter_update(HCI_CON_HANDLE_INVALID, 0, 0, 0, 0);
359d3762d15SMatthias Ringwald     gap_request_connection_parameter_update(5, 0, 0, 0, 0);
360d3762d15SMatthias Ringwald }
361d3762d15SMatthias Ringwald 
362d3762d15SMatthias Ringwald TEST(HCI, SetScanResponse){
363d3762d15SMatthias Ringwald     gap_scan_response_set_data(0, NULL);
364d3762d15SMatthias Ringwald }
365d3762d15SMatthias Ringwald 
366d3762d15SMatthias Ringwald TEST(HCI, SetAddrType){
367d3762d15SMatthias Ringwald     hci_le_set_own_address_type(0);
368d3762d15SMatthias Ringwald     hci_le_set_own_address_type(1);
369d3762d15SMatthias Ringwald }
370d3762d15SMatthias Ringwald 
371d3762d15SMatthias Ringwald TEST(HCI, AdvEnable){
372d3762d15SMatthias Ringwald     gap_advertisements_enable(0);
373d3762d15SMatthias Ringwald     gap_advertisements_enable(1);
374d3762d15SMatthias Ringwald }
375d3762d15SMatthias Ringwald 
376d3762d15SMatthias Ringwald TEST(HCI, SetRandomAddr){
377d3762d15SMatthias Ringwald     bd_addr_t addr = { 0 };
378d3762d15SMatthias Ringwald     hci_le_random_address_set(addr);
379d3762d15SMatthias Ringwald }
380d3762d15SMatthias Ringwald 
381d3762d15SMatthias Ringwald TEST(HCI, Disconnect){
382d3762d15SMatthias Ringwald     gap_disconnect(HCI_CON_HANDLE_INVALID);
383d3762d15SMatthias Ringwald     gap_disconnect(5);
384d3762d15SMatthias Ringwald }
385d3762d15SMatthias Ringwald 
386d3762d15SMatthias Ringwald TEST(HCI, GetRole){
387d3762d15SMatthias Ringwald     gap_get_role(HCI_CON_HANDLE_INVALID);
388d3762d15SMatthias Ringwald     gap_get_role(5);
389d3762d15SMatthias Ringwald }
390*28739e5fSMatthias Ringwald TEST(HCI, hci_is_le_identity_address_type_other){
391*28739e5fSMatthias Ringwald     hci_is_le_identity_address_type(BD_ADDR_TYPE_LE_PUBLIC_IDENTITY);
392*28739e5fSMatthias Ringwald     hci_is_le_identity_address_type(BD_ADDR_TYPE_LE_RANDOM);
393*28739e5fSMatthias Ringwald }
394*28739e5fSMatthias Ringwald 
395*28739e5fSMatthias Ringwald TEST(HCI, hci_can_send_command_packet_now){
396*28739e5fSMatthias Ringwald     can_send_now = 0;
397*28739e5fSMatthias Ringwald     hci_can_send_command_packet_now();
398*28739e5fSMatthias Ringwald     can_send_now = 1;
399*28739e5fSMatthias Ringwald     hci_can_send_command_packet_now();
400*28739e5fSMatthias Ringwald }
401*28739e5fSMatthias Ringwald 
402*28739e5fSMatthias Ringwald TEST(HCI, hci_can_send_prepared_acl_packet_now){
403*28739e5fSMatthias Ringwald     can_send_now = 0;
404*28739e5fSMatthias Ringwald     hci_can_send_prepared_acl_packet_now(0);
405*28739e5fSMatthias Ringwald     can_send_now = 1;
406*28739e5fSMatthias Ringwald     hci_can_send_prepared_acl_packet_now(0);
407*28739e5fSMatthias Ringwald }
408*28739e5fSMatthias Ringwald 
409*28739e5fSMatthias Ringwald TEST(HCI, hci_can_send_acl_le_packet_now) {
410*28739e5fSMatthias Ringwald     can_send_now = 0;
411*28739e5fSMatthias Ringwald     hci_can_send_acl_le_packet_now();
412*28739e5fSMatthias Ringwald     can_send_now = 1;
413*28739e5fSMatthias Ringwald     hci_can_send_acl_le_packet_now();
414*28739e5fSMatthias Ringwald }
415*28739e5fSMatthias Ringwald 
416*28739e5fSMatthias Ringwald TEST(HCI, hci_close) {
417*28739e5fSMatthias Ringwald     hci_close();
418*28739e5fSMatthias Ringwald }
419*28739e5fSMatthias Ringwald 
420*28739e5fSMatthias Ringwald TEST(HCI, gap_connect) {
421*28739e5fSMatthias Ringwald     bd_addr_type_t addr_type = BD_ADDR_TYPE_LE_PUBLIC;
422*28739e5fSMatthias Ringwald     bd_addr_t addr = { 0 };
423*28739e5fSMatthias Ringwald 
424*28739e5fSMatthias Ringwald     uint8_t status;
425*28739e5fSMatthias Ringwald     status = gap_connect(addr, addr_type);
426*28739e5fSMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
427*28739e5fSMatthias Ringwald     status = gap_connect(addr, addr_type);
428*28739e5fSMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_COMMAND_DISALLOWED, status);
429*28739e5fSMatthias Ringwald }
430*28739e5fSMatthias Ringwald 
431*28739e5fSMatthias Ringwald TEST(HCI, hci_emit_state) {
432*28739e5fSMatthias Ringwald     hci_emit_state();
433*28739e5fSMatthias Ringwald }
434*28739e5fSMatthias Ringwald 
435*28739e5fSMatthias Ringwald TEST(HCI, gap_request_connection_subrating) {
436*28739e5fSMatthias Ringwald     int status = gap_request_connection_subrating(HCI_CON_HANDLE_INVALID, 0, 0, 0, 0, 0);
437*28739e5fSMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
438*28739e5fSMatthias Ringwald     status = gap_request_connection_subrating(0x01, 0, 0, 0, 0, 0);
439*28739e5fSMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
440*28739e5fSMatthias Ringwald }
441*28739e5fSMatthias Ringwald 
442*28739e5fSMatthias Ringwald 
443*28739e5fSMatthias Ringwald TEST(HCI, hci_set_hardware_error_callback) {
444*28739e5fSMatthias Ringwald     hci_set_hardware_error_callback(NULL);
445*28739e5fSMatthias Ringwald }
446*28739e5fSMatthias Ringwald 
447*28739e5fSMatthias Ringwald TEST(HCI, hci_disconnect_all) {
448*28739e5fSMatthias Ringwald     hci_disconnect_all();
449*28739e5fSMatthias Ringwald }
450*28739e5fSMatthias Ringwald 
451*28739e5fSMatthias Ringwald TEST(HCI, hci_get_manufacturer) {
452*28739e5fSMatthias Ringwald     hci_get_manufacturer();
453*28739e5fSMatthias Ringwald }
454*28739e5fSMatthias Ringwald TEST(HCI, gap_authorization_state) {
455*28739e5fSMatthias Ringwald     gap_authorization_state(HCI_CON_HANDLE_INVALID);
456*28739e5fSMatthias Ringwald }
457*28739e5fSMatthias Ringwald #ifdef ENABLE_LE_PRIVACY_ADDRESS_RESOLUTION
458*28739e5fSMatthias Ringwald TEST(HCI, hci_load_le_device_db_entry_into_resolving_list) {
459*28739e5fSMatthias Ringwald     hci_load_le_device_db_entry_into_resolving_list(0);
460*28739e5fSMatthias Ringwald }
461*28739e5fSMatthias Ringwald 
462*28739e5fSMatthias Ringwald TEST(HCI, hci_remove_le_device_db_entry_from_resolving_list) {
463*28739e5fSMatthias Ringwald     hci_remove_le_device_db_entry_from_resolving_list(0);
464*28739e5fSMatthias Ringwald }
465*28739e5fSMatthias Ringwald 
466*28739e5fSMatthias Ringwald TEST(HCI, gap_load_resolving_list_from_le_device_db) {
467*28739e5fSMatthias Ringwald     gap_load_resolving_list_from_le_device_db();
468*28739e5fSMatthias Ringwald }
469*28739e5fSMatthias Ringwald #endif
470*28739e5fSMatthias Ringwald 
471*28739e5fSMatthias Ringwald TEST(HCI, gap_privacy_client) {
472*28739e5fSMatthias Ringwald     gap_privacy_client_t client;
473*28739e5fSMatthias Ringwald     gap_privacy_client_register(&client);
474*28739e5fSMatthias Ringwald     gap_privacy_client_ready(&client);
475*28739e5fSMatthias Ringwald     gap_privacy_client_unregister(&client);
476*28739e5fSMatthias Ringwald }
477d3762d15SMatthias Ringwald 
478d3762d15SMatthias Ringwald int main (int argc, const char * argv[]){
479fcebe167SMilanka Ringwald     btstack_run_loop_init(btstack_run_loop_posix_get_instance());
480d3762d15SMatthias Ringwald     return CommandLineTestRunner::RunAllTests(argc, argv);
481d3762d15SMatthias Ringwald }
482