11d3bd1e5SMatthias Ringwald
21d3bd1e5SMatthias Ringwald // *****************************************************************************
31d3bd1e5SMatthias Ringwald //
41d3bd1e5SMatthias Ringwald // test rfcomm query tests
51d3bd1e5SMatthias Ringwald //
61d3bd1e5SMatthias Ringwald // *****************************************************************************
71d3bd1e5SMatthias Ringwald
81d3bd1e5SMatthias Ringwald
91d3bd1e5SMatthias Ringwald #include <stdint.h>
101d3bd1e5SMatthias Ringwald #include <stdio.h>
111d3bd1e5SMatthias Ringwald #include <stdlib.h>
121d3bd1e5SMatthias Ringwald #include <string.h>
131d3bd1e5SMatthias Ringwald
141d3bd1e5SMatthias Ringwald #include "CppUTest/TestHarness.h"
151d3bd1e5SMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
161d3bd1e5SMatthias Ringwald #include "CppUTestExt/MockSupport.h"
171d3bd1e5SMatthias Ringwald
181d3bd1e5SMatthias Ringwald #include "hci_cmd.h"
191d3bd1e5SMatthias Ringwald
201d3bd1e5SMatthias Ringwald #include "btstack_memory.h"
211d3bd1e5SMatthias Ringwald #include "hci.h"
221d3bd1e5SMatthias Ringwald #include "ble/gatt_client.h"
231d3bd1e5SMatthias Ringwald #include "btstack_event.h"
241d3bd1e5SMatthias Ringwald
251d3bd1e5SMatthias Ringwald static uint8_t advertisement_received;
261d3bd1e5SMatthias Ringwald static uint8_t connected;
271d3bd1e5SMatthias Ringwald static uint8_t advertisement_packet[150];
281d3bd1e5SMatthias Ringwald static btstack_packet_callback_registration_t hci_event_callback_registration;
291d3bd1e5SMatthias Ringwald
301d3bd1e5SMatthias Ringwald extern "C" void mock_simulate_hci_state_working(void);
311d3bd1e5SMatthias Ringwald extern "C" void mock_simulate_command_complete(const hci_cmd_t *cmd);
321d3bd1e5SMatthias Ringwald extern "C" void mock_simulate_scan_response(void);
331d3bd1e5SMatthias Ringwald extern "C" void mock_simulate_connected(void);
341d3bd1e5SMatthias Ringwald
CHECK_EQUAL_ARRAY(const uint8_t * expected,uint8_t * actual,int size)351d3bd1e5SMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){
361d3bd1e5SMatthias Ringwald for (int i=0; i<size; i++){
371d3bd1e5SMatthias Ringwald BYTES_EQUAL(expected[i], actual[i]);
381d3bd1e5SMatthias Ringwald }
391d3bd1e5SMatthias Ringwald }
401d3bd1e5SMatthias Ringwald
411d3bd1e5SMatthias Ringwald // -----------------------------------------------------
421d3bd1e5SMatthias Ringwald
handle_hci_event(uint8_t packet_type,uint16_t channel,uint8_t * packet,uint16_t size)431d3bd1e5SMatthias Ringwald static void handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
441d3bd1e5SMatthias Ringwald if (packet_type != HCI_EVENT_PACKET) return;
451d3bd1e5SMatthias Ringwald
461d3bd1e5SMatthias Ringwald bd_addr_t address;
471d3bd1e5SMatthias Ringwald uint8_t event = packet[0];
481d3bd1e5SMatthias Ringwald switch (event) {
491d3bd1e5SMatthias Ringwald case GAP_EVENT_ADVERTISING_REPORT:{
501d3bd1e5SMatthias Ringwald advertisement_received = 1;
511d3bd1e5SMatthias Ringwald memcpy(advertisement_packet, packet, size);
521d3bd1e5SMatthias Ringwald gap_event_advertising_report_get_address(packet, address);
531d3bd1e5SMatthias Ringwald gap_connect(address, (bd_addr_type_t)packet[3]);
541d3bd1e5SMatthias Ringwald break;
551d3bd1e5SMatthias Ringwald }
56*38e85ba1SMatthias Ringwald case HCI_EVENT_META_GAP:
571d3bd1e5SMatthias Ringwald // wait for connection complete
58*38e85ba1SMatthias Ringwald if (hci_event_le_meta_get_subevent_code(packet) != GAP_SUBEVENT_LE_CONNECTION_COMPLETE) break;
591d3bd1e5SMatthias Ringwald connected = 1;
601d3bd1e5SMatthias Ringwald break;
611d3bd1e5SMatthias Ringwald case HCI_EVENT_DISCONNECTION_COMPLETE:
621d3bd1e5SMatthias Ringwald exit(0);
631d3bd1e5SMatthias Ringwald break;
641d3bd1e5SMatthias Ringwald default:
651d3bd1e5SMatthias Ringwald break;
661d3bd1e5SMatthias Ringwald }
671d3bd1e5SMatthias Ringwald }
681d3bd1e5SMatthias Ringwald
691d3bd1e5SMatthias Ringwald
TEST_GROUP(LECentral)701d3bd1e5SMatthias Ringwald TEST_GROUP(LECentral){
711d3bd1e5SMatthias Ringwald void setup(void){
721d3bd1e5SMatthias Ringwald advertisement_received = 0;
731d3bd1e5SMatthias Ringwald connected = 0;
741d3bd1e5SMatthias Ringwald // register for HCI events
751d3bd1e5SMatthias Ringwald hci_event_callback_registration.callback = &handle_hci_event;
761d3bd1e5SMatthias Ringwald hci_add_event_handler(&hci_event_callback_registration);
771d3bd1e5SMatthias Ringwald
781d3bd1e5SMatthias Ringwald l2cap_init();
791d3bd1e5SMatthias Ringwald
801d3bd1e5SMatthias Ringwald mock().expectOneCall("hci_can_send_packet_now_using_packet_buffer").andReturnValue(1);
811d3bd1e5SMatthias Ringwald mock_simulate_hci_state_working();
821d3bd1e5SMatthias Ringwald }
831d3bd1e5SMatthias Ringwald
841d3bd1e5SMatthias Ringwald void teardown(void){
851d3bd1e5SMatthias Ringwald mock().clear();
861d3bd1e5SMatthias Ringwald }
871d3bd1e5SMatthias Ringwald };
881d3bd1e5SMatthias Ringwald
891d3bd1e5SMatthias Ringwald
901d3bd1e5SMatthias Ringwald
TEST(LECentral,TestScanningAndConnect)911d3bd1e5SMatthias Ringwald TEST(LECentral, TestScanningAndConnect){
921d3bd1e5SMatthias Ringwald uint8_t expected_bt_addr[] = {0x34, 0xB1, 0xF7, 0xD1, 0x77, 0x9B};
931d3bd1e5SMatthias Ringwald
941d3bd1e5SMatthias Ringwald mock_simulate_scan_response();
951d3bd1e5SMatthias Ringwald
961d3bd1e5SMatthias Ringwald CHECK(advertisement_received);
971d3bd1e5SMatthias Ringwald CHECK_EQUAL(0xE2, advertisement_packet[2]); // event type
981d3bd1e5SMatthias Ringwald CHECK_EQUAL(0x01, advertisement_packet[3]); // address type
991d3bd1e5SMatthias Ringwald CHECK_EQUAL_ARRAY(expected_bt_addr, &advertisement_packet[4], 6);
1001d3bd1e5SMatthias Ringwald CHECK_EQUAL(0xCC, advertisement_packet[10]); // rssi
1011d3bd1e5SMatthias Ringwald CHECK_EQUAL(0x09, advertisement_packet[11]); // data size
1021d3bd1e5SMatthias Ringwald
1031d3bd1e5SMatthias Ringwald for (int i=0; i<0x09; i++){ // data
1041d3bd1e5SMatthias Ringwald CHECK_EQUAL(i, advertisement_packet[12+i]);
1051d3bd1e5SMatthias Ringwald }
1061d3bd1e5SMatthias Ringwald mock_simulate_connected();
1071d3bd1e5SMatthias Ringwald CHECK(connected);
1081d3bd1e5SMatthias Ringwald }
1091d3bd1e5SMatthias Ringwald
main(int argc,const char * argv[])1101d3bd1e5SMatthias Ringwald int main (int argc, const char * argv[]){
1111d3bd1e5SMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv);
1121d3bd1e5SMatthias Ringwald }
113