xref: /btstack/test/l2cap-ecbm/l2cap_ecbm_test.cpp (revision 98e87e7776ef9a7fe55135aea8cddc761fe3a7a5)
1af7c3ae6SMatthias Ringwald 
2af7c3ae6SMatthias Ringwald // hal_cpu
3af7c3ae6SMatthias Ringwald #include "hal_cpu.h"
hal_cpu_disable_irqs(void)4af7c3ae6SMatthias Ringwald void hal_cpu_disable_irqs(void){}
hal_cpu_enable_irqs(void)5af7c3ae6SMatthias Ringwald void hal_cpu_enable_irqs(void){}
hal_cpu_enable_irqs_and_sleep(void)6af7c3ae6SMatthias Ringwald void hal_cpu_enable_irqs_and_sleep(void){}
7af7c3ae6SMatthias Ringwald 
8af7c3ae6SMatthias Ringwald // mock_sm.c
9af7c3ae6SMatthias Ringwald #include "ble/sm.h"
sm_add_event_handler(btstack_packet_callback_registration_t * callback_handler)10af7c3ae6SMatthias Ringwald void sm_add_event_handler(btstack_packet_callback_registration_t * callback_handler){}
sm_request_pairing(hci_con_handle_t con_handle)11af7c3ae6SMatthias Ringwald void sm_request_pairing(hci_con_handle_t con_handle){}
12af7c3ae6SMatthias Ringwald 
13af7c3ae6SMatthias Ringwald // mock_hci_transport.h
14af7c3ae6SMatthias Ringwald #include "hci_transport.h"
15af7c3ae6SMatthias Ringwald void mock_hci_transport_receive_packet(uint8_t packet_type, uint8_t * packet, uint16_t size);
16af7c3ae6SMatthias Ringwald const hci_transport_t * mock_hci_transport_mock_get_instance(void);
17af7c3ae6SMatthias Ringwald 
18af7c3ae6SMatthias Ringwald // mock_hci_transport.c
19af7c3ae6SMatthias Ringwald #include <stddef.h>
20af7c3ae6SMatthias Ringwald static uint8_t  mock_hci_transport_outgoing_packet_buffer[HCI_ACL_PAYLOAD_SIZE];
21af7c3ae6SMatthias Ringwald static uint16_t mock_hci_transport_outgoing_packet_size;
22af7c3ae6SMatthias Ringwald static uint8_t  mock_hci_transport_outgoing_packet_type;
23af7c3ae6SMatthias Ringwald 
24af7c3ae6SMatthias Ringwald static void (*mock_hci_transport_packet_handler)(uint8_t packet_type, uint8_t * packet, uint16_t size);
mock_hci_transport_register_packet_handler(void (* packet_handler)(uint8_t packet_type,uint8_t * packet,uint16_t size))25af7c3ae6SMatthias Ringwald static void mock_hci_transport_register_packet_handler(void (*packet_handler)(uint8_t packet_type, uint8_t * packet, uint16_t size)){
26af7c3ae6SMatthias Ringwald     mock_hci_transport_packet_handler = packet_handler;
27af7c3ae6SMatthias Ringwald }
mock_hci_transport_send_packet(uint8_t packet_type,uint8_t * packet,int size)28af7c3ae6SMatthias Ringwald static int mock_hci_transport_send_packet(uint8_t packet_type, uint8_t *packet, int size){
29af7c3ae6SMatthias Ringwald     mock_hci_transport_outgoing_packet_type = packet_type;
30af7c3ae6SMatthias Ringwald     mock_hci_transport_outgoing_packet_size = size;
31af7c3ae6SMatthias Ringwald     memcpy(mock_hci_transport_outgoing_packet_buffer, packet, size);
32af7c3ae6SMatthias Ringwald     return 0;
33af7c3ae6SMatthias Ringwald }
mock_hci_transport_mock_get_instance(void)34af7c3ae6SMatthias Ringwald const hci_transport_t * mock_hci_transport_mock_get_instance(void){
35af7c3ae6SMatthias Ringwald     static hci_transport_t mock_hci_transport = {
36af7c3ae6SMatthias Ringwald         /*  .transport.name                          = */  "mock",
37af7c3ae6SMatthias Ringwald         /*  .transport.init                          = */  NULL,
38af7c3ae6SMatthias Ringwald         /*  .transport.open                          = */  NULL,
39af7c3ae6SMatthias Ringwald         /*  .transport.close                         = */  NULL,
40af7c3ae6SMatthias Ringwald         /*  .transport.register_packet_handler       = */  &mock_hci_transport_register_packet_handler,
41af7c3ae6SMatthias Ringwald         /*  .transport.can_send_packet_now           = */  NULL,
42af7c3ae6SMatthias Ringwald         /*  .transport.send_packet                   = */  &mock_hci_transport_send_packet,
43af7c3ae6SMatthias Ringwald         /*  .transport.set_baudrate                  = */  NULL,
44af7c3ae6SMatthias Ringwald     };
45af7c3ae6SMatthias Ringwald     return &mock_hci_transport;
46af7c3ae6SMatthias Ringwald }
mock_hci_transport_receive_packet(uint8_t packet_type,const uint8_t * packet,uint16_t size)47af7c3ae6SMatthias Ringwald void mock_hci_transport_receive_packet(uint8_t packet_type, const uint8_t * packet, uint16_t size){
48af7c3ae6SMatthias Ringwald     (*mock_hci_transport_packet_handler)(packet_type, (uint8_t *) packet, size);
49af7c3ae6SMatthias Ringwald }
50af7c3ae6SMatthias Ringwald 
51af7c3ae6SMatthias Ringwald // copy from hci.c
mock_hci_emit_disconnection_complete(hci_con_handle_t con_handle,uint8_t reason)52af7c3ae6SMatthias Ringwald static void mock_hci_emit_disconnection_complete(hci_con_handle_t con_handle, uint8_t reason){
53af7c3ae6SMatthias Ringwald     uint8_t event[6];
54af7c3ae6SMatthias Ringwald     event[0] = HCI_EVENT_DISCONNECTION_COMPLETE;
55af7c3ae6SMatthias Ringwald     event[1] = sizeof(event) - 2u;
56af7c3ae6SMatthias Ringwald     event[2] = 0; // status = OK
57af7c3ae6SMatthias Ringwald     little_endian_store_16(event, 3, con_handle);
58af7c3ae6SMatthias Ringwald     event[5] = reason;
59af7c3ae6SMatthias Ringwald     (*mock_hci_transport_packet_handler)(HCI_EVENT_PACKET, event, sizeof(event));
60af7c3ae6SMatthias Ringwald }
61af7c3ae6SMatthias Ringwald 
62af7c3ae6SMatthias Ringwald //
63af7c3ae6SMatthias Ringwald 
64af7c3ae6SMatthias Ringwald #include <stdint.h>
65af7c3ae6SMatthias Ringwald #include <stdio.h>
66af7c3ae6SMatthias Ringwald #include <stdlib.h>
67af7c3ae6SMatthias Ringwald #include <string.h>
68af7c3ae6SMatthias Ringwald 
69af7c3ae6SMatthias Ringwald #include "CppUTest/TestHarness.h"
70af7c3ae6SMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
71af7c3ae6SMatthias Ringwald #include "CppUTestExt/MockSupport.h"
72af7c3ae6SMatthias Ringwald 
73af7c3ae6SMatthias Ringwald #include "hci_dump.h"
74af7c3ae6SMatthias Ringwald #include "btstack_debug.h"
75af7c3ae6SMatthias Ringwald #include "l2cap.h"
76af7c3ae6SMatthias Ringwald #include "btstack_memory.h"
77af7c3ae6SMatthias Ringwald #include "btstack_run_loop_embedded.h"
78af7c3ae6SMatthias Ringwald #include "hci_dump_posix_stdout.h"
79af7c3ae6SMatthias Ringwald #include "btstack_event.h"
80af7c3ae6SMatthias Ringwald 
81af7c3ae6SMatthias Ringwald #define TEST_PACKET_SIZE       100
82af7c3ae6SMatthias Ringwald #define HCI_CON_HANDLE_TEST_LE 0x0005
83af7c3ae6SMatthias Ringwald #define HCI_CON_HANDLE_TEST_CLASSIC 0x0003
84af7c3ae6SMatthias Ringwald #define TEST_PSM 0x1001
85af7c3ae6SMatthias Ringwald 
86af7c3ae6SMatthias Ringwald static bool l2cap_channel_accept_incoming;
87af7c3ae6SMatthias Ringwald static uint16_t initial_credits = L2CAP_LE_AUTOMATIC_CREDITS;
88af7c3ae6SMatthias Ringwald static uint8_t data_channel_buffer_1[TEST_PACKET_SIZE];
89af7c3ae6SMatthias Ringwald static uint8_t data_channel_buffer_2[TEST_PACKET_SIZE];
90af7c3ae6SMatthias Ringwald static uint16_t l2cap_cids[10];
91af7c3ae6SMatthias Ringwald static uint16_t num_l2cap_channel_opened;
92af7c3ae6SMatthias Ringwald static uint16_t num_l2cap_channel_closed;
93af7c3ae6SMatthias Ringwald static uint8_t * receive_buffers_2[] = { data_channel_buffer_1, data_channel_buffer_2 };
94af7c3ae6SMatthias Ringwald static uint8_t * reconfigure_buffers_2[] = {data_channel_buffer_1, data_channel_buffer_2 };
95af7c3ae6SMatthias Ringwald static uint8_t  received_packet[TEST_PACKET_SIZE];
96af7c3ae6SMatthias Ringwald static uint16_t reconfigure_result;
97af7c3ae6SMatthias Ringwald static btstack_packet_callback_registration_t l2cap_event_callback_registration;
98af7c3ae6SMatthias Ringwald 
99af7c3ae6SMatthias Ringwald // two channels with cids 0x041 and 0x042
100af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_le_conn_request_1[] = {
101af7c3ae6SMatthias Ringwald         0x05, 0x20, 0x14, 0x00, 0x10, 0x00, 0x05, 0x00, 0x17, 0x01, 0x0c, 0x00, 0x01, 0x10, 0x64, 0x00,
102af7c3ae6SMatthias Ringwald         0x30, 0x00, 0xff, 0xff, 0x41, 0x00, 0x42, 0x00
103af7c3ae6SMatthias Ringwald };
104af7c3ae6SMatthias Ringwald 
105af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_classic_conn_request_1[] = {
106af7c3ae6SMatthias Ringwald         0x03, 0x20, 0x14, 0x00, 0x10, 0x00, 0x01, 0x00, 0x17, 0x01, 0x0c, 0x00, 0x01, 0x10, 0x64, 0x00,
107af7c3ae6SMatthias Ringwald         0x30, 0x00, 0xff, 0xff, 0x41, 0x00, 0x42, 0x00
108af7c3ae6SMatthias Ringwald };
109af7c3ae6SMatthias Ringwald 
110af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_le_conn_response_2_failed[] = {
111af7c3ae6SMatthias Ringwald         0x05, 0x20, 0x14, 0x00, 0x10, 0x00, 0x05, 0x00, 0x18, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
112af7c3ae6SMatthias Ringwald         0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00
113af7c3ae6SMatthias Ringwald };
114af7c3ae6SMatthias Ringwald 
115af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_le_conn_response_2_success[] = {
116af7c3ae6SMatthias Ringwald         0x05, 0x20, 0x14, 0x00, 0x10, 0x00, 0x05, 0x00, 0x18, 0x01, 0x0c, 0x00, 0x64, 0x00, 0x30, 0x00,
117af7c3ae6SMatthias Ringwald         0xff, 0xff, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00
118af7c3ae6SMatthias Ringwald };
119af7c3ae6SMatthias Ringwald 
120af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_classic_conn_response_2_success[] = {
121af7c3ae6SMatthias Ringwald         0x03, 0x20, 0x14, 0x00, 0x10, 0x00, 0x01, 0x00, 0x18, 0x01, 0x0c, 0x00, 0x64, 0x00, 0x30, 0x00,
122af7c3ae6SMatthias Ringwald         0xff, 0xff, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00
123af7c3ae6SMatthias Ringwald };
124af7c3ae6SMatthias Ringwald 
125af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_le_credits[] = {
126af7c3ae6SMatthias Ringwald         0x05, 0x20, 0x0c, 0x00, 0x08, 0x00, 0x05, 0x00,  0x16, 0x02, 0x04, 0x00,  0x41, 0x00, 0x05, 0x00,
127af7c3ae6SMatthias Ringwald };
128af7c3ae6SMatthias Ringwald 
129af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_classic_credits[] = {
130af7c3ae6SMatthias Ringwald         0x03, 0x20, 0x0c, 0x00, 0x08, 0x00, 0x01, 0x00,  0x16, 0x02, 0x04, 0x00,  0x41, 0x00, 0x05, 0x00,
131af7c3ae6SMatthias Ringwald };
132af7c3ae6SMatthias Ringwald 
133af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_le_single_packet[] = {
134af7c3ae6SMatthias Ringwald         0x05, 0x20, 0x0b, 0x00, 0x07, 0x00, 0x41, 0x00, 0x05, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f
135af7c3ae6SMatthias Ringwald };
136af7c3ae6SMatthias Ringwald 
137af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_classic_single_packet[] = {
138af7c3ae6SMatthias Ringwald         0x03, 0x20, 0x0b, 0x00, 0x07, 0x00, 0x41, 0x00, 0x05, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f
139af7c3ae6SMatthias Ringwald };
140af7c3ae6SMatthias Ringwald 
141af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_le_disconnect_request_1[] = {
142af7c3ae6SMatthias Ringwald         0x05, 0x20, 0x0c, 0x00, 0x08, 0x00, 0x05, 0x00, 0x06, 0x02, 0x04, 0x00, 0x41, 0x00, 0x41, 0x00
143af7c3ae6SMatthias Ringwald };
144af7c3ae6SMatthias Ringwald 
145af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_le_disconnect_response_1[] = {
146af7c3ae6SMatthias Ringwald         0x05, 0x20, 0x0c, 0x00, 0x08, 0x00, 0x05, 0x00, 0x07, 0x02, 0x04, 0x00, 0x41, 0x00, 0x41, 0x00
147af7c3ae6SMatthias Ringwald };
148af7c3ae6SMatthias Ringwald 
149af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_le_disconnect_request_2[] = {
150af7c3ae6SMatthias Ringwald         0x05, 0x20, 0x0c, 0x00, 0x08, 0x00, 0x05, 0x00, 0x06, 0x03, 0x04, 0x00, 0x42, 0x00, 0x42, 0x00
151af7c3ae6SMatthias Ringwald };
152af7c3ae6SMatthias Ringwald 
153af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_le_disconnect_response_2[] = {
154af7c3ae6SMatthias Ringwald         0x05, 0x20, 0x0c, 0x00, 0x08, 0x00, 0x05, 0x00, 0x07, 0x03, 0x04, 0x00, 0x42, 0x00, 0x42, 0x00
155af7c3ae6SMatthias Ringwald };
156af7c3ae6SMatthias Ringwald 
157af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_classic_disconnect_request_1[] = {
158af7c3ae6SMatthias Ringwald         0x03, 0x20, 0x0c, 0x00, 0x08, 0x00, 0x01, 0x00, 0x06, 0x02, 0x04, 0x00, 0x41, 0x00, 0x41, 0x00
159af7c3ae6SMatthias Ringwald };
160af7c3ae6SMatthias Ringwald 
161af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_classic_disconnect_response_1[] = {
162af7c3ae6SMatthias Ringwald         0x03, 0x20, 0x0c, 0x00, 0x08, 0x00, 0x01, 0x00, 0x07, 0x02, 0x04, 0x00, 0x41, 0x00, 0x41, 0x00
163af7c3ae6SMatthias Ringwald };
164af7c3ae6SMatthias Ringwald 
165af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_classic_disconnect_request_2[] = {
166af7c3ae6SMatthias Ringwald         0x03, 0x20, 0x0c, 0x00, 0x08, 0x00, 0x01, 0x00, 0x06, 0x03, 0x04, 0x00, 0x42, 0x00, 0x42, 0x00
167af7c3ae6SMatthias Ringwald };
168af7c3ae6SMatthias Ringwald 
169af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_classic_disconnect_response_2[] = {
170af7c3ae6SMatthias Ringwald         0x03, 0x20, 0x0c, 0x00, 0x08, 0x00, 0x01, 0x00, 0x07, 0x03, 0x04, 0x00, 0x42, 0x00, 0x42, 0x00
171af7c3ae6SMatthias Ringwald };
172af7c3ae6SMatthias Ringwald 
173af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_le_renegotiate_request[] = {
174af7c3ae6SMatthias Ringwald         0x05, 0x20, 0x10, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x19, 0x02, 0x08, 0x00, 0x64, 0x00, 0x30, 0x00,
175af7c3ae6SMatthias Ringwald         0x41, 0x00, 0x42, 0x00
176af7c3ae6SMatthias Ringwald };
177af7c3ae6SMatthias Ringwald 
178af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_classic_renegotiate_request[] = {
179af7c3ae6SMatthias Ringwald         0x03, 0x20, 0x10, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x19, 0x02, 0x08, 0x00, 0x64, 0x00, 0x30, 0x00,
180af7c3ae6SMatthias Ringwald         0x41, 0x00, 0x42, 0x00
181af7c3ae6SMatthias Ringwald };
182af7c3ae6SMatthias Ringwald 
183af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_le_renegotiate_response[] = {
184af7c3ae6SMatthias Ringwald         0x05, 0x20, 0x0a, 0x00, 0x06, 0x00, 0x05, 0x00, 0x1a, 0x02, 0x02, 0x00, 0x00, 0x00
185af7c3ae6SMatthias Ringwald };
186af7c3ae6SMatthias Ringwald 
187af7c3ae6SMatthias Ringwald const uint8_t l2cap_enhanced_data_channel_classic_renegotiate_response[] = {
188af7c3ae6SMatthias Ringwald         0x03, 0x20, 0x0a, 0x00, 0x06, 0x00, 0x01, 0x00, 0x1a, 0x02, 0x02, 0x00, 0x00, 0x00
189af7c3ae6SMatthias Ringwald };
190af7c3ae6SMatthias Ringwald 
fix_boundary_flags(uint8_t * packet,uint16_t size)191af7c3ae6SMatthias Ringwald static void fix_boundary_flags(uint8_t * packet, uint16_t size){
192af7c3ae6SMatthias Ringwald     uint8_t acl_flags = packet[1] >> 4;
193af7c3ae6SMatthias Ringwald     if (acl_flags == 0){
194af7c3ae6SMatthias Ringwald         acl_flags = 2;  // first fragment
195af7c3ae6SMatthias Ringwald     }
196af7c3ae6SMatthias Ringwald     packet[1] = (packet[1] & 0x0f) | (acl_flags << 4);
197af7c3ae6SMatthias Ringwald }
198af7c3ae6SMatthias Ringwald 
print_acl(const char * name,const uint8_t * packet,uint16_t size)199af7c3ae6SMatthias Ringwald static void print_acl(const char * name, const uint8_t * packet, uint16_t size){
200af7c3ae6SMatthias Ringwald     printf("const uint8_t %s[] = {", name);
201af7c3ae6SMatthias Ringwald     uint16_t i;
202af7c3ae6SMatthias Ringwald     for (i=0;i<size;i++){
203af7c3ae6SMatthias Ringwald         if (i != 0){
204af7c3ae6SMatthias Ringwald             printf(", ");
205af7c3ae6SMatthias Ringwald         }
206af7c3ae6SMatthias Ringwald         if ((i % 16) == 0){
207af7c3ae6SMatthias Ringwald             printf("\n    ");
208af7c3ae6SMatthias Ringwald         }
209af7c3ae6SMatthias Ringwald         printf("0x%02x", packet[i]);
210af7c3ae6SMatthias Ringwald     }
211af7c3ae6SMatthias Ringwald     printf("\n};\n");
212af7c3ae6SMatthias Ringwald }
213af7c3ae6SMatthias Ringwald 
214af7c3ae6SMatthias Ringwald // print packet for test inclusion
215af7c3ae6SMatthias Ringwald // fix_boundary_flags(mock_hci_transport_outgoing_packet_buffer, mock_hci_transport_outgoing_packet_size);
216af7c3ae6SMatthias Ringwald // print_acl("l2cap_enhanced_data_channel_le_single_packet", mock_hci_transport_outgoing_packet_buffer, mock_hci_transport_outgoing_packet_size);
217af7c3ae6SMatthias Ringwald 
l2cap_channel_packet_handler(uint8_t packet_type,uint16_t channel,uint8_t * packet,uint16_t size)218af7c3ae6SMatthias Ringwald static void l2cap_channel_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
219af7c3ae6SMatthias Ringwald     UNUSED(channel);
220af7c3ae6SMatthias Ringwald     UNUSED(size);
221af7c3ae6SMatthias Ringwald     uint16_t psm;
222af7c3ae6SMatthias Ringwald     uint16_t cid;
223af7c3ae6SMatthias Ringwald     uint16_t cids[5];
224af7c3ae6SMatthias Ringwald     switch (packet_type) {
225af7c3ae6SMatthias Ringwald         case HCI_EVENT_PACKET:
226af7c3ae6SMatthias Ringwald             switch (hci_event_packet_get_type(packet)) {
227af7c3ae6SMatthias Ringwald                 case L2CAP_EVENT_ECBM_INCOMING_CONNECTION:
228af7c3ae6SMatthias Ringwald                     printf("L2CAP_EVENT_DATA_CHANNEL_INCOMING\n");
229af7c3ae6SMatthias Ringwald                     cid = l2cap_event_ecbm_incoming_connection_get_local_cid(packet);
230af7c3ae6SMatthias Ringwald                     if (l2cap_channel_accept_incoming){
231af7c3ae6SMatthias Ringwald                         l2cap_ecbm_accept_channels(cid, 2, initial_credits, TEST_PACKET_SIZE, receive_buffers_2, cids);
232af7c3ae6SMatthias Ringwald                     } else {
233af7c3ae6SMatthias Ringwald                         // reject request by providing zero buffers
234af7c3ae6SMatthias Ringwald                         l2cap_ecbm_accept_channels(cid, 0, 0, 0,NULL, NULL);
235af7c3ae6SMatthias Ringwald                     }
236af7c3ae6SMatthias Ringwald                     break;
237af7c3ae6SMatthias Ringwald                 case L2CAP_EVENT_ECBM_CHANNEL_OPENED:
238af7c3ae6SMatthias Ringwald                     l2cap_cids[num_l2cap_channel_opened] = l2cap_event_ecbm_channel_opened_get_local_cid(packet);
239af7c3ae6SMatthias Ringwald                     printf("L2CAP_EVENT_DATA_CHANNEL_OPENED - cid 0x%04x\n", l2cap_cids[num_l2cap_channel_opened] );
240af7c3ae6SMatthias Ringwald                     num_l2cap_channel_opened++;
241af7c3ae6SMatthias Ringwald                     break;
242af7c3ae6SMatthias Ringwald                 case L2CAP_EVENT_ECBM_RECONFIGURATION_COMPLETE:
243af7c3ae6SMatthias Ringwald                     reconfigure_result = l2cap_event_ecbm_reconfiguration_complete_get_reconfigure_result(packet);
244af7c3ae6SMatthias Ringwald                     break;
245af7c3ae6SMatthias Ringwald                 case L2CAP_EVENT_CHANNEL_CLOSED:
246af7c3ae6SMatthias Ringwald                     num_l2cap_channel_closed++;
247af7c3ae6SMatthias Ringwald                     break;
248af7c3ae6SMatthias Ringwald                 default:
249af7c3ae6SMatthias Ringwald                     break;
250af7c3ae6SMatthias Ringwald             }
251af7c3ae6SMatthias Ringwald             break;
252af7c3ae6SMatthias Ringwald         case L2CAP_DATA_PACKET:
253af7c3ae6SMatthias Ringwald             printf("Pacekt received (%u bytes): ", size);
254af7c3ae6SMatthias Ringwald             printf_hexdump(packet, size);
255af7c3ae6SMatthias Ringwald             memcpy(received_packet, packet, size);
256af7c3ae6SMatthias Ringwald             break;
257af7c3ae6SMatthias Ringwald         default:
258af7c3ae6SMatthias Ringwald             break;
259af7c3ae6SMatthias Ringwald     }
260af7c3ae6SMatthias Ringwald }
261af7c3ae6SMatthias Ringwald 
TEST_GROUP(L2CAP_CHANNELS)262af7c3ae6SMatthias Ringwald TEST_GROUP(L2CAP_CHANNELS){
263af7c3ae6SMatthias Ringwald     const hci_transport_t * hci_transport;
264af7c3ae6SMatthias Ringwald     void setup(void){
265af7c3ae6SMatthias Ringwald         btstack_memory_init();
266af7c3ae6SMatthias Ringwald         btstack_run_loop_init(btstack_run_loop_embedded_get_instance());
267af7c3ae6SMatthias Ringwald         hci_transport = mock_hci_transport_mock_get_instance();
268af7c3ae6SMatthias Ringwald         hci_init(hci_transport, NULL);
269af7c3ae6SMatthias Ringwald         l2cap_init();
270af7c3ae6SMatthias Ringwald         l2cap_event_callback_registration.callback = &l2cap_channel_packet_handler;
271af7c3ae6SMatthias Ringwald         l2cap_add_event_handler(&l2cap_event_callback_registration);
272af7c3ae6SMatthias Ringwald         l2cap_register_fixed_channel(&l2cap_channel_packet_handler, L2CAP_CID_ATTRIBUTE_PROTOCOL);
273af7c3ae6SMatthias Ringwald         hci_dump_init(hci_dump_posix_stdout_get_instance());
274af7c3ae6SMatthias Ringwald         num_l2cap_channel_opened = 0;
275af7c3ae6SMatthias Ringwald         num_l2cap_channel_closed = 0;
276af7c3ae6SMatthias Ringwald         memset(received_packet, 0, sizeof(received_packet));
277af7c3ae6SMatthias Ringwald     }
278af7c3ae6SMatthias Ringwald     void teardown(void){
279af7c3ae6SMatthias Ringwald         l2cap_deinit();
280af7c3ae6SMatthias Ringwald         hci_deinit();
281af7c3ae6SMatthias Ringwald         btstack_memory_deinit();
282af7c3ae6SMatthias Ringwald         btstack_run_loop_deinit();
283af7c3ae6SMatthias Ringwald     }
284af7c3ae6SMatthias Ringwald };
285af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,no_connection)286af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, no_connection){
287af7c3ae6SMatthias Ringwald     uint16_t cids[2];
288af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_LE, LEVEL_0, TEST_PSM,
289af7c3ae6SMatthias Ringwald                                                     2, initial_credits, TEST_PACKET_SIZE, receive_buffers_2, cids);
290af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
291af7c3ae6SMatthias Ringwald }
292af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_le_2_success)293af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_le_2_success){
294af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
295af7c3ae6SMatthias Ringwald     uint16_t cids[2];
296af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_LE, LEVEL_0, TEST_PSM,
297af7c3ae6SMatthias Ringwald                                                     2, initial_credits, TEST_PACKET_SIZE, receive_buffers_2, cids);
298af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
299af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_le_conn_response_2_success));
300af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
301af7c3ae6SMatthias Ringwald }
302af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_classic_2_success)303af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_classic_2_success){
304af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
305af7c3ae6SMatthias Ringwald     uint16_t cids[2];
306af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_CLASSIC, LEVEL_0, TEST_PSM,
307af7c3ae6SMatthias Ringwald                                                     2, initial_credits, TEST_PACKET_SIZE, receive_buffers_2, cids);
308af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
309af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_classic_conn_response_2_success));
310af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
311af7c3ae6SMatthias Ringwald }
312af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,incoming_no_service)313af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, incoming_no_service){
314af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
315af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_request_1, sizeof(l2cap_enhanced_data_channel_le_conn_request_1));
316af7c3ae6SMatthias Ringwald }
317af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,incoming_classic_no_service)318af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, incoming_classic_no_service){
319af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
320af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_conn_request_1, sizeof(l2cap_enhanced_data_channel_classic_conn_request_1));
321af7c3ae6SMatthias Ringwald }
322af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,incoming_1)323af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, incoming_1){
324af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
325*98e87e77SMatthias Ringwald     l2cap_ecbm_register_service(&l2cap_channel_packet_handler, TEST_PSM, TEST_PACKET_SIZE, LEVEL_0, false);
326af7c3ae6SMatthias Ringwald     l2cap_channel_accept_incoming = false;
327af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_request_1, sizeof(l2cap_enhanced_data_channel_le_conn_request_1));
328af7c3ae6SMatthias Ringwald     CHECK_EQUAL(0, num_l2cap_channel_opened);
329af7c3ae6SMatthias Ringwald }
330af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,incoming_2)331af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, incoming_2){
332af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
333*98e87e77SMatthias Ringwald     l2cap_ecbm_register_service(&l2cap_channel_packet_handler, TEST_PSM, TEST_PACKET_SIZE, LEVEL_0, false);
334af7c3ae6SMatthias Ringwald     l2cap_channel_accept_incoming = true;
335af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_request_1, sizeof(l2cap_enhanced_data_channel_le_conn_request_1));
336af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
337af7c3ae6SMatthias Ringwald }
338af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_le_receive_credits)339af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_le_receive_credits){
340af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
341af7c3ae6SMatthias Ringwald     uint16_t cids[2];
342af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_LE, LEVEL_0, TEST_PSM,
343af7c3ae6SMatthias Ringwald                                                     2, initial_credits, TEST_PACKET_SIZE, receive_buffers_2, cids);
344af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
345af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_le_conn_response_2_success));
346af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
347af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_credits, sizeof(l2cap_enhanced_data_channel_le_credits));
348af7c3ae6SMatthias Ringwald }
349af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_classic_receive_credits)350af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_classic_receive_credits){
351af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
352af7c3ae6SMatthias Ringwald     uint16_t cids[2];
353af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_CLASSIC, LEVEL_0, TEST_PSM,
354af7c3ae6SMatthias Ringwald                                                     2, initial_credits, TEST_PACKET_SIZE, receive_buffers_2, cids);
355af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
356af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_classic_conn_response_2_success));
357af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
358af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_credits, sizeof(l2cap_enhanced_data_channel_classic_credits));
359af7c3ae6SMatthias Ringwald }
360af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_le_send_packet)361af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_le_send_packet){
362af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
363af7c3ae6SMatthias Ringwald     uint16_t cids[2];
364af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_LE, LEVEL_0, TEST_PSM,
365af7c3ae6SMatthias Ringwald                                                     2, initial_credits, TEST_PACKET_SIZE, receive_buffers_2, cids);
366af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
367af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_le_conn_response_2_success));
368af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
369af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_credits, sizeof(l2cap_enhanced_data_channel_le_credits));
370af7c3ae6SMatthias Ringwald     status = l2cap_send(l2cap_cids[0], (const uint8_t *) "hello", 5);
371af7c3ae6SMatthias Ringwald }
372af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_classic_send_packet)373af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_classic_send_packet){
374af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
375af7c3ae6SMatthias Ringwald     uint16_t cids[2];
376af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_CLASSIC, LEVEL_0, TEST_PSM,
377af7c3ae6SMatthias Ringwald                                                     2, initial_credits, TEST_PACKET_SIZE, receive_buffers_2, cids);
378af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
379af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_classic_conn_response_2_success));
380af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
381af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_credits, sizeof(l2cap_enhanced_data_channel_classic_credits));
382af7c3ae6SMatthias Ringwald     status = l2cap_send(l2cap_cids[0], (const uint8_t *) "hello", 5);
383af7c3ae6SMatthias Ringwald }
384af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_le_receive_packet)385af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_le_receive_packet){
386af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
387af7c3ae6SMatthias Ringwald     uint16_t cids[2];
388af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_LE, LEVEL_0, TEST_PSM,
389af7c3ae6SMatthias Ringwald                                                     2, initial_credits, TEST_PACKET_SIZE, receive_buffers_2, cids);
390af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
391af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_le_conn_response_2_success));
392af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
393af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_single_packet, sizeof(l2cap_enhanced_data_channel_le_single_packet));
394af7c3ae6SMatthias Ringwald     MEMCMP_EQUAL("hello", received_packet, 5);
395af7c3ae6SMatthias Ringwald }
396af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_classic_receive_packet)397af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_classic_receive_packet){
398af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
399af7c3ae6SMatthias Ringwald     uint16_t cids[2];
400af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_CLASSIC, LEVEL_0, TEST_PSM,
401af7c3ae6SMatthias Ringwald                                                     2, initial_credits, TEST_PACKET_SIZE, receive_buffers_2, cids);
402af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
403af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_classic_conn_response_2_success));
404af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
405af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_single_packet, sizeof(l2cap_enhanced_data_channel_classic_single_packet));
406af7c3ae6SMatthias Ringwald     MEMCMP_EQUAL("hello", received_packet, 5);
407af7c3ae6SMatthias Ringwald }
408af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_le_provide_credits)409af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_le_provide_credits){
410af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
411af7c3ae6SMatthias Ringwald     uint16_t cids[2];
412af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_LE, LEVEL_0, TEST_PSM,
413af7c3ae6SMatthias Ringwald                                                     2, 0, TEST_PACKET_SIZE, receive_buffers_2, cids);
414af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
415af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_le_conn_response_2_success));
416af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
417af7c3ae6SMatthias Ringwald     status = l2cap_ecbm_provide_credits(l2cap_cids[0], 5);
418af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
419af7c3ae6SMatthias Ringwald }
420af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_classic_provide_credits)421af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_classic_provide_credits){
422af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
423af7c3ae6SMatthias Ringwald     uint16_t cids[2];
424af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_CLASSIC, LEVEL_0, TEST_PSM,
425af7c3ae6SMatthias Ringwald                                                     2, 0, TEST_PACKET_SIZE, receive_buffers_2, cids);
426af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
427af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_classic_conn_response_2_success));
428af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
429af7c3ae6SMatthias Ringwald     status = l2cap_ecbm_provide_credits(l2cap_cids[0], 5);
430af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
431af7c3ae6SMatthias Ringwald }
432af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_le_renegotiate_initiator)433af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_le_renegotiate_initiator){
434af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
435af7c3ae6SMatthias Ringwald     reconfigure_result = 0xffff;
436af7c3ae6SMatthias Ringwald     uint16_t cids[2];
437af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_LE, LEVEL_0, TEST_PSM,
438af7c3ae6SMatthias Ringwald                                                     2, 0, TEST_PACKET_SIZE, receive_buffers_2, cids);
439af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
440af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_le_conn_response_2_success));
441af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
442af7c3ae6SMatthias Ringwald     status = l2cap_ecbm_reconfigure_channels(2, l2cap_cids, TEST_PACKET_SIZE/2, reconfigure_buffers_2);
443af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
444af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_renegotiate_response, sizeof(l2cap_enhanced_data_channel_le_renegotiate_response));
445af7c3ae6SMatthias Ringwald     CHECK_EQUAL(0, reconfigure_result);
446af7c3ae6SMatthias Ringwald }
447af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_classic_renegotiate_initiator)448af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_classic_renegotiate_initiator){
449af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
450af7c3ae6SMatthias Ringwald     reconfigure_result = 0xffff;
451af7c3ae6SMatthias Ringwald     uint16_t cids[2];
452af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_CLASSIC, LEVEL_0, TEST_PSM,
453af7c3ae6SMatthias Ringwald                                                     2, 0, TEST_PACKET_SIZE, receive_buffers_2, cids);
454af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
455af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_classic_conn_response_2_success));
456af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
457af7c3ae6SMatthias Ringwald     status = l2cap_ecbm_reconfigure_channels(2, l2cap_cids, TEST_PACKET_SIZE/2, reconfigure_buffers_2);
458af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
459af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_renegotiate_response, sizeof(l2cap_enhanced_data_channel_classic_renegotiate_response));
460af7c3ae6SMatthias Ringwald     CHECK_EQUAL(0, reconfigure_result);
461af7c3ae6SMatthias Ringwald }
462af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_le_renegotiate_responder)463af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_le_renegotiate_responder){
464af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
465af7c3ae6SMatthias Ringwald     uint16_t cids[2];
466af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_LE, LEVEL_0, TEST_PSM,
467af7c3ae6SMatthias Ringwald                                                     2, 0, TEST_PACKET_SIZE, receive_buffers_2, cids);
468af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
469af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_le_conn_response_2_success));
470af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
471af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_renegotiate_request, sizeof(l2cap_enhanced_data_channel_le_renegotiate_request));
472af7c3ae6SMatthias Ringwald     fix_boundary_flags(mock_hci_transport_outgoing_packet_buffer, mock_hci_transport_outgoing_packet_size);
473af7c3ae6SMatthias Ringwald     print_acl("l2cap_enhanced_data_channel_le_renegotiate_response", mock_hci_transport_outgoing_packet_buffer, mock_hci_transport_outgoing_packet_size);
474af7c3ae6SMatthias Ringwald }
475af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_classic_renegotiate_responder)476af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_classic_renegotiate_responder){
477af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
478af7c3ae6SMatthias Ringwald     uint16_t cids[2];
479af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_CLASSIC, LEVEL_0, TEST_PSM,
480af7c3ae6SMatthias Ringwald                                                     2, 0, TEST_PACKET_SIZE, receive_buffers_2, cids);
481af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
482af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_classic_conn_response_2_success));
483af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
484af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_renegotiate_request, sizeof(l2cap_enhanced_data_channel_classic_renegotiate_request));
485af7c3ae6SMatthias Ringwald     fix_boundary_flags(mock_hci_transport_outgoing_packet_buffer, mock_hci_transport_outgoing_packet_size);
486af7c3ae6SMatthias Ringwald     print_acl("l2cap_enhanced_data_channel_classic_renegotiate_response", mock_hci_transport_outgoing_packet_buffer, mock_hci_transport_outgoing_packet_size);
487af7c3ae6SMatthias Ringwald }
488af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_le_disconnect_initiator)489af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_le_disconnect_initiator){
490af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
491af7c3ae6SMatthias Ringwald     uint16_t cids[2];
492af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_LE, LEVEL_0, TEST_PSM,
493af7c3ae6SMatthias Ringwald                                                     2, 0, TEST_PACKET_SIZE, receive_buffers_2, cids);
494af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
495af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_le_conn_response_2_success));
496af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
497af7c3ae6SMatthias Ringwald     l2cap_disconnect(l2cap_cids[0]);
498af7c3ae6SMatthias Ringwald     l2cap_disconnect(l2cap_cids[1]);
499af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_disconnect_response_1, sizeof(l2cap_enhanced_data_channel_le_disconnect_response_1));
500af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_disconnect_response_2, sizeof(l2cap_enhanced_data_channel_le_disconnect_response_2));
501af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_closed);
502af7c3ae6SMatthias Ringwald }
503af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_le_disconnect_responder)504af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_le_disconnect_responder){
505af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
506af7c3ae6SMatthias Ringwald     uint16_t cids[2];
507af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_LE, LEVEL_0, TEST_PSM,
508af7c3ae6SMatthias Ringwald                                                     2, 0, TEST_PACKET_SIZE, receive_buffers_2, cids);
509af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
510af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_le_conn_response_2_success));
511af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
512af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_disconnect_request_1, sizeof(l2cap_enhanced_data_channel_le_disconnect_request_1));
513af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_disconnect_request_2, sizeof(l2cap_enhanced_data_channel_le_disconnect_request_2));
514af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_closed);
515af7c3ae6SMatthias Ringwald }
516af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_classic_disconnect_initiator)517af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_classic_disconnect_initiator){
518af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
519af7c3ae6SMatthias Ringwald     uint16_t cids[2];
520af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_CLASSIC, LEVEL_0, TEST_PSM,
521af7c3ae6SMatthias Ringwald                                                     2, 0, TEST_PACKET_SIZE, receive_buffers_2, cids);
522af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
523af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_classic_conn_response_2_success));
524af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
525af7c3ae6SMatthias Ringwald     l2cap_disconnect(l2cap_cids[0]);
526af7c3ae6SMatthias Ringwald     l2cap_disconnect(l2cap_cids[1]);
527af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_disconnect_response_1, sizeof(l2cap_enhanced_data_channel_classic_disconnect_response_1));
528af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_disconnect_response_2, sizeof(l2cap_enhanced_data_channel_classic_disconnect_response_2));
529af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_closed);
530af7c3ae6SMatthias Ringwald }
531af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_classic_disconnect_responder)532af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_classic_disconnect_responder){
533af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
534af7c3ae6SMatthias Ringwald     uint16_t cids[2];
535af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_CLASSIC, LEVEL_0, TEST_PSM,
536af7c3ae6SMatthias Ringwald                                                     2, 0, TEST_PACKET_SIZE, receive_buffers_2, cids);
537af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
538af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_classic_conn_response_2_success));
539af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
540af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_disconnect_request_1, sizeof(l2cap_enhanced_data_channel_classic_disconnect_request_1));
541af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_disconnect_request_2, sizeof(l2cap_enhanced_data_channel_classic_disconnect_request_2));
542af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_closed);
543af7c3ae6SMatthias Ringwald }
544af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_le_hci_disconnect)545af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_le_hci_disconnect){
546af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
547af7c3ae6SMatthias Ringwald     uint16_t cids[2];
548af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_LE, LEVEL_0, TEST_PSM,
549af7c3ae6SMatthias Ringwald                                                     2, 0, TEST_PACKET_SIZE, receive_buffers_2, cids);
550af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
551af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_le_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_le_conn_response_2_success));
552af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
553af7c3ae6SMatthias Ringwald     mock_hci_emit_disconnection_complete(HCI_CON_HANDLE_TEST_LE, 0x13);
554af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_closed);
555af7c3ae6SMatthias Ringwald }
556af7c3ae6SMatthias Ringwald 
TEST(L2CAP_CHANNELS,outgoing_classic_hci_disconnect)557af7c3ae6SMatthias Ringwald TEST(L2CAP_CHANNELS, outgoing_classic_hci_disconnect){
558af7c3ae6SMatthias Ringwald     hci_setup_test_connections_fuzz();
559af7c3ae6SMatthias Ringwald     uint16_t cids[2];
560af7c3ae6SMatthias Ringwald     uint8_t status = l2cap_ecbm_create_channels(&l2cap_channel_packet_handler, HCI_CON_HANDLE_TEST_CLASSIC, LEVEL_0, TEST_PSM,
561af7c3ae6SMatthias Ringwald                                                     2, 0, TEST_PACKET_SIZE, receive_buffers_2, cids);
562af7c3ae6SMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
563af7c3ae6SMatthias Ringwald     mock_hci_transport_receive_packet(HCI_ACL_DATA_PACKET, l2cap_enhanced_data_channel_classic_conn_response_2_success, sizeof(l2cap_enhanced_data_channel_classic_conn_response_2_success));
564af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_opened);
565af7c3ae6SMatthias Ringwald     mock_hci_emit_disconnection_complete(HCI_CON_HANDLE_TEST_CLASSIC, 0x13);
566af7c3ae6SMatthias Ringwald     CHECK_EQUAL(2, num_l2cap_channel_closed);
567af7c3ae6SMatthias Ringwald }
568af7c3ae6SMatthias Ringwald 
main(int argc,const char * argv[])569af7c3ae6SMatthias Ringwald int main (int argc, const char * argv[]){
570af7c3ae6SMatthias Ringwald     return CommandLineTestRunner::RunAllTests(argc, argv);
571af7c3ae6SMatthias Ringwald }
572