1e0ff5d41SMatthias Ringwald
2e0ff5d41SMatthias Ringwald // *****************************************************************************
3e0ff5d41SMatthias Ringwald //
4e0ff5d41SMatthias Ringwald // test rfcomm query tests
5e0ff5d41SMatthias Ringwald //
6e0ff5d41SMatthias Ringwald // *****************************************************************************
7e0ff5d41SMatthias Ringwald
8e0ff5d41SMatthias Ringwald
9e0ff5d41SMatthias Ringwald #include <stdint.h>
10e0ff5d41SMatthias Ringwald #include <stdio.h>
11e0ff5d41SMatthias Ringwald #include <stdlib.h>
12e0ff5d41SMatthias Ringwald #include <string.h>
13e0ff5d41SMatthias Ringwald
14e0ff5d41SMatthias Ringwald #include "CppUTest/TestHarness.h"
15e0ff5d41SMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
16e0ff5d41SMatthias Ringwald
17e0ff5d41SMatthias Ringwald #include "hci.h"
18e0ff5d41SMatthias Ringwald #include "ble/att_db.h"
19e0ff5d41SMatthias Ringwald #include "ble/att_db_util.h"
20e0ff5d41SMatthias Ringwald #include "ble/att_server.h"
21e0ff5d41SMatthias Ringwald #include "btstack_util.h"
22e0ff5d41SMatthias Ringwald #include "bluetooth.h"
2325336c94SMilanka Ringwald #include "btstack_tlv.h"
2425336c94SMilanka Ringwald #include "mock_btstack_tlv.h"
25e0ff5d41SMatthias Ringwald
26e0ff5d41SMatthias Ringwald #include "bluetooth_gatt.h"
27e0ff5d41SMatthias Ringwald
28e0ff5d41SMatthias Ringwald static uint8_t battery_level = 100;
29e0ff5d41SMatthias Ringwald static const uint8_t uuid128_with_bluetooth_base[] = { 0x00, 0x00, 0xBB, 0xBB, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
30e0ff5d41SMatthias Ringwald static const uint8_t uuid128_no_bluetooth_base[] = { 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00 };
31e0ff5d41SMatthias Ringwald
32e0ff5d41SMatthias Ringwald extern "C" void l2cap_can_send_fixed_channel_packet_now_set_status(uint8_t status);
3325336c94SMilanka Ringwald extern "C" void mock_call_att_server_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
348206902cSMilanka Ringwald extern "C" void hci_setup_le_connection(uint16_t con_handle);
358206902cSMilanka Ringwald extern "C" void mock_call_att_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
368206902cSMilanka Ringwald extern "C" void mock_l2cap_set_max_mtu(uint16_t mtu);
37a0a19446SMilanka Ringwald extern "C" void hci_setup_classic_connection(uint16_t con_handle);
38407513dbSMilanka Ringwald extern "C" void set_cmac_ready(int ready);
3925336c94SMilanka Ringwald
4025336c94SMilanka Ringwald static uint8_t att_request[255];
att_write_request(uint16_t request_type,uint16_t attribute_handle,uint16_t value_length,const uint8_t * value)4125336c94SMilanka Ringwald static uint16_t att_write_request(uint16_t request_type, uint16_t attribute_handle, uint16_t value_length, const uint8_t * value){
4225336c94SMilanka Ringwald att_request[0] = request_type;
4325336c94SMilanka Ringwald little_endian_store_16(att_request, 1, attribute_handle);
4425336c94SMilanka Ringwald (void)memcpy(&att_request[3], value, value_length);
4525336c94SMilanka Ringwald return 3 + value_length;
4625336c94SMilanka Ringwald }
47e0ff5d41SMatthias Ringwald
att_read_request(uint16_t request_type,uint16_t attribute_handle)48407513dbSMilanka Ringwald static uint16_t att_read_request(uint16_t request_type, uint16_t attribute_handle){
49407513dbSMilanka Ringwald att_request[0] = request_type;
50407513dbSMilanka Ringwald little_endian_store_16(att_request, 1, attribute_handle);
51407513dbSMilanka Ringwald return 3;
52407513dbSMilanka Ringwald }
53407513dbSMilanka Ringwald
att_read_callback(hci_con_handle_t connection_handle,uint16_t att_handle,uint16_t offset,uint8_t * buffer,uint16_t buffer_size)54e0ff5d41SMatthias Ringwald static uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){
55e0ff5d41SMatthias Ringwald UNUSED(connection_handle);
56e0ff5d41SMatthias Ringwald UNUSED(att_handle);
57e0ff5d41SMatthias Ringwald UNUSED(offset);
58e0ff5d41SMatthias Ringwald UNUSED(buffer);
59e0ff5d41SMatthias Ringwald UNUSED(buffer_size);
60e0ff5d41SMatthias Ringwald
61e0ff5d41SMatthias Ringwald return 0;
62e0ff5d41SMatthias Ringwald }
63e0ff5d41SMatthias Ringwald
att_write_callback(hci_con_handle_t connection_handle,uint16_t att_handle,uint16_t transaction_mode,uint16_t offset,uint8_t * buffer,uint16_t buffer_size)64e0ff5d41SMatthias Ringwald static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size){
65e0ff5d41SMatthias Ringwald UNUSED(connection_handle);
66e0ff5d41SMatthias Ringwald UNUSED(att_handle);
67e0ff5d41SMatthias Ringwald UNUSED(transaction_mode);
68e0ff5d41SMatthias Ringwald UNUSED(offset);
69e0ff5d41SMatthias Ringwald UNUSED(buffer);
70e0ff5d41SMatthias Ringwald UNUSED(buffer_size);
71e0ff5d41SMatthias Ringwald
72e0ff5d41SMatthias Ringwald return 0;
73e0ff5d41SMatthias Ringwald }
74e0ff5d41SMatthias Ringwald
att_client_indication_callback(void * context)75a8c93a4eSMilanka Ringwald static void att_client_indication_callback(void * context){
76a8c93a4eSMilanka Ringwald }
att_client_notification_callback(void * context)778206902cSMilanka Ringwald static void att_client_notification_callback(void * context){
788206902cSMilanka Ringwald }
att_event_packet_handler(uint8_t packet_type,uint16_t channel,uint8_t * packet,uint16_t size)798206902cSMilanka Ringwald static void att_event_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size) {
808206902cSMilanka Ringwald }
818206902cSMilanka Ringwald
82e0ff5d41SMatthias Ringwald
TEST_GROUP(ATT_SERVER)83e0ff5d41SMatthias Ringwald TEST_GROUP(ATT_SERVER){
84e0ff5d41SMatthias Ringwald uint16_t att_con_handle;
8525336c94SMilanka Ringwald mock_btstack_tlv_t tlv_context;
8625336c94SMilanka Ringwald const btstack_tlv_t * tlv_impl;
878206902cSMilanka Ringwald btstack_context_callback_registration_t indication_callback;
888206902cSMilanka Ringwald btstack_context_callback_registration_t notification_callback;
89e0ff5d41SMatthias Ringwald
90e0ff5d41SMatthias Ringwald void setup(void){
918206902cSMilanka Ringwald att_con_handle = 0x01;
92a8c93a4eSMilanka Ringwald
938206902cSMilanka Ringwald hci_setup_le_connection(att_con_handle);
948206902cSMilanka Ringwald
9525336c94SMilanka Ringwald tlv_impl = mock_btstack_tlv_init_instance(&tlv_context);
9625336c94SMilanka Ringwald btstack_tlv_set_instance(tlv_impl, &tlv_context);
97e0ff5d41SMatthias Ringwald
98a8c93a4eSMilanka Ringwald l2cap_can_send_fixed_channel_packet_now_set_status(1);
998206902cSMilanka Ringwald indication_callback.callback = &att_client_indication_callback;
1008206902cSMilanka Ringwald notification_callback.callback = &att_client_notification_callback;
101a8c93a4eSMilanka Ringwald
102e0ff5d41SMatthias Ringwald // init att db util and add a service and characteristic
103e0ff5d41SMatthias Ringwald att_db_util_init();
104e0ff5d41SMatthias Ringwald // 0x180F
105e0ff5d41SMatthias Ringwald att_db_util_add_service_uuid16(ORG_BLUETOOTH_SERVICE_BATTERY_SERVICE);
106e0ff5d41SMatthias Ringwald // 0x2A19
107e0ff5d41SMatthias Ringwald att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL, ATT_PROPERTY_WRITE | ATT_PROPERTY_READ | ATT_PROPERTY_INDICATE, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1);
108e0ff5d41SMatthias Ringwald // 0x2A1B
109e0ff5d41SMatthias Ringwald att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL_STATE, ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1);
110e0ff5d41SMatthias Ringwald // 0x2A1A
111e0ff5d41SMatthias Ringwald att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_POWER_STATE, ATT_PROPERTY_READ | ATT_PROPERTY_NOTIFY, ATT_SECURITY_AUTHENTICATED, ATT_SECURITY_AUTHENTICATED, &battery_level, 1);
112e0ff5d41SMatthias Ringwald // 0x2A49
113e0ff5d41SMatthias Ringwald att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BLOOD_PRESSURE_FEATURE, ATT_PROPERTY_DYNAMIC | ATT_PROPERTY_READ | ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1);
114e0ff5d41SMatthias Ringwald // 0x2A35
115e0ff5d41SMatthias Ringwald att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BLOOD_PRESSURE_MEASUREMENT, ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC, ATT_SECURITY_AUTHENTICATED, ATT_SECURITY_AUTHENTICATED, &battery_level, 1);
116e0ff5d41SMatthias Ringwald
117e0ff5d41SMatthias Ringwald
118e0ff5d41SMatthias Ringwald att_db_util_add_characteristic_uuid128(uuid128_no_bluetooth_base, ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC | ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1);
11925336c94SMilanka Ringwald // 0x2A38btstack_tlv_set_instance
120e0ff5d41SMatthias Ringwald att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BODY_SENSOR_LOCATION, ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC | ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1);
121e0ff5d41SMatthias Ringwald
122e0ff5d41SMatthias Ringwald
123e0ff5d41SMatthias Ringwald att_db_util_add_characteristic_uuid128(uuid128_with_bluetooth_base, ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC | ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1);
124e0ff5d41SMatthias Ringwald // 0x2AAB
125e0ff5d41SMatthias Ringwald att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_CGM_SESSION_RUN_TIME, ATT_PROPERTY_WRITE_WITHOUT_RESPONSE | ATT_PROPERTY_DYNAMIC | ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1);
12625336c94SMilanka Ringwald // 0x2A5C
12725336c94SMilanka Ringwald att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_CSC_FEATURE, ATT_PROPERTY_AUTHENTICATED_SIGNED_WRITE | ATT_PROPERTY_DYNAMIC, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1);
128e0ff5d41SMatthias Ringwald // setup ATT server
129e0ff5d41SMatthias Ringwald att_server_init(att_db_util_get_address(), att_read_callback, att_write_callback);
130e0ff5d41SMatthias Ringwald }
13125336c94SMilanka Ringwald
13225336c94SMilanka Ringwald void teardown(void) {
13325336c94SMilanka Ringwald mock_btstack_tlv_deinit(&tlv_context);
134ef3eb5efSMilanka Ringwald att_server_deinit();
1358206902cSMilanka Ringwald hci_deinit();
13625336c94SMilanka Ringwald }
137e0ff5d41SMatthias Ringwald };
138e0ff5d41SMatthias Ringwald
TEST(ATT_SERVER,gatt_server_get_value_handle_for_characteristic_with_uuid16)139e0ff5d41SMatthias Ringwald TEST(ATT_SERVER, gatt_server_get_value_handle_for_characteristic_with_uuid16){
140e0ff5d41SMatthias Ringwald // att_dump_attributes();
141e0ff5d41SMatthias Ringwald uint16_t value_handle;
142e0ff5d41SMatthias Ringwald
143e0ff5d41SMatthias Ringwald // start handle > value handle
144e0ff5d41SMatthias Ringwald value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0xf000, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
145e0ff5d41SMatthias Ringwald CHECK_EQUAL(0, value_handle);
146e0ff5d41SMatthias Ringwald
147e0ff5d41SMatthias Ringwald // end handle < value handle
148e0ff5d41SMatthias Ringwald value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0x02, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
149e0ff5d41SMatthias Ringwald CHECK_EQUAL(0, value_handle);
150e0ff5d41SMatthias Ringwald
151e0ff5d41SMatthias Ringwald // search value handle for unknown UUID
152e0ff5d41SMatthias Ringwald value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, 0xffff);
153e0ff5d41SMatthias Ringwald CHECK_EQUAL(0, value_handle);
154e0ff5d41SMatthias Ringwald
155e0ff5d41SMatthias Ringwald value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, 0);
156e0ff5d41SMatthias Ringwald CHECK_EQUAL(0, value_handle);
157e0ff5d41SMatthias Ringwald
158e0ff5d41SMatthias Ringwald // search value handle after one with uuid128_no_bluetooth_base
159e0ff5d41SMatthias Ringwald value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BODY_SENSOR_LOCATION);
160e0ff5d41SMatthias Ringwald CHECK_EQUAL(0x0014, value_handle);
161e0ff5d41SMatthias Ringwald
162e0ff5d41SMatthias Ringwald // search value handle after one with uuid128_with_bluetooth_base
163e0ff5d41SMatthias Ringwald value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_CGM_SESSION_RUN_TIME);
164e0ff5d41SMatthias Ringwald CHECK_EQUAL(0x001a, value_handle);
165e0ff5d41SMatthias Ringwald
166e0ff5d41SMatthias Ringwald // search value handle registered with bluetooth_base
167e0ff5d41SMatthias Ringwald value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, 0xbbbb);
168e0ff5d41SMatthias Ringwald CHECK_EQUAL(0x0017, value_handle);
169e0ff5d41SMatthias Ringwald
170e0ff5d41SMatthias Ringwald // correct read
171e0ff5d41SMatthias Ringwald value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
172e0ff5d41SMatthias Ringwald CHECK_EQUAL(0x03, value_handle);
173e0ff5d41SMatthias Ringwald }
174e0ff5d41SMatthias Ringwald
175e0ff5d41SMatthias Ringwald
TEST(ATT_SERVER,att_server_indicate)176e0ff5d41SMatthias Ringwald TEST(ATT_SERVER, att_server_indicate){
177e0ff5d41SMatthias Ringwald static uint8_t value[] = {0x55};
178e0ff5d41SMatthias Ringwald uint16_t value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
179e0ff5d41SMatthias Ringwald uint8_t status;
180e0ff5d41SMatthias Ringwald
18125336c94SMilanka Ringwald // invalid connection handle
182e0ff5d41SMatthias Ringwald status = att_server_indicate(0x50, value_handle, &value[0], 0);
183e0ff5d41SMatthias Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
184e0ff5d41SMatthias Ringwald
185e0ff5d41SMatthias Ringwald // L2CAP cannot send
186e0ff5d41SMatthias Ringwald l2cap_can_send_fixed_channel_packet_now_set_status(0);
187e0ff5d41SMatthias Ringwald status = att_server_indicate(att_con_handle, value_handle, &value[0], 0);
188e0ff5d41SMatthias Ringwald CHECK_EQUAL(BTSTACK_ACL_BUFFERS_FULL, status);
189e0ff5d41SMatthias Ringwald l2cap_can_send_fixed_channel_packet_now_set_status(1);
190e0ff5d41SMatthias Ringwald
191e0ff5d41SMatthias Ringwald // correct command
192e0ff5d41SMatthias Ringwald status = att_server_indicate(att_con_handle, value_handle, &value[0], 0);
193e0ff5d41SMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
194e0ff5d41SMatthias Ringwald
195e0ff5d41SMatthias Ringwald // already in progress
196e0ff5d41SMatthias Ringwald status = att_server_indicate(att_con_handle, value_handle, &value[0], 0);
197e0ff5d41SMatthias Ringwald CHECK_EQUAL(ATT_HANDLE_VALUE_INDICATION_IN_PROGRESS, status);
198e0ff5d41SMatthias Ringwald }
199e0ff5d41SMatthias Ringwald
TEST(ATT_SERVER,att_server_notify)200e0ff5d41SMatthias Ringwald TEST(ATT_SERVER, att_server_notify){
201e0ff5d41SMatthias Ringwald static uint8_t value[] = {0x55};
202e0ff5d41SMatthias Ringwald uint16_t value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
203e0ff5d41SMatthias Ringwald uint8_t status;
204e0ff5d41SMatthias Ringwald
20525336c94SMilanka Ringwald // invalid connection handle
206e0ff5d41SMatthias Ringwald status = att_server_notify(0x50, value_handle, &value[0], 0);
207e0ff5d41SMatthias Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
208e0ff5d41SMatthias Ringwald
209e0ff5d41SMatthias Ringwald // L2CAP cannot send
210e0ff5d41SMatthias Ringwald l2cap_can_send_fixed_channel_packet_now_set_status(0);
211e0ff5d41SMatthias Ringwald status = att_server_notify(att_con_handle, value_handle, &value[0], 0);
212e0ff5d41SMatthias Ringwald CHECK_EQUAL(BTSTACK_ACL_BUFFERS_FULL, status);
213e0ff5d41SMatthias Ringwald l2cap_can_send_fixed_channel_packet_now_set_status(1);
214e0ff5d41SMatthias Ringwald
215e0ff5d41SMatthias Ringwald // correct command
216e0ff5d41SMatthias Ringwald status = att_server_notify(att_con_handle, value_handle, &value[0], 0);
217e0ff5d41SMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
218e0ff5d41SMatthias Ringwald }
219e0ff5d41SMatthias Ringwald
TEST(ATT_SERVER,att_server_get_mtu)220e0ff5d41SMatthias Ringwald TEST(ATT_SERVER, att_server_get_mtu){
22125336c94SMilanka Ringwald // invalid connection handle
222e0ff5d41SMatthias Ringwald uint8_t mtu = att_server_get_mtu(0x50);
223e0ff5d41SMatthias Ringwald CHECK_EQUAL(0, mtu);
224e0ff5d41SMatthias Ringwald
225e0ff5d41SMatthias Ringwald mtu = att_server_get_mtu(att_con_handle);
22625336c94SMilanka Ringwald CHECK_EQUAL(23, mtu);
227e0ff5d41SMatthias Ringwald }
228e0ff5d41SMatthias Ringwald
TEST(ATT_SERVER,att_server_request_can_send_now_event)229e0ff5d41SMatthias Ringwald TEST(ATT_SERVER, att_server_request_can_send_now_event){
23025336c94SMilanka Ringwald att_server_request_can_send_now_event(att_con_handle);
231e0ff5d41SMatthias Ringwald }
232e0ff5d41SMatthias Ringwald
TEST(ATT_SERVER,att_server_can_send_packet_now)23325336c94SMilanka Ringwald TEST(ATT_SERVER, att_server_can_send_packet_now){
23425336c94SMilanka Ringwald int status = att_server_can_send_packet_now(att_con_handle);
23525336c94SMilanka Ringwald CHECK_EQUAL(1, status);
23625336c94SMilanka Ringwald
23725336c94SMilanka Ringwald status = att_server_can_send_packet_now(0x50);
23825336c94SMilanka Ringwald CHECK_EQUAL(0, status);
23925336c94SMilanka Ringwald }
24025336c94SMilanka Ringwald
TEST(ATT_SERVER,att_server_request_to_send_indication)241a8c93a4eSMilanka Ringwald TEST(ATT_SERVER, att_server_request_to_send_indication){
242a8c93a4eSMilanka Ringwald int status = att_server_request_to_send_indication(&indication_callback, 0x55);
243a8c93a4eSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
244a8c93a4eSMilanka Ringwald
245a8c93a4eSMilanka Ringwald l2cap_can_send_fixed_channel_packet_now_set_status(0);
246a8c93a4eSMilanka Ringwald
247a8c93a4eSMilanka Ringwald status = att_server_request_to_send_indication(&indication_callback, att_con_handle);
248a8c93a4eSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
249a8c93a4eSMilanka Ringwald
250a8c93a4eSMilanka Ringwald status = att_server_request_to_send_indication(&indication_callback, att_con_handle);
251a8c93a4eSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_COMMAND_DISALLOWED, status);
252a8c93a4eSMilanka Ringwald }
25325336c94SMilanka Ringwald
TEST(ATT_SERVER,att_server_request_to_send_notification)2548206902cSMilanka Ringwald TEST(ATT_SERVER, att_server_request_to_send_notification){
2558206902cSMilanka Ringwald int status = att_server_request_to_send_notification(¬ification_callback, 0x55);
2568206902cSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
2578206902cSMilanka Ringwald
2588206902cSMilanka Ringwald l2cap_can_send_fixed_channel_packet_now_set_status(0);
2598206902cSMilanka Ringwald
2608206902cSMilanka Ringwald status = att_server_request_to_send_notification(¬ification_callback, att_con_handle);
2618206902cSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
2628206902cSMilanka Ringwald
2638206902cSMilanka Ringwald status = att_server_request_to_send_notification(¬ification_callback, att_con_handle);
2648206902cSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_COMMAND_DISALLOWED, status);
2658206902cSMilanka Ringwald }
2668206902cSMilanka Ringwald
TEST(ATT_SERVER,att_server_register_can_send_now_callback)2678206902cSMilanka Ringwald TEST(ATT_SERVER, att_server_register_can_send_now_callback){
2688206902cSMilanka Ringwald int status = att_server_register_can_send_now_callback(¬ification_callback, 0x55);
2698206902cSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
2708206902cSMilanka Ringwald
2718206902cSMilanka Ringwald att_server_register_packet_handler(&att_event_packet_handler);
2728206902cSMilanka Ringwald }
2738206902cSMilanka Ringwald
TEST(ATT_SERVER,att_packet_handler_ATT_DATA_PACKET)274a0a19446SMilanka Ringwald TEST(ATT_SERVER, att_packet_handler_ATT_DATA_PACKET){
27525336c94SMilanka Ringwald uint16_t value_handle = gatt_server_get_client_configuration_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
276a8c93a4eSMilanka Ringwald uint8_t buffer[] = {1, 0};
2778206902cSMilanka Ringwald
278a8c93a4eSMilanka Ringwald uint16_t att_request_len = att_write_request(ATT_WRITE_REQUEST, value_handle, sizeof(buffer), buffer);
27925336c94SMilanka Ringwald mock_call_att_server_packet_handler(ATT_DATA_PACKET, att_con_handle, &att_request[0], att_request_len);
28025336c94SMilanka Ringwald }
28125336c94SMilanka Ringwald
TEST(ATT_SERVER,att_packet_handler_ATT_DATA_PACKET1)282407513dbSMilanka Ringwald TEST(ATT_SERVER, att_packet_handler_ATT_DATA_PACKET1){
283407513dbSMilanka Ringwald uint16_t value_handle;
284407513dbSMilanka Ringwald uint16_t att_request_len;
285407513dbSMilanka Ringwald
286407513dbSMilanka Ringwald value_handle = gatt_server_get_client_configuration_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
287407513dbSMilanka Ringwald att_request_len = att_read_request(ATT_READ_REQUEST, value_handle);
288407513dbSMilanka Ringwald mock_call_att_server_packet_handler(ATT_DATA_PACKET, att_con_handle, &att_request[0], att_request_len);
289407513dbSMilanka Ringwald }
290407513dbSMilanka Ringwald
TEST(ATT_SERVER,att_packet_handler_invalid_opcode)291407513dbSMilanka Ringwald TEST(ATT_SERVER, att_packet_handler_invalid_opcode){
292407513dbSMilanka Ringwald uint16_t value_handle = gatt_server_get_client_configuration_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_POWER_STATE);
293407513dbSMilanka Ringwald uint8_t buffer[] = {1, 0};
294407513dbSMilanka Ringwald
295407513dbSMilanka Ringwald uint16_t att_request_len = att_write_request(0xFF, value_handle, sizeof(buffer), buffer);
296407513dbSMilanka Ringwald mock_call_att_server_packet_handler(ATT_DATA_PACKET, att_con_handle, &att_request[0], att_request_len);
297407513dbSMilanka Ringwald }
298407513dbSMilanka Ringwald
TEST(ATT_SERVER,att_packet_handler_ATT_HANDLE_VALUE_CONFIRMATION)299407513dbSMilanka Ringwald TEST(ATT_SERVER, att_packet_handler_ATT_HANDLE_VALUE_CONFIRMATION){
300407513dbSMilanka Ringwald hci_setup_le_connection(att_con_handle);
301407513dbSMilanka Ringwald static uint8_t value[] = {0x55};
302407513dbSMilanka Ringwald uint16_t value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
303407513dbSMilanka Ringwald l2cap_can_send_fixed_channel_packet_now_set_status(1);
304407513dbSMilanka Ringwald // correct command
305407513dbSMilanka Ringwald uint8_t status = att_server_indicate(att_con_handle, value_handle, &value[0], 0);
306407513dbSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
307407513dbSMilanka Ringwald
308407513dbSMilanka Ringwald static uint8_t buffer[0];
309407513dbSMilanka Ringwald uint16_t att_request_len = att_write_request(ATT_HANDLE_VALUE_CONFIRMATION, value_handle, 0, buffer);
310407513dbSMilanka Ringwald mock_call_att_server_packet_handler(ATT_DATA_PACKET, att_con_handle, &att_request[0], att_request_len);
311407513dbSMilanka Ringwald }
312407513dbSMilanka Ringwald
TEST(ATT_SERVER,att_packet_handler_ATT_WRITE_COMMAND)313407513dbSMilanka Ringwald TEST(ATT_SERVER, att_packet_handler_ATT_WRITE_COMMAND){
314407513dbSMilanka Ringwald uint16_t value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
315407513dbSMilanka Ringwald static uint8_t buffer[] = {0x55};
316407513dbSMilanka Ringwald uint16_t att_request_len = att_write_request(ATT_WRITE_COMMAND, value_handle, sizeof(buffer), buffer);
317407513dbSMilanka Ringwald mock_call_att_server_packet_handler(ATT_DATA_PACKET, att_con_handle, &att_request[0], att_request_len);
318407513dbSMilanka Ringwald }
319407513dbSMilanka Ringwald
TEST(ATT_SERVER,att_packet_handler_ATT_WRITE_COMMAND_wrong_buffer_size)320407513dbSMilanka Ringwald TEST(ATT_SERVER, att_packet_handler_ATT_WRITE_COMMAND_wrong_buffer_size){
321407513dbSMilanka Ringwald uint16_t value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
322407513dbSMilanka Ringwald static uint8_t buffer[] = {0x55};
323407513dbSMilanka Ringwald att_write_request(ATT_SIGNED_WRITE_COMMAND, value_handle, sizeof(buffer), buffer);
324407513dbSMilanka Ringwald mock_call_att_server_packet_handler(ATT_DATA_PACKET, att_con_handle, &att_request[0], ATT_REQUEST_BUFFER_SIZE + 100);
325407513dbSMilanka Ringwald }
326407513dbSMilanka Ringwald
TEST(ATT_SERVER,att_packet_handler_ATT_WRITE_COMMAND_signed_write_confirmation)327407513dbSMilanka Ringwald TEST(ATT_SERVER, att_packet_handler_ATT_WRITE_COMMAND_signed_write_confirmation){
328407513dbSMilanka Ringwald hci_setup_le_connection(att_con_handle);
329407513dbSMilanka Ringwald
330407513dbSMilanka Ringwald uint8_t signed_write_value[] = {0x12};
331407513dbSMilanka Ringwald uint8_t hash[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
332407513dbSMilanka Ringwald uint16_t signed_write_characteristic_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_CSC_FEATURE);
333407513dbSMilanka Ringwald
334407513dbSMilanka Ringwald uint8_t att_request[20];
335407513dbSMilanka Ringwald int value_length = sizeof(signed_write_value);
336407513dbSMilanka Ringwald att_request[0] = ATT_SIGNED_WRITE_COMMAND;
337407513dbSMilanka Ringwald little_endian_store_16(att_request, 1, signed_write_characteristic_handle);
338407513dbSMilanka Ringwald memcpy(&att_request[3], signed_write_value, value_length);
339407513dbSMilanka Ringwald little_endian_store_32(att_request, 3 + value_length, 0);
340407513dbSMilanka Ringwald reverse_64(hash, &att_request[3 + value_length + 4]);
341407513dbSMilanka Ringwald
342407513dbSMilanka Ringwald // wrong size
343407513dbSMilanka Ringwald mock_call_att_server_packet_handler(ATT_DATA_PACKET, att_con_handle, &att_request[0], value_length + 12u);
344407513dbSMilanka Ringwald
345407513dbSMilanka Ringwald set_cmac_ready(0);
346407513dbSMilanka Ringwald mock_call_att_server_packet_handler(ATT_DATA_PACKET, att_con_handle, &att_request[0], value_length + 12u + 3u);
347407513dbSMilanka Ringwald
348407513dbSMilanka Ringwald set_cmac_ready(1);
349407513dbSMilanka Ringwald mock_call_att_server_packet_handler(ATT_DATA_PACKET, att_con_handle, &att_request[0], value_length + 12u + 3u);
350407513dbSMilanka Ringwald
351407513dbSMilanka Ringwald // set ir_lookup_active = 1
352407513dbSMilanka Ringwald uint8_t buffer[20];
353407513dbSMilanka Ringwald buffer[0] = SM_EVENT_IDENTITY_RESOLVING_STARTED;
354407513dbSMilanka Ringwald buffer[1] = 9;
355407513dbSMilanka Ringwald little_endian_store_16(buffer, 2, att_con_handle);
356407513dbSMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], 11);
357407513dbSMilanka Ringwald
358407513dbSMilanka Ringwald mock_call_att_server_packet_handler(ATT_DATA_PACKET, att_con_handle, &att_request[0], value_length + 12u + 3u);
359407513dbSMilanka Ringwald
360407513dbSMilanka Ringwald buffer[0] = SM_EVENT_IDENTITY_RESOLVING_SUCCEEDED;
361407513dbSMilanka Ringwald buffer[1] = 18; // H1B1B2
362ec4690afSMatthias Ringwald little_endian_store_16(buffer, 18, 0);
363407513dbSMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], 11);
364407513dbSMilanka Ringwald }
365407513dbSMilanka Ringwald
366407513dbSMilanka Ringwald
TEST(ATT_SERVER,att_packet_handler_ATT_UNKNOWN_PACKET)367a0a19446SMilanka Ringwald TEST(ATT_SERVER, att_packet_handler_ATT_UNKNOWN_PACKET){
368a0a19446SMilanka Ringwald uint16_t value_handle = gatt_server_get_client_configuration_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
369a0a19446SMilanka Ringwald uint8_t buffer[] = {1, 0};
370a0a19446SMilanka Ringwald
371a0a19446SMilanka Ringwald uint16_t att_request_len = att_write_request(ATT_WRITE_REQUEST, value_handle, sizeof(buffer), buffer);
372a0a19446SMilanka Ringwald mock_call_att_server_packet_handler(0xFF, att_con_handle, &att_request[0], att_request_len);
373a0a19446SMilanka Ringwald }
374a0a19446SMilanka Ringwald
TEST(ATT_SERVER,att_packet_handler_HCI_EVENT_PACKET_L2CAP_EVENT_CAN_SEND_NOW)375a0a19446SMilanka Ringwald TEST(ATT_SERVER, att_packet_handler_HCI_EVENT_PACKET_L2CAP_EVENT_CAN_SEND_NOW){
376a0a19446SMilanka Ringwald uint16_t value_handle = gatt_server_get_client_configuration_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
377a0a19446SMilanka Ringwald // local cid
378a0a19446SMilanka Ringwald uint8_t buffer[] = {1, 0};
379a0a19446SMilanka Ringwald
380a0a19446SMilanka Ringwald uint16_t att_request_len = att_write_request(L2CAP_EVENT_CAN_SEND_NOW, value_handle, sizeof(buffer), buffer);
381a0a19446SMilanka Ringwald mock_call_att_server_packet_handler(HCI_EVENT_PACKET, att_con_handle, &att_request[0], att_request_len);
382a0a19446SMilanka Ringwald }
383a0a19446SMilanka Ringwald
TEST(ATT_SERVER,att_packet_handler_HCI_EVENT_PACKET_ATT_EVENT_MTU_EXCHANGE_COMPLETE)384a0a19446SMilanka Ringwald TEST(ATT_SERVER, att_packet_handler_HCI_EVENT_PACKET_ATT_EVENT_MTU_EXCHANGE_COMPLETE){
385a0a19446SMilanka Ringwald uint16_t value_handle = gatt_server_get_client_configuration_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
386a0a19446SMilanka Ringwald uint8_t buffer[4];
387a0a19446SMilanka Ringwald
388a0a19446SMilanka Ringwald // invalid con handle
389a0a19446SMilanka Ringwald memset(buffer, 0, sizeof(buffer));
390a0a19446SMilanka Ringwald little_endian_store_16(buffer, 2, 256);
391a0a19446SMilanka Ringwald
392a0a19446SMilanka Ringwald uint16_t att_request_len = att_write_request(ATT_EVENT_MTU_EXCHANGE_COMPLETE, value_handle, sizeof(buffer), buffer);
393a0a19446SMilanka Ringwald mock_call_att_server_packet_handler(HCI_EVENT_PACKET, 0, &att_request[0], att_request_len);
394a0a19446SMilanka Ringwald
395a0a19446SMilanka Ringwald little_endian_store_16(buffer, 0, att_con_handle);
396a0a19446SMilanka Ringwald att_request_len = att_write_request(ATT_EVENT_MTU_EXCHANGE_COMPLETE, value_handle, sizeof(buffer), buffer);
397a0a19446SMilanka Ringwald mock_call_att_server_packet_handler(HCI_EVENT_PACKET, att_con_handle, &att_request[0], att_request_len);
398a0a19446SMilanka Ringwald }
399a0a19446SMilanka Ringwald
TEST(ATT_SERVER,att_packet_handler_HCI_EVENT_PACKET_ATT_EVENT_UNKNOWN)400a0a19446SMilanka Ringwald TEST(ATT_SERVER, att_packet_handler_HCI_EVENT_PACKET_ATT_EVENT_UNKNOWN){
401a0a19446SMilanka Ringwald uint16_t value_handle = gatt_server_get_client_configuration_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
402a0a19446SMilanka Ringwald uint8_t buffer[] = {1, 0};
403a0a19446SMilanka Ringwald
404a0a19446SMilanka Ringwald // unknown subevent
405a0a19446SMilanka Ringwald uint16_t att_request_len = att_write_request(0x7bu, value_handle, sizeof(buffer), buffer);
406a0a19446SMilanka Ringwald mock_call_att_server_packet_handler(HCI_EVENT_PACKET, att_con_handle, &att_request[0], att_request_len);
407a0a19446SMilanka Ringwald }
408a0a19446SMilanka Ringwald
TEST(ATT_SERVER,connection_complete_event)4098206902cSMilanka Ringwald TEST(ATT_SERVER, connection_complete_event){
4108206902cSMilanka Ringwald uint8_t buffer[21];
4118206902cSMilanka Ringwald buffer[0] = HCI_EVENT_LE_META;
4128206902cSMilanka Ringwald buffer[1] = 19;
4138206902cSMilanka Ringwald buffer[2] = HCI_SUBEVENT_LE_CONNECTION_COMPLETE;
4148206902cSMilanka Ringwald
4158206902cSMilanka Ringwald // call with wrong con_handle
4168206902cSMilanka Ringwald little_endian_store_16(buffer,4,HCI_CON_HANDLE_INVALID);
4178206902cSMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], sizeof(buffer));
4188206902cSMilanka Ringwald
4198206902cSMilanka Ringwald // call with correct con_handle
4208206902cSMilanka Ringwald little_endian_store_16(buffer,4,att_con_handle);
4218206902cSMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], sizeof(buffer));
4228206902cSMilanka Ringwald
4238206902cSMilanka Ringwald // use max MTU > ATT_REQUEST_BUFFER_SIZE
4248206902cSMilanka Ringwald mock_l2cap_set_max_mtu(ATT_REQUEST_BUFFER_SIZE + 10);
4258206902cSMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], sizeof(buffer));
4268206902cSMilanka Ringwald
4278206902cSMilanka Ringwald // wrong subevent
4288206902cSMilanka Ringwald buffer[2] = 0xFF;
4298206902cSMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], sizeof(buffer));
4308206902cSMilanka Ringwald }
4318206902cSMilanka Ringwald
TEST(ATT_SERVER,unknown_packet_type)432407513dbSMilanka Ringwald TEST(ATT_SERVER, unknown_packet_type){
433407513dbSMilanka Ringwald uint8_t buffer[21];
434407513dbSMilanka Ringwald buffer[0] = HCI_EVENT_LE_META;
435407513dbSMilanka Ringwald buffer[1] = 1;
436407513dbSMilanka Ringwald buffer[2] = HCI_SUBEVENT_LE_CONNECTION_COMPLETE;
437407513dbSMilanka Ringwald
438407513dbSMilanka Ringwald mock_call_att_packet_handler(0xFF, 0, &buffer[0], sizeof(buffer));
439407513dbSMilanka Ringwald }
440407513dbSMilanka Ringwald
441407513dbSMilanka Ringwald
TEST(ATT_SERVER,connection_disconnect_complete_event)4428206902cSMilanka Ringwald TEST(ATT_SERVER, connection_disconnect_complete_event) {
4438206902cSMilanka Ringwald uint8_t buffer[6];
4448206902cSMilanka Ringwald buffer[0] = HCI_EVENT_DISCONNECTION_COMPLETE;
4458206902cSMilanka Ringwald buffer[1] = 19;
4468206902cSMilanka Ringwald buffer[2] = 0;
4478206902cSMilanka Ringwald
4488206902cSMilanka Ringwald // call with wrong con_handle
449d8612558SMilanka Ringwald hci_setup_le_connection(att_con_handle);
4508206902cSMilanka Ringwald little_endian_store_16(buffer, 3, HCI_CON_HANDLE_INVALID);
4518206902cSMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], sizeof(buffer));
4528206902cSMilanka Ringwald
453a0a19446SMilanka Ringwald // call with correct con_handle, classic connection
454a0a19446SMilanka Ringwald hci_setup_classic_connection(att_con_handle);
455a0a19446SMilanka Ringwald little_endian_store_16(buffer, 3, att_con_handle);
456a0a19446SMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], sizeof(buffer));
457a0a19446SMilanka Ringwald
458a0a19446SMilanka Ringwald // call with correct con_handle, le connection
459d8612558SMilanka Ringwald hci_setup_le_connection(att_con_handle);
4608206902cSMilanka Ringwald little_endian_store_16(buffer, 3, att_con_handle);
4618206902cSMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], sizeof(buffer));
462d8612558SMilanka Ringwald
463a0a19446SMilanka Ringwald
464d8612558SMilanka Ringwald hci_setup_le_connection(att_con_handle);
465d8612558SMilanka Ringwald static uint8_t value[] = {0x55};
466d8612558SMilanka Ringwald uint16_t value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
467d8612558SMilanka Ringwald l2cap_can_send_fixed_channel_packet_now_set_status(1);
468d8612558SMilanka Ringwald // correct command
469d8612558SMilanka Ringwald uint8_t status = att_server_indicate(att_con_handle, value_handle, &value[0], 0);
470d8612558SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
471d8612558SMilanka Ringwald
472d8612558SMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], sizeof(buffer));
4738206902cSMilanka Ringwald }
4748206902cSMilanka Ringwald
test_hci_event_encryption_events(hci_con_handle_t con_handle,uint8_t con_handle_index,uint8_t * buffer,uint16_t buffer_size)475a0a19446SMilanka Ringwald static void test_hci_event_encryption_events(hci_con_handle_t con_handle, uint8_t con_handle_index, uint8_t * buffer, uint16_t buffer_size){
476a0a19446SMilanka Ringwald // call with wrong con_handle
477a0a19446SMilanka Ringwald hci_setup_le_connection(con_handle);
478a0a19446SMilanka Ringwald little_endian_store_16(buffer, con_handle_index, HCI_CON_HANDLE_INVALID);
479a0a19446SMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], buffer_size);
480a0a19446SMilanka Ringwald
481a0a19446SMilanka Ringwald // call with correct con_handle, classic connection
482a0a19446SMilanka Ringwald hci_setup_classic_connection(con_handle);
483a0a19446SMilanka Ringwald little_endian_store_16(buffer, con_handle_index, con_handle);
484a0a19446SMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], buffer_size);
485a0a19446SMilanka Ringwald
486a0a19446SMilanka Ringwald // call with correct con_handle, le connection
487a0a19446SMilanka Ringwald hci_setup_le_connection(con_handle);
488a0a19446SMilanka Ringwald little_endian_store_16(buffer, con_handle_index, con_handle);
489a0a19446SMilanka Ringwald mock_call_att_packet_handler(HCI_EVENT_PACKET, 0, &buffer[0], buffer_size);
490a0a19446SMilanka Ringwald }
491a0a19446SMilanka Ringwald
TEST(ATT_SERVER,att_server_multiple_notify)492*ce000057SMilanka Ringwald TEST(ATT_SERVER, att_server_multiple_notify) {
493*ce000057SMilanka Ringwald
494*ce000057SMilanka Ringwald const uint16_t attribute_handles[] = {gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL)};
495*ce000057SMilanka Ringwald const uint16_t value_lens[] = { 1};
496*ce000057SMilanka Ringwald static uint8_t battery_value[] = {0x55};
497*ce000057SMilanka Ringwald const uint8_t * value_data[] = {battery_value };
498*ce000057SMilanka Ringwald uint8_t num_attributes = 1;
499*ce000057SMilanka Ringwald
500*ce000057SMilanka Ringwald hci_setup_le_connection(att_con_handle);
501*ce000057SMilanka Ringwald // correct command
502*ce000057SMilanka Ringwald uint8_t status = att_server_multiple_notify(att_con_handle, 1, attribute_handles, value_data, value_lens);
503*ce000057SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
504*ce000057SMilanka Ringwald
505*ce000057SMilanka Ringwald // invalid con handle
506*ce000057SMilanka Ringwald status = att_server_multiple_notify(HCI_CON_HANDLE_INVALID, 1, attribute_handles, value_data, value_lens);
507*ce000057SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
508*ce000057SMilanka Ringwald }
509*ce000057SMilanka Ringwald
TEST(ATT_SERVER,hci_event_encryption_key_refresh_complete_event)510a0a19446SMilanka Ringwald TEST(ATT_SERVER, hci_event_encryption_key_refresh_complete_event) {
511a0a19446SMilanka Ringwald uint8_t buffer[5];
512a0a19446SMilanka Ringwald buffer[0] = HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE;
513a0a19446SMilanka Ringwald buffer[1] = 3;
514a0a19446SMilanka Ringwald buffer[2] = 0;
515a0a19446SMilanka Ringwald // con_handle (2)
516a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 3, buffer, sizeof(buffer));
517a0a19446SMilanka Ringwald }
518a0a19446SMilanka Ringwald
TEST(ATT_SERVER,hci_event_encryption_change_v2_event)519a0a19446SMilanka Ringwald TEST(ATT_SERVER, hci_event_encryption_change_v2_event) {
520a0a19446SMilanka Ringwald uint8_t buffer[7];
521a0a19446SMilanka Ringwald buffer[0] = HCI_EVENT_ENCRYPTION_CHANGE_V2;
522a0a19446SMilanka Ringwald buffer[1] = 5;
523a0a19446SMilanka Ringwald buffer[2] = 0;
524a0a19446SMilanka Ringwald // con_handle (2)
525a0a19446SMilanka Ringwald // encryption_key_size
526a0a19446SMilanka Ringwald buffer[6] = 1;
527a0a19446SMilanka Ringwald // encryption_enabled (1)
528a0a19446SMilanka Ringwald buffer[5] = 0;
529a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 3, buffer, sizeof(buffer));
530a0a19446SMilanka Ringwald
531a0a19446SMilanka Ringwald // encryption_enabled (1)
532a0a19446SMilanka Ringwald buffer[5] = 1;
533a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 3, buffer, sizeof(buffer));
534a0a19446SMilanka Ringwald }
535a0a19446SMilanka Ringwald
TEST(ATT_SERVER,hci_event_encryption_change_event)536a0a19446SMilanka Ringwald TEST(ATT_SERVER, hci_event_encryption_change_event) {
537a0a19446SMilanka Ringwald uint8_t buffer[6];
538a0a19446SMilanka Ringwald buffer[0] = HCI_EVENT_ENCRYPTION_CHANGE;
539a0a19446SMilanka Ringwald buffer[1] = 4;
540a0a19446SMilanka Ringwald buffer[2] = 0;
541407513dbSMilanka Ringwald // con_handle (2)att_packet_handler_ATT_UNKNOWN_PACKET
542a0a19446SMilanka Ringwald
543a0a19446SMilanka Ringwald // encryption_enabled (1)
544a0a19446SMilanka Ringwald buffer[5] = 0;
545a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 3, buffer, sizeof(buffer));
546a0a19446SMilanka Ringwald
547a0a19446SMilanka Ringwald // encryption_enabled (1)
548a0a19446SMilanka Ringwald buffer[5] = 1;
549a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 3, buffer, sizeof(buffer));
550a0a19446SMilanka Ringwald }
551a0a19446SMilanka Ringwald
TEST(ATT_SERVER,sm_event_identity_resolving_started_event)552a0a19446SMilanka Ringwald TEST(ATT_SERVER, sm_event_identity_resolving_started_event) {
553a0a19446SMilanka Ringwald uint8_t buffer[11];
554a0a19446SMilanka Ringwald buffer[0] = SM_EVENT_IDENTITY_RESOLVING_STARTED;
555a0a19446SMilanka Ringwald buffer[1] = 9;
556a0a19446SMilanka Ringwald
557a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 2, buffer, sizeof(buffer));
558a0a19446SMilanka Ringwald }
559a0a19446SMilanka Ringwald
TEST(ATT_SERVER,sm_event_identity_resolving_succeeded_event)560a0a19446SMilanka Ringwald TEST(ATT_SERVER, sm_event_identity_resolving_succeeded_event) {
561a0a19446SMilanka Ringwald uint8_t buffer[20];
562a0a19446SMilanka Ringwald buffer[0] = SM_EVENT_IDENTITY_RESOLVING_SUCCEEDED;
563a0a19446SMilanka Ringwald buffer[1] = 18; // H1B1B2
564ec4690afSMatthias Ringwald little_endian_store_16(buffer, 18, 0);
565a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 2, buffer, sizeof(buffer));
566a0a19446SMilanka Ringwald }
567a0a19446SMilanka Ringwald
TEST(ATT_SERVER,sm_event_identity_resolving_failed_event)568a0a19446SMilanka Ringwald TEST(ATT_SERVER, sm_event_identity_resolving_failed_event) {
569a0a19446SMilanka Ringwald uint8_t buffer[11];
570a0a19446SMilanka Ringwald buffer[0] = SM_EVENT_IDENTITY_RESOLVING_FAILED;
571a0a19446SMilanka Ringwald buffer[1] = 9;
572a0a19446SMilanka Ringwald
573a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 2, buffer, sizeof(buffer));
574a0a19446SMilanka Ringwald }
575a0a19446SMilanka Ringwald
576a0a19446SMilanka Ringwald //
577a0a19446SMilanka Ringwald
TEST(ATT_SERVER,sm_event_just_works_request_event)578a0a19446SMilanka Ringwald TEST(ATT_SERVER, sm_event_just_works_request_event) {
579a0a19446SMilanka Ringwald uint8_t buffer[11];
580a0a19446SMilanka Ringwald buffer[0] = SM_EVENT_JUST_WORKS_REQUEST;
581a0a19446SMilanka Ringwald buffer[1] = 9;
582a0a19446SMilanka Ringwald
583a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 2, buffer, sizeof(buffer));
584a0a19446SMilanka Ringwald }
585a0a19446SMilanka Ringwald
TEST(ATT_SERVER,sm_event_passkey_display_number_event)586a0a19446SMilanka Ringwald TEST(ATT_SERVER, sm_event_passkey_display_number_event) {
587a0a19446SMilanka Ringwald uint8_t buffer[11];
588a0a19446SMilanka Ringwald buffer[0] = SM_EVENT_PASSKEY_DISPLAY_NUMBER;
589a0a19446SMilanka Ringwald buffer[1] = 9;
590a0a19446SMilanka Ringwald
591a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 2, buffer, sizeof(buffer));
592a0a19446SMilanka Ringwald }
593a0a19446SMilanka Ringwald
TEST(ATT_SERVER,sm_event_passkey_input_number_event)594a0a19446SMilanka Ringwald TEST(ATT_SERVER, sm_event_passkey_input_number_event) {
595a0a19446SMilanka Ringwald uint8_t buffer[11];
596a0a19446SMilanka Ringwald buffer[0] = SM_EVENT_PASSKEY_INPUT_NUMBER;
597a0a19446SMilanka Ringwald buffer[1] = 9;
598a0a19446SMilanka Ringwald
599a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 2, buffer, sizeof(buffer));
600a0a19446SMilanka Ringwald }
601a0a19446SMilanka Ringwald
TEST(ATT_SERVER,sm_event_numeric_comparison_request_event)602a0a19446SMilanka Ringwald TEST(ATT_SERVER, sm_event_numeric_comparison_request_event) {
603a0a19446SMilanka Ringwald uint8_t buffer[11];
604a0a19446SMilanka Ringwald buffer[0] = SM_EVENT_NUMERIC_COMPARISON_REQUEST;
605a0a19446SMilanka Ringwald buffer[1] = 9;
606a0a19446SMilanka Ringwald
607a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 2, buffer, sizeof(buffer));
608a0a19446SMilanka Ringwald }
609a0a19446SMilanka Ringwald
TEST(ATT_SERVER,sm_event_identity_created_event)610a0a19446SMilanka Ringwald TEST(ATT_SERVER, sm_event_identity_created_event) {
6119d6c9516SMilanka Ringwald uint8_t buffer[20];
612a0a19446SMilanka Ringwald buffer[0] = SM_EVENT_IDENTITY_CREATED;
613a0a19446SMilanka Ringwald buffer[1] = 9;
614a0a19446SMilanka Ringwald
615a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 2, buffer, sizeof(buffer));
616a0a19446SMilanka Ringwald }
617a0a19446SMilanka Ringwald
TEST(ATT_SERVER,sm_event_pairing_complete_event)618a0a19446SMilanka Ringwald TEST(ATT_SERVER, sm_event_pairing_complete_event) {
619a0a19446SMilanka Ringwald uint8_t buffer[11];
620a0a19446SMilanka Ringwald buffer[0] = SM_EVENT_PAIRING_COMPLETE;
621a0a19446SMilanka Ringwald buffer[1] = 9;
622a0a19446SMilanka Ringwald
623a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 2, buffer, sizeof(buffer));
624a0a19446SMilanka Ringwald }
625a0a19446SMilanka Ringwald
TEST(ATT_SERVER,sm_event_authorization_result_event)626a0a19446SMilanka Ringwald TEST(ATT_SERVER, sm_event_authorization_result_event) {
6279d6c9516SMilanka Ringwald uint8_t buffer[12];
628a0a19446SMilanka Ringwald buffer[0] = SM_EVENT_AUTHORIZATION_RESULT;
629a0a19446SMilanka Ringwald buffer[1] = 9;
630a0a19446SMilanka Ringwald
631a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 2, buffer, sizeof(buffer));
632a0a19446SMilanka Ringwald }
633a0a19446SMilanka Ringwald
TEST(ATT_SERVER,unknown_event)634a0a19446SMilanka Ringwald TEST(ATT_SERVER, unknown_event) {
635a0a19446SMilanka Ringwald uint8_t buffer[11];
636a0a19446SMilanka Ringwald buffer[0] = 0xFF;
637a0a19446SMilanka Ringwald buffer[1] = 9;
638a0a19446SMilanka Ringwald
639a0a19446SMilanka Ringwald test_hci_event_encryption_events(att_con_handle, 2, buffer, sizeof(buffer));
640a0a19446SMilanka Ringwald }
641a0a19446SMilanka Ringwald
TEST(ATT_SERVER,att_server_register_service_handler)642ef3eb5efSMilanka Ringwald TEST(ATT_SERVER, att_server_register_service_handler) {
643ef3eb5efSMilanka Ringwald att_service_handler_t test_service;
644ef3eb5efSMilanka Ringwald test_service.read_callback = att_read_callback;
645ef3eb5efSMilanka Ringwald test_service.write_callback = att_write_callback;
6468206902cSMilanka Ringwald
647ef3eb5efSMilanka Ringwald uint16_t start_handle = 0;
648ef3eb5efSMilanka Ringwald uint16_t end_handle = 0xffff;
649ef3eb5efSMilanka Ringwald int service_found = gatt_server_get_handle_range_for_service_with_uuid16(ORG_BLUETOOTH_SERVICE_BATTERY_SERVICE, &start_handle, &end_handle);
650ef3eb5efSMilanka Ringwald CHECK_EQUAL(service_found, 1);
651ef3eb5efSMilanka Ringwald
652ef3eb5efSMilanka Ringwald test_service.start_handle = start_handle;
653ef3eb5efSMilanka Ringwald test_service.end_handle = end_handle;
654ef3eb5efSMilanka Ringwald att_server_register_service_handler(&test_service);
655ef3eb5efSMilanka Ringwald
656ef3eb5efSMilanka Ringwald test_service.start_handle = start_handle;
657ef3eb5efSMilanka Ringwald test_service.end_handle = 0;
658ef3eb5efSMilanka Ringwald att_server_register_service_handler(&test_service);
659ef3eb5efSMilanka Ringwald
660ef3eb5efSMilanka Ringwald test_service.start_handle = 0;
661ef3eb5efSMilanka Ringwald test_service.end_handle = end_handle;
662ef3eb5efSMilanka Ringwald att_server_register_service_handler(&test_service);
663ef3eb5efSMilanka Ringwald
664ef3eb5efSMilanka Ringwald test_service.start_handle = 0;
665ef3eb5efSMilanka Ringwald test_service.end_handle = 0;
666ef3eb5efSMilanka Ringwald att_server_register_service_handler(&test_service);
667ef3eb5efSMilanka Ringwald }
668d8612558SMilanka Ringwald
main(int argc,const char * argv[])669e0ff5d41SMatthias Ringwald int main (int argc, const char * argv[]){
670e0ff5d41SMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv);
671e0ff5d41SMatthias Ringwald }
672