xref: /btstack/test/gap/test_le_scan.cpp (revision 4902524cc6a45a01cfead054f48b6584dbb1f1cc)
1*4902524cSMatthias Ringwald #include <stdint.h>
2*4902524cSMatthias Ringwald #include <stdio.h>
3*4902524cSMatthias Ringwald #include <stdlib.h>
4*4902524cSMatthias Ringwald #include <string.h>
5*4902524cSMatthias Ringwald 
6*4902524cSMatthias Ringwald #include "CppUTest/TestHarness.h"
7*4902524cSMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
8*4902524cSMatthias Ringwald #include "CppUTestExt/MockSupport.h"
9*4902524cSMatthias Ringwald 
10*4902524cSMatthias Ringwald #include "hci_cmd.h"
11*4902524cSMatthias Ringwald 
12*4902524cSMatthias Ringwald #include "btstack_memory.h"
13*4902524cSMatthias Ringwald #include "hci.h"
14*4902524cSMatthias Ringwald #include "ble/gatt_client.h"
15*4902524cSMatthias Ringwald #include "btstack_event.h"
16*4902524cSMatthias Ringwald #include "hci_dump.h"
17*4902524cSMatthias Ringwald #include "hci_dump_posix_fs.h"
18*4902524cSMatthias Ringwald #include "btstack_debug.h"
19*4902524cSMatthias Ringwald 
20*4902524cSMatthias Ringwald typedef struct {
21*4902524cSMatthias Ringwald     uint8_t type;
22*4902524cSMatthias Ringwald     uint16_t size;
23*4902524cSMatthias Ringwald     uint8_t  buffer[258];
24*4902524cSMatthias Ringwald } hci_packet_t;
25*4902524cSMatthias Ringwald 
26*4902524cSMatthias Ringwald #define MAX_HCI_PACKETS 10
27*4902524cSMatthias Ringwald static uint16_t transport_count_packets;
28*4902524cSMatthias Ringwald static hci_packet_t transport_packets[MAX_HCI_PACKETS];
29*4902524cSMatthias Ringwald 
30*4902524cSMatthias Ringwald static  void (*packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size);
31*4902524cSMatthias Ringwald 
32*4902524cSMatthias Ringwald static const uint8_t packet_sent_event[] = { HCI_EVENT_TRANSPORT_PACKET_SENT, 0};
33*4902524cSMatthias Ringwald 
hci_transport_test_set_baudrate(uint32_t baudrate)34*4902524cSMatthias Ringwald static int hci_transport_test_set_baudrate(uint32_t baudrate){
35*4902524cSMatthias Ringwald     return 0;
36*4902524cSMatthias Ringwald }
37*4902524cSMatthias Ringwald 
hci_transport_test_can_send_now(uint8_t packet_type)38*4902524cSMatthias Ringwald static int hci_transport_test_can_send_now(uint8_t packet_type){
39*4902524cSMatthias Ringwald     return 1;
40*4902524cSMatthias Ringwald }
41*4902524cSMatthias Ringwald 
hci_transport_test_send_packet(uint8_t packet_type,uint8_t * packet,int size)42*4902524cSMatthias Ringwald static int hci_transport_test_send_packet(uint8_t packet_type, uint8_t * packet, int size){
43*4902524cSMatthias Ringwald     btstack_assert(transport_count_packets < MAX_HCI_PACKETS);
44*4902524cSMatthias Ringwald     memcpy(transport_packets[transport_count_packets].buffer, packet, size);
45*4902524cSMatthias Ringwald     transport_packets[transport_count_packets].type = packet_type;
46*4902524cSMatthias Ringwald     transport_packets[transport_count_packets].size = size;
47*4902524cSMatthias Ringwald     transport_count_packets++;
48*4902524cSMatthias Ringwald     // notify upper stack that it can send again
49*4902524cSMatthias Ringwald     packet_handler(HCI_EVENT_PACKET, (uint8_t *) &packet_sent_event[0], sizeof(packet_sent_event));
50*4902524cSMatthias Ringwald     return 0;
51*4902524cSMatthias Ringwald }
52*4902524cSMatthias Ringwald 
hci_transport_test_init(const void * transport_config)53*4902524cSMatthias Ringwald static void hci_transport_test_init(const void * transport_config){
54*4902524cSMatthias Ringwald }
55*4902524cSMatthias Ringwald 
hci_transport_test_open(void)56*4902524cSMatthias Ringwald static int hci_transport_test_open(void){
57*4902524cSMatthias Ringwald     return 0;
58*4902524cSMatthias Ringwald }
59*4902524cSMatthias Ringwald 
hci_transport_test_close(void)60*4902524cSMatthias Ringwald static int hci_transport_test_close(void){
61*4902524cSMatthias Ringwald     return 0;
62*4902524cSMatthias Ringwald }
63*4902524cSMatthias Ringwald 
hci_transport_test_register_packet_handler(void (* handler)(uint8_t packet_type,uint8_t * packet,uint16_t size))64*4902524cSMatthias Ringwald static void hci_transport_test_register_packet_handler(void (*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size)){
65*4902524cSMatthias Ringwald     packet_handler = handler;
66*4902524cSMatthias Ringwald }
67*4902524cSMatthias Ringwald 
68*4902524cSMatthias Ringwald static const hci_transport_t hci_transport_test = {
69*4902524cSMatthias Ringwald         /* const char * name; */                                        "TEST",
70*4902524cSMatthias Ringwald         /* void   (*init) (const void *transport_config); */            &hci_transport_test_init,
71*4902524cSMatthias Ringwald         /* int    (*open)(void); */                                     &hci_transport_test_open,
72*4902524cSMatthias Ringwald         /* int    (*close)(void); */                                    &hci_transport_test_close,
73*4902524cSMatthias Ringwald         /* void   (*register_packet_handler)(void (*handler)(...); */   &hci_transport_test_register_packet_handler,
74*4902524cSMatthias Ringwald         /* int    (*can_send_packet_now)(uint8_t packet_type); */       &hci_transport_test_can_send_now,
75*4902524cSMatthias Ringwald         /* int    (*send_packet)(...); */                               &hci_transport_test_send_packet,
76*4902524cSMatthias Ringwald         /* int    (*set_baudrate)(uint32_t baudrate); */                &hci_transport_test_set_baudrate,
77*4902524cSMatthias Ringwald         /* void   (*reset_link)(void); */                               NULL,
78*4902524cSMatthias Ringwald         /* void   (*set_sco_config)(uint16_t voice_setting, int num_connections); */ NULL,
79*4902524cSMatthias Ringwald };
80*4902524cSMatthias Ringwald 
81*4902524cSMatthias Ringwald static uint16_t next_hci_packet;
82*4902524cSMatthias Ringwald 
CHECK_EQUAL_ARRAY(const uint8_t * expected,uint8_t * actual,int size)83*4902524cSMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){
84*4902524cSMatthias Ringwald     for (int i=0; i<size; i++){
85*4902524cSMatthias Ringwald         BYTES_EQUAL(expected[i], actual[i]);
86*4902524cSMatthias Ringwald     }
87*4902524cSMatthias Ringwald }
88*4902524cSMatthias Ringwald 
CHECK_HCI_COMMAND(const hci_cmd_t * expected_hci_command)89*4902524cSMatthias Ringwald void CHECK_HCI_COMMAND(const hci_cmd_t * expected_hci_command){
90*4902524cSMatthias Ringwald     uint16_t actual_opcode = little_endian_read_16(transport_packets[next_hci_packet].buffer, 0);
91*4902524cSMatthias Ringwald     next_hci_packet++;
92*4902524cSMatthias Ringwald     CHECK_EQUAL(expected_hci_command->opcode, actual_opcode);
93*4902524cSMatthias Ringwald }
94*4902524cSMatthias Ringwald 
TEST_GROUP(GAP_LE)95*4902524cSMatthias Ringwald TEST_GROUP(GAP_LE){
96*4902524cSMatthias Ringwald         void setup(void){
97*4902524cSMatthias Ringwald             transport_count_packets = 0;
98*4902524cSMatthias Ringwald             next_hci_packet = 0;
99*4902524cSMatthias Ringwald             hci_init(&hci_transport_test, NULL);
100*4902524cSMatthias Ringwald             hci_simulate_working_fuzz();
101*4902524cSMatthias Ringwald             // register for HCI events
102*4902524cSMatthias Ringwald             mock().expectOneCall("hci_can_send_packet_now_using_packet_buffer").andReturnValue(1);
103*4902524cSMatthias Ringwald         }
104*4902524cSMatthias Ringwald         void teardown(void){
105*4902524cSMatthias Ringwald             mock().clear();
106*4902524cSMatthias Ringwald         }
107*4902524cSMatthias Ringwald };
108*4902524cSMatthias Ringwald 
TEST(GAP_LE,ScanStart)109*4902524cSMatthias Ringwald TEST(GAP_LE, ScanStart){
110*4902524cSMatthias Ringwald     log_info("TEST(GAP_LE, ScanStart)");
111*4902524cSMatthias Ringwald     gap_start_scan();
112*4902524cSMatthias Ringwald     CHECK_EQUAL(1, transport_count_packets);
113*4902524cSMatthias Ringwald     CHECK_HCI_COMMAND(&hci_le_set_scan_enable);
114*4902524cSMatthias Ringwald }
TEST(GAP_LE,ScanStartStop)115*4902524cSMatthias Ringwald TEST(GAP_LE, ScanStartStop){
116*4902524cSMatthias Ringwald     log_info("TEST(GAP_LE, ScanStartStop)");
117*4902524cSMatthias Ringwald     gap_start_scan();
118*4902524cSMatthias Ringwald     gap_stop_scan();
119*4902524cSMatthias Ringwald     CHECK_EQUAL(2, transport_count_packets);
120*4902524cSMatthias Ringwald     CHECK_HCI_COMMAND(&hci_le_set_scan_enable);
121*4902524cSMatthias Ringwald     CHECK_HCI_COMMAND(&hci_le_set_scan_enable);
122*4902524cSMatthias Ringwald }
123*4902524cSMatthias Ringwald 
TEST(GAP_LE,ScanStartParam)124*4902524cSMatthias Ringwald TEST(GAP_LE, ScanStartParam){
125*4902524cSMatthias Ringwald     log_info("TEST(GAP_LE, ScanStartParam)");
126*4902524cSMatthias Ringwald     gap_start_scan();
127*4902524cSMatthias Ringwald     gap_set_scan_parameters(0, 10, 10);
128*4902524cSMatthias Ringwald     CHECK_EQUAL(4, transport_count_packets);
129*4902524cSMatthias Ringwald     CHECK_HCI_COMMAND(&hci_le_set_scan_enable);
130*4902524cSMatthias Ringwald     CHECK_HCI_COMMAND(&hci_le_set_scan_enable);
131*4902524cSMatthias Ringwald     CHECK_HCI_COMMAND(&hci_le_set_scan_parameters);
132*4902524cSMatthias Ringwald     CHECK_HCI_COMMAND(&hci_le_set_scan_enable);
133*4902524cSMatthias Ringwald }
134*4902524cSMatthias Ringwald 
main(int argc,const char * argv[])135*4902524cSMatthias Ringwald int main (int argc, const char * argv[]){
136*4902524cSMatthias Ringwald     // log into file using HCI_DUMP_PACKETLOGGER format
137*4902524cSMatthias Ringwald     const char * pklg_path = "hci_dump.pklg";
138*4902524cSMatthias Ringwald     hci_dump_posix_fs_open(pklg_path, HCI_DUMP_PACKETLOGGER);
139*4902524cSMatthias Ringwald     hci_dump_init(hci_dump_posix_fs_get_instance());
140*4902524cSMatthias Ringwald     printf("Packet Log: %s\n", pklg_path);
141*4902524cSMatthias Ringwald 
142*4902524cSMatthias Ringwald     return CommandLineTestRunner::RunAllTests(argc, argv);
143*4902524cSMatthias Ringwald }
144