xref: /nrf52832-nimble/packages/NimBLE-latest/nimble/host/test/src/ble_os_test.c (revision 042d53a763ad75cb1465103098bb88c245d95138)
1*042d53a7SEvalZero /*
2*042d53a7SEvalZero  * Licensed to the Apache Software Foundation (ASF) under one
3*042d53a7SEvalZero  * or more contributor license agreements.  See the NOTICE file
4*042d53a7SEvalZero  * distributed with this work for additional information
5*042d53a7SEvalZero  * regarding copyright ownership.  The ASF licenses this file
6*042d53a7SEvalZero  * to you under the Apache License, Version 2.0 (the
7*042d53a7SEvalZero  * "License"); you may not use this file except in compliance
8*042d53a7SEvalZero  * with the License.  You may obtain a copy of the License at
9*042d53a7SEvalZero  *
10*042d53a7SEvalZero  *  http://www.apache.org/licenses/LICENSE-2.0
11*042d53a7SEvalZero  *
12*042d53a7SEvalZero  * Unless required by applicable law or agreed to in writing,
13*042d53a7SEvalZero  * software distributed under the License is distributed on an
14*042d53a7SEvalZero  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15*042d53a7SEvalZero  * KIND, either express or implied.  See the License for the
16*042d53a7SEvalZero  * specific language governing permissions and limitations
17*042d53a7SEvalZero  * under the License.
18*042d53a7SEvalZero  */
19*042d53a7SEvalZero 
20*042d53a7SEvalZero #include <string.h>
21*042d53a7SEvalZero #include "os/os.h"
22*042d53a7SEvalZero #include "testutil/testutil.h"
23*042d53a7SEvalZero #include "nimble/hci_common.h"
24*042d53a7SEvalZero #include "nimble/ble_hci_trans.h"
25*042d53a7SEvalZero #include "host/ble_hs_test.h"
26*042d53a7SEvalZero #include "host/ble_gap.h"
27*042d53a7SEvalZero #include "ble_hs_test_util.h"
28*042d53a7SEvalZero 
29*042d53a7SEvalZero #define BLE_OS_TEST_STACK_SIZE      256
30*042d53a7SEvalZero #define BLE_OS_TEST_APP_STACK_SIZE  256
31*042d53a7SEvalZero 
32*042d53a7SEvalZero #define BLE_OS_TEST_APP_PRIO         9
33*042d53a7SEvalZero #define BLE_OS_TEST_TASK_PRIO        10
34*042d53a7SEvalZero 
35*042d53a7SEvalZero static struct os_task ble_os_test_task;
36*042d53a7SEvalZero static struct os_task ble_os_test_app_task;
37*042d53a7SEvalZero static os_stack_t ble_os_test_stack[OS_STACK_ALIGN(BLE_OS_TEST_STACK_SIZE)];
38*042d53a7SEvalZero 
39*042d53a7SEvalZero static os_stack_t
40*042d53a7SEvalZero ble_os_test_app_stack[OS_STACK_ALIGN(BLE_OS_TEST_APP_STACK_SIZE)];
41*042d53a7SEvalZero 
42*042d53a7SEvalZero static uint8_t ble_os_test_peer_addr[6] = { 1, 2, 3, 4, 5, 6 };
43*042d53a7SEvalZero 
44*042d53a7SEvalZero static void ble_os_test_app_task_handler(void *arg);
45*042d53a7SEvalZero 
46*042d53a7SEvalZero static int ble_os_test_gap_event_type;
47*042d53a7SEvalZero 
48*042d53a7SEvalZero static void
ble_os_test_init_app_task(void)49*042d53a7SEvalZero ble_os_test_init_app_task(void)
50*042d53a7SEvalZero {
51*042d53a7SEvalZero     int rc;
52*042d53a7SEvalZero 
53*042d53a7SEvalZero     rc = os_task_init(&ble_os_test_app_task,
54*042d53a7SEvalZero                       "ble_gap_terminate_test_task",
55*042d53a7SEvalZero                       ble_os_test_app_task_handler, NULL,
56*042d53a7SEvalZero                       BLE_OS_TEST_APP_PRIO, OS_WAIT_FOREVER,
57*042d53a7SEvalZero                       ble_os_test_app_stack,
58*042d53a7SEvalZero                       OS_STACK_ALIGN(BLE_OS_TEST_APP_STACK_SIZE));
59*042d53a7SEvalZero     TEST_ASSERT_FATAL(rc == 0);
60*042d53a7SEvalZero }
61*042d53a7SEvalZero 
62*042d53a7SEvalZero static void
ble_os_test_misc_init(void)63*042d53a7SEvalZero ble_os_test_misc_init(void)
64*042d53a7SEvalZero {
65*042d53a7SEvalZero     extern os_time_t g_os_time;
66*042d53a7SEvalZero 
67*042d53a7SEvalZero     ble_hs_test_util_init_no_start();
68*042d53a7SEvalZero 
69*042d53a7SEvalZero     /* Allow the OS to approach tick rollover.  This will help ensure host
70*042d53a7SEvalZero      * timers don't break when the tick counter resets.
71*042d53a7SEvalZero      */
72*042d53a7SEvalZero     g_os_time = UINT32_MAX - 10 * OS_TICKS_PER_SEC;
73*042d53a7SEvalZero 
74*042d53a7SEvalZero     /* Receive acknowledgements for the startup sequence.  We sent the
75*042d53a7SEvalZero      * corresponding requests when the host task was started.
76*042d53a7SEvalZero      */
77*042d53a7SEvalZero     ble_hs_test_util_hci_ack_set_startup();
78*042d53a7SEvalZero 
79*042d53a7SEvalZero     ble_os_test_init_app_task();
80*042d53a7SEvalZero }
81*042d53a7SEvalZero 
82*042d53a7SEvalZero static int
ble_os_test_misc_conn_exists(uint16_t conn_handle)83*042d53a7SEvalZero ble_os_test_misc_conn_exists(uint16_t conn_handle)
84*042d53a7SEvalZero {
85*042d53a7SEvalZero     struct ble_hs_conn *conn;
86*042d53a7SEvalZero 
87*042d53a7SEvalZero     ble_hs_lock();
88*042d53a7SEvalZero 
89*042d53a7SEvalZero     if (conn_handle == BLE_HS_CONN_HANDLE_NONE) {
90*042d53a7SEvalZero         conn = ble_hs_conn_first();
91*042d53a7SEvalZero     } else {
92*042d53a7SEvalZero         conn = ble_hs_conn_find(conn_handle);
93*042d53a7SEvalZero     }
94*042d53a7SEvalZero 
95*042d53a7SEvalZero     ble_hs_unlock();
96*042d53a7SEvalZero 
97*042d53a7SEvalZero     return conn != NULL;
98*042d53a7SEvalZero }
99*042d53a7SEvalZero 
100*042d53a7SEvalZero static int
ble_gap_direct_connect_test_connect_cb(struct ble_gap_event * event,void * arg)101*042d53a7SEvalZero ble_gap_direct_connect_test_connect_cb(struct ble_gap_event *event, void *arg)
102*042d53a7SEvalZero {
103*042d53a7SEvalZero     struct ble_gap_conn_desc desc;
104*042d53a7SEvalZero     int *cb_called;
105*042d53a7SEvalZero     int rc;
106*042d53a7SEvalZero 
107*042d53a7SEvalZero     cb_called = arg;
108*042d53a7SEvalZero     *cb_called = 1;
109*042d53a7SEvalZero 
110*042d53a7SEvalZero     TEST_ASSERT(event->type == BLE_GAP_EVENT_CONNECT);
111*042d53a7SEvalZero     TEST_ASSERT(event->connect.status == 0);
112*042d53a7SEvalZero     TEST_ASSERT(event->connect.conn_handle == 2);
113*042d53a7SEvalZero 
114*042d53a7SEvalZero     rc = ble_gap_conn_find(event->connect.conn_handle, &desc);
115*042d53a7SEvalZero     TEST_ASSERT_FATAL(rc == 0);
116*042d53a7SEvalZero     TEST_ASSERT(desc.peer_id_addr.type == BLE_ADDR_PUBLIC);
117*042d53a7SEvalZero     TEST_ASSERT(memcmp(desc.peer_id_addr.val, ble_os_test_peer_addr, 6) == 0);
118*042d53a7SEvalZero 
119*042d53a7SEvalZero     return 0;
120*042d53a7SEvalZero }
121*042d53a7SEvalZero 
122*042d53a7SEvalZero static void
ble_gap_direct_connect_test_task_handler(void * arg)123*042d53a7SEvalZero ble_gap_direct_connect_test_task_handler(void *arg)
124*042d53a7SEvalZero {
125*042d53a7SEvalZero     struct hci_le_conn_complete evt;
126*042d53a7SEvalZero     ble_addr_t addr = { BLE_ADDR_PUBLIC, { 1, 2, 3, 4, 5, 6 }};
127*042d53a7SEvalZero     int cb_called;
128*042d53a7SEvalZero     int rc;
129*042d53a7SEvalZero 
130*042d53a7SEvalZero     /* Set the connect callback so we can verify that it gets called with the
131*042d53a7SEvalZero      * proper arguments.
132*042d53a7SEvalZero      */
133*042d53a7SEvalZero     cb_called = 0;
134*042d53a7SEvalZero 
135*042d53a7SEvalZero     /* Make sure there are no created connections and no connections in
136*042d53a7SEvalZero      * progress.
137*042d53a7SEvalZero      */
138*042d53a7SEvalZero     TEST_ASSERT(!ble_os_test_misc_conn_exists(BLE_HS_CONN_HANDLE_NONE));
139*042d53a7SEvalZero 
140*042d53a7SEvalZero     /* Initiate a direct connection. */
141*042d53a7SEvalZero     ble_hs_test_util_connect(BLE_OWN_ADDR_PUBLIC, &addr, 0, NULL,
142*042d53a7SEvalZero                              ble_gap_direct_connect_test_connect_cb,
143*042d53a7SEvalZero                              &cb_called, 0);
144*042d53a7SEvalZero     TEST_ASSERT(!ble_os_test_misc_conn_exists(BLE_HS_CONN_HANDLE_NONE));
145*042d53a7SEvalZero     TEST_ASSERT(!cb_called);
146*042d53a7SEvalZero 
147*042d53a7SEvalZero     /* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */
148*042d53a7SEvalZero     ble_hs_test_util_hci_ack_set(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
149*042d53a7SEvalZero                              BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
150*042d53a7SEvalZero 
151*042d53a7SEvalZero     /* Receive an HCI connection-complete event. */
152*042d53a7SEvalZero     memset(&evt, 0, sizeof evt);
153*042d53a7SEvalZero     evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
154*042d53a7SEvalZero     evt.status = BLE_ERR_SUCCESS;
155*042d53a7SEvalZero     evt.connection_handle = 2;
156*042d53a7SEvalZero     memcpy(evt.peer_addr, addr.val, 6);
157*042d53a7SEvalZero     rc = ble_gap_rx_conn_complete(&evt, 0);
158*042d53a7SEvalZero     TEST_ASSERT(rc == 0);
159*042d53a7SEvalZero 
160*042d53a7SEvalZero     /* The connection should now be created. */
161*042d53a7SEvalZero     TEST_ASSERT(ble_os_test_misc_conn_exists(2));
162*042d53a7SEvalZero     TEST_ASSERT(cb_called);
163*042d53a7SEvalZero 
164*042d53a7SEvalZero     tu_restart();
165*042d53a7SEvalZero }
166*042d53a7SEvalZero 
TEST_CASE(ble_gap_direct_connect_test_case)167*042d53a7SEvalZero TEST_CASE(ble_gap_direct_connect_test_case)
168*042d53a7SEvalZero {
169*042d53a7SEvalZero     ble_os_test_misc_init();
170*042d53a7SEvalZero 
171*042d53a7SEvalZero     os_task_init(&ble_os_test_task,
172*042d53a7SEvalZero                  "ble_gap_direct_connect_test_task",
173*042d53a7SEvalZero                  ble_gap_direct_connect_test_task_handler, NULL,
174*042d53a7SEvalZero                  BLE_OS_TEST_TASK_PRIO, OS_WAIT_FOREVER, ble_os_test_stack,
175*042d53a7SEvalZero                  OS_STACK_ALIGN(BLE_OS_TEST_STACK_SIZE));
176*042d53a7SEvalZero 
177*042d53a7SEvalZero     os_start();
178*042d53a7SEvalZero }
179*042d53a7SEvalZero 
180*042d53a7SEvalZero static int
ble_os_disc_test_cb(struct ble_gap_event * event,void * arg)181*042d53a7SEvalZero ble_os_disc_test_cb(struct ble_gap_event *event, void *arg)
182*042d53a7SEvalZero {
183*042d53a7SEvalZero     int *cb_called;
184*042d53a7SEvalZero 
185*042d53a7SEvalZero     cb_called = arg;
186*042d53a7SEvalZero     *cb_called = 1;
187*042d53a7SEvalZero 
188*042d53a7SEvalZero     TEST_ASSERT(event->type == BLE_GAP_EVENT_DISC_COMPLETE);
189*042d53a7SEvalZero 
190*042d53a7SEvalZero     return 0;
191*042d53a7SEvalZero }
192*042d53a7SEvalZero 
193*042d53a7SEvalZero static void
ble_os_disc_test_task_handler(void * arg)194*042d53a7SEvalZero ble_os_disc_test_task_handler(void *arg)
195*042d53a7SEvalZero {
196*042d53a7SEvalZero     struct ble_gap_disc_params disc_params;
197*042d53a7SEvalZero     int cb_called;
198*042d53a7SEvalZero     int rc;
199*042d53a7SEvalZero 
200*042d53a7SEvalZero     /* Receive acknowledgements for the startup sequence.  We sent the
201*042d53a7SEvalZero      * corresponding requests when the host task was started.
202*042d53a7SEvalZero      */
203*042d53a7SEvalZero     ble_hs_test_util_hci_ack_set_startup();
204*042d53a7SEvalZero 
205*042d53a7SEvalZero     /* Set the connect callback so we can verify that it gets called with the
206*042d53a7SEvalZero      * proper arguments.
207*042d53a7SEvalZero      */
208*042d53a7SEvalZero     cb_called = 0;
209*042d53a7SEvalZero 
210*042d53a7SEvalZero     os_time_delay(10);
211*042d53a7SEvalZero 
212*042d53a7SEvalZero     /* Make sure there are no created connections and no connections in
213*042d53a7SEvalZero      * progress.
214*042d53a7SEvalZero      */
215*042d53a7SEvalZero     TEST_ASSERT(!ble_os_test_misc_conn_exists(BLE_HS_CONN_HANDLE_NONE));
216*042d53a7SEvalZero     TEST_ASSERT(!ble_gap_master_in_progress());
217*042d53a7SEvalZero 
218*042d53a7SEvalZero     /* Initiate the general discovery procedure with a 300 ms timeout. */
219*042d53a7SEvalZero     memset(&disc_params, 0, sizeof disc_params);
220*042d53a7SEvalZero     rc = ble_hs_test_util_disc(BLE_OWN_ADDR_PUBLIC, 300, &disc_params,
221*042d53a7SEvalZero                                ble_os_disc_test_cb,
222*042d53a7SEvalZero                                &cb_called, 0, 0);
223*042d53a7SEvalZero     TEST_ASSERT(rc == 0);
224*042d53a7SEvalZero     TEST_ASSERT(!ble_os_test_misc_conn_exists(BLE_HS_CONN_HANDLE_NONE));
225*042d53a7SEvalZero     TEST_ASSERT(ble_gap_master_in_progress());
226*042d53a7SEvalZero     TEST_ASSERT(!cb_called);
227*042d53a7SEvalZero 
228*042d53a7SEvalZero     /* Receive acks from the controller. */
229*042d53a7SEvalZero     TEST_ASSERT(!ble_os_test_misc_conn_exists(BLE_HS_CONN_HANDLE_NONE));
230*042d53a7SEvalZero     TEST_ASSERT(ble_gap_master_in_progress());
231*042d53a7SEvalZero     TEST_ASSERT(!cb_called);
232*042d53a7SEvalZero 
233*042d53a7SEvalZero     /* Wait 100 ms; verify scan still in progress. */
234*042d53a7SEvalZero     os_time_delay(100 * OS_TICKS_PER_SEC / 1000);
235*042d53a7SEvalZero     TEST_ASSERT(!ble_os_test_misc_conn_exists(BLE_HS_CONN_HANDLE_NONE));
236*042d53a7SEvalZero     TEST_ASSERT(ble_gap_master_in_progress());
237*042d53a7SEvalZero     TEST_ASSERT(!cb_called);
238*042d53a7SEvalZero 
239*042d53a7SEvalZero     ble_hs_test_util_hci_ack_set(
240*042d53a7SEvalZero         ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
241*042d53a7SEvalZero                                     BLE_HCI_OCF_LE_SET_SCAN_ENABLE),
242*042d53a7SEvalZero         0);
243*042d53a7SEvalZero 
244*042d53a7SEvalZero     /* Wait 250 more ms; verify scan completed. */
245*042d53a7SEvalZero     os_time_delay(250 * OS_TICKS_PER_SEC / 1000);
246*042d53a7SEvalZero     TEST_ASSERT(!ble_os_test_misc_conn_exists(BLE_HS_CONN_HANDLE_NONE));
247*042d53a7SEvalZero     TEST_ASSERT(!ble_gap_master_in_progress());
248*042d53a7SEvalZero     TEST_ASSERT(cb_called);
249*042d53a7SEvalZero 
250*042d53a7SEvalZero     tu_restart();
251*042d53a7SEvalZero }
252*042d53a7SEvalZero 
TEST_CASE(ble_os_disc_test_case)253*042d53a7SEvalZero TEST_CASE(ble_os_disc_test_case)
254*042d53a7SEvalZero {
255*042d53a7SEvalZero     ble_os_test_misc_init();
256*042d53a7SEvalZero 
257*042d53a7SEvalZero     os_task_init(&ble_os_test_task,
258*042d53a7SEvalZero                  "ble_os_disc_test_task",
259*042d53a7SEvalZero                  ble_os_disc_test_task_handler, NULL,
260*042d53a7SEvalZero                  BLE_OS_TEST_TASK_PRIO, OS_WAIT_FOREVER, ble_os_test_stack,
261*042d53a7SEvalZero                  OS_STACK_ALIGN(BLE_OS_TEST_STACK_SIZE));
262*042d53a7SEvalZero 
263*042d53a7SEvalZero     os_start();
264*042d53a7SEvalZero }
265*042d53a7SEvalZero 
266*042d53a7SEvalZero static int
ble_gap_terminate_cb(struct ble_gap_event * event,void * arg)267*042d53a7SEvalZero ble_gap_terminate_cb(struct ble_gap_event *event, void *arg)
268*042d53a7SEvalZero {
269*042d53a7SEvalZero     int *disconn_handle;
270*042d53a7SEvalZero 
271*042d53a7SEvalZero     ble_os_test_gap_event_type = event->type;
272*042d53a7SEvalZero 
273*042d53a7SEvalZero     if (event->type == BLE_GAP_EVENT_DISCONNECT) {
274*042d53a7SEvalZero         disconn_handle = arg;
275*042d53a7SEvalZero         *disconn_handle = event->disconnect.conn.conn_handle;
276*042d53a7SEvalZero     }
277*042d53a7SEvalZero 
278*042d53a7SEvalZero     return 0;
279*042d53a7SEvalZero }
280*042d53a7SEvalZero 
281*042d53a7SEvalZero static void
ble_gap_terminate_test_task_handler(void * arg)282*042d53a7SEvalZero ble_gap_terminate_test_task_handler(void *arg)
283*042d53a7SEvalZero {
284*042d53a7SEvalZero     struct hci_disconn_complete disconn_evt;
285*042d53a7SEvalZero     struct hci_le_conn_complete conn_evt;
286*042d53a7SEvalZero     ble_addr_t addr1 = { BLE_ADDR_PUBLIC, { 1, 2, 3, 4, 5, 6 }};
287*042d53a7SEvalZero     ble_addr_t addr2 = { BLE_ADDR_PUBLIC, { 2, 3, 4, 5, 6, 7 }};
288*042d53a7SEvalZero     int disconn_handle;
289*042d53a7SEvalZero     int rc;
290*042d53a7SEvalZero 
291*042d53a7SEvalZero     /* Receive acknowledgements for the startup sequence.  We sent the
292*042d53a7SEvalZero      * corresponding requests when the host task was started.
293*042d53a7SEvalZero      */
294*042d53a7SEvalZero     ble_hs_test_util_hci_ack_set_startup();
295*042d53a7SEvalZero 
296*042d53a7SEvalZero     /* Set the connect callback so we can verify that it gets called with the
297*042d53a7SEvalZero      * proper arguments.
298*042d53a7SEvalZero      */
299*042d53a7SEvalZero     disconn_handle = 0;
300*042d53a7SEvalZero 
301*042d53a7SEvalZero     /* Make sure there are no created connections and no connections in
302*042d53a7SEvalZero      * progress.
303*042d53a7SEvalZero      */
304*042d53a7SEvalZero     TEST_ASSERT(!ble_os_test_misc_conn_exists(BLE_HS_CONN_HANDLE_NONE));
305*042d53a7SEvalZero     TEST_ASSERT(!ble_gap_master_in_progress());
306*042d53a7SEvalZero 
307*042d53a7SEvalZero     /* Create two direct connections. */
308*042d53a7SEvalZero     ble_hs_test_util_connect(BLE_OWN_ADDR_PUBLIC,
309*042d53a7SEvalZero                              &addr1, 0, NULL, ble_gap_terminate_cb,
310*042d53a7SEvalZero                              &disconn_handle, 0);
311*042d53a7SEvalZero     /* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */
312*042d53a7SEvalZero     ble_hs_test_util_hci_ack_set(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
313*042d53a7SEvalZero                              BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
314*042d53a7SEvalZero     memset(&conn_evt, 0, sizeof conn_evt);
315*042d53a7SEvalZero     conn_evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
316*042d53a7SEvalZero     conn_evt.status = BLE_ERR_SUCCESS;
317*042d53a7SEvalZero     conn_evt.connection_handle = 1;
318*042d53a7SEvalZero     memcpy(conn_evt.peer_addr, addr1.val, 6);
319*042d53a7SEvalZero     rc = ble_gap_rx_conn_complete(&conn_evt, 0);
320*042d53a7SEvalZero     TEST_ASSERT(rc == 0);
321*042d53a7SEvalZero 
322*042d53a7SEvalZero     ble_hs_test_util_connect(BLE_OWN_ADDR_PUBLIC,
323*042d53a7SEvalZero                              &addr2, 0, NULL, ble_gap_terminate_cb,
324*042d53a7SEvalZero                              &disconn_handle, 0);
325*042d53a7SEvalZero     /* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */
326*042d53a7SEvalZero     ble_hs_test_util_hci_ack_set(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
327*042d53a7SEvalZero                              BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
328*042d53a7SEvalZero     memset(&conn_evt, 0, sizeof conn_evt);
329*042d53a7SEvalZero     conn_evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
330*042d53a7SEvalZero     conn_evt.status = BLE_ERR_SUCCESS;
331*042d53a7SEvalZero     conn_evt.connection_handle = 2;
332*042d53a7SEvalZero     memcpy(conn_evt.peer_addr, addr2.val, 6);
333*042d53a7SEvalZero     rc = ble_gap_rx_conn_complete(&conn_evt, 0);
334*042d53a7SEvalZero     TEST_ASSERT(rc == 0);
335*042d53a7SEvalZero 
336*042d53a7SEvalZero     TEST_ASSERT_FATAL(ble_os_test_misc_conn_exists(1));
337*042d53a7SEvalZero     TEST_ASSERT_FATAL(ble_os_test_misc_conn_exists(2));
338*042d53a7SEvalZero 
339*042d53a7SEvalZero     /* Terminate the first one. */
340*042d53a7SEvalZero     rc = ble_hs_test_util_conn_terminate(1, 0);
341*042d53a7SEvalZero     TEST_ASSERT(rc == 0);
342*042d53a7SEvalZero     disconn_evt.connection_handle = 1;
343*042d53a7SEvalZero     disconn_evt.status = 0;
344*042d53a7SEvalZero     disconn_evt.reason = BLE_ERR_REM_USER_CONN_TERM;
345*042d53a7SEvalZero     ble_hs_test_util_hci_rx_disconn_complete_event(&disconn_evt);
346*042d53a7SEvalZero     TEST_ASSERT(ble_os_test_gap_event_type == BLE_GAP_EVENT_DISCONNECT);
347*042d53a7SEvalZero     TEST_ASSERT(disconn_handle == 1);
348*042d53a7SEvalZero     TEST_ASSERT_FATAL(!ble_os_test_misc_conn_exists(1));
349*042d53a7SEvalZero     TEST_ASSERT_FATAL(ble_os_test_misc_conn_exists(2));
350*042d53a7SEvalZero 
351*042d53a7SEvalZero     /* Terminate the second one. */
352*042d53a7SEvalZero     rc = ble_hs_test_util_conn_terminate(2, 0);
353*042d53a7SEvalZero     TEST_ASSERT(rc == 0);
354*042d53a7SEvalZero     disconn_evt.connection_handle = 2;
355*042d53a7SEvalZero     disconn_evt.status = 0;
356*042d53a7SEvalZero     disconn_evt.reason = BLE_ERR_REM_USER_CONN_TERM;
357*042d53a7SEvalZero     ble_hs_test_util_hci_rx_disconn_complete_event(&disconn_evt);
358*042d53a7SEvalZero     TEST_ASSERT(ble_os_test_gap_event_type == BLE_GAP_EVENT_DISCONNECT);
359*042d53a7SEvalZero     TEST_ASSERT(disconn_handle == 2);
360*042d53a7SEvalZero     TEST_ASSERT_FATAL(!ble_os_test_misc_conn_exists(1));
361*042d53a7SEvalZero     TEST_ASSERT_FATAL(!ble_os_test_misc_conn_exists(2));
362*042d53a7SEvalZero 
363*042d53a7SEvalZero     tu_restart();
364*042d53a7SEvalZero }
365*042d53a7SEvalZero 
366*042d53a7SEvalZero static void
ble_os_test_app_task_handler(void * arg)367*042d53a7SEvalZero ble_os_test_app_task_handler(void *arg)
368*042d53a7SEvalZero {
369*042d53a7SEvalZero     while (1) {
370*042d53a7SEvalZero         os_eventq_run(os_eventq_dflt_get());
371*042d53a7SEvalZero     }
372*042d53a7SEvalZero }
373*042d53a7SEvalZero 
TEST_CASE(ble_gap_terminate_test_case)374*042d53a7SEvalZero TEST_CASE(ble_gap_terminate_test_case)
375*042d53a7SEvalZero {
376*042d53a7SEvalZero     ble_os_test_misc_init();
377*042d53a7SEvalZero 
378*042d53a7SEvalZero     os_task_init(&ble_os_test_task,
379*042d53a7SEvalZero                  "ble_gap_terminate_test_task",
380*042d53a7SEvalZero                  ble_gap_terminate_test_task_handler, NULL,
381*042d53a7SEvalZero                  BLE_OS_TEST_TASK_PRIO, OS_WAIT_FOREVER, ble_os_test_stack,
382*042d53a7SEvalZero                  OS_STACK_ALIGN(BLE_OS_TEST_STACK_SIZE));
383*042d53a7SEvalZero 
384*042d53a7SEvalZero     os_start();
385*042d53a7SEvalZero }
386*042d53a7SEvalZero 
TEST_SUITE(ble_os_test_suite)387*042d53a7SEvalZero TEST_SUITE(ble_os_test_suite)
388*042d53a7SEvalZero {
389*042d53a7SEvalZero     tu_suite_set_post_test_cb(ble_hs_test_util_post_test, NULL);
390*042d53a7SEvalZero 
391*042d53a7SEvalZero     ble_os_disc_test_case();
392*042d53a7SEvalZero     ble_gap_direct_connect_test_case();
393*042d53a7SEvalZero     ble_gap_terminate_test_case();
394*042d53a7SEvalZero }
395*042d53a7SEvalZero 
396*042d53a7SEvalZero int
ble_os_test_all(void)397*042d53a7SEvalZero ble_os_test_all(void)
398*042d53a7SEvalZero {
399*042d53a7SEvalZero     ble_os_test_suite();
400*042d53a7SEvalZero     return tu_any_failed;
401*042d53a7SEvalZero }
402