nimble/test: Update unittests after features exchange changes

After connection complete event host will read peers features and then
will use this information when selecting procedure for connection
parameters update. Both changes requires unittests to be updated:
- phony ack is added for complete event since it will send extra HCI
  command if connection is successful
- features event is injected to set features properly
- connection update failover from HCI to L2CAP is removed since this
  is selected based on features

X-Original-Commit: d4e2081c764d1cced4b61b8c03f8f52c5e76f418
This commit is contained in:
Andrzej Kaczmarek
2017-07-06 11:58:16 +02:00
parent 5c8d75e18b
commit 7dc864701f
6 changed files with 100 additions and 69 deletions
+31 -65
View File
@@ -832,6 +832,10 @@ TEST_CASE(ble_gap_test_case_conn_gen_good)
TEST_ASSERT(ble_gap_master_in_progress());
TEST_ASSERT(ble_hs_atomic_conn_flags(2, NULL) == BLE_HS_ENOTCONN);
/* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */
ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
/* Receive connection complete event. */
memset(&evt, 0, sizeof evt);
evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
@@ -1055,6 +1059,10 @@ TEST_CASE(ble_gap_test_case_conn_cancel_ctlr_fail)
*/
TEST_ASSERT(ble_gap_test_event.type == 0xff);
/* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */
ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
/* Allow connection complete to succeed. */
memset(&evt, 0, sizeof evt);
evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
@@ -1236,6 +1244,7 @@ TEST_CASE(ble_gap_test_case_conn_find)
BLE_ADDR_PUBLIC,
((uint8_t[6]){2,3,4,5,6,7}),
((uint8_t[6]){0,0,0,0,0,0}),
BLE_HS_TEST_CONN_FEAT_ALL,
ble_gap_test_util_connect_cb,
NULL);
@@ -1284,6 +1293,7 @@ TEST_CASE(ble_gap_test_case_conn_find)
BLE_ADDR_RANDOM_ID,
((uint8_t[6]){3,4,5,6,7,8}),
((uint8_t[6]){0x50,1,2,3,4,5}),
BLE_HS_TEST_CONN_FEAT_ALL,
ble_gap_test_util_connect_cb,
NULL);
@@ -1402,6 +1412,15 @@ ble_gap_test_util_adv(uint8_t own_addr_type,
/* Receive a connection complete event. */
if (conn_mode != BLE_GAP_CONN_MODE_NON) {
if (connect_status == BLE_ERR_SUCCESS) {
/*
* ble_gap_rx_conn_complete() will send extra HCI command, need
* phony ack
*/
ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
}
memset(&evt, 0, sizeof evt);
evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
evt.status = connect_status;
@@ -1808,7 +1827,6 @@ ble_gap_test_util_update_no_l2cap(struct ble_gap_upd_params *params,
static void
ble_gap_test_util_update_l2cap(struct ble_gap_upd_params *params,
uint8_t hci_status, int event_status,
uint16_t l2cap_result)
{
struct ble_l2cap_sig_update_params l2cap_params;
@@ -1820,8 +1838,9 @@ ble_gap_test_util_update_l2cap(struct ble_gap_upd_params *params,
ble_gap_test_util_init();
ble_hs_test_util_create_conn(2, peer_addr, ble_gap_test_util_connect_cb,
NULL);
ble_hs_test_util_create_conn_feat(2, peer_addr,
BLE_HS_TEST_CONN_FEAT_NO_CONN_PARAM,
ble_gap_test_util_connect_cb, NULL);
ble_hs_lock();
conn = ble_hs_conn_find(2);
@@ -1834,35 +1853,11 @@ ble_gap_test_util_update_l2cap(struct ble_gap_upd_params *params,
*/
ble_gap_test_util_reset_cb_info();
rc = ble_hs_test_util_conn_update(2, params, hci_status);
rc = ble_hs_test_util_conn_update(2, params, 0xFF);
TEST_ASSERT(rc == 0);
/* Verify tx of connection update command. */
ble_gap_test_util_verify_tx_update_conn(params);
switch (hci_status) {
case 0:
/* Receive connection update complete event. */
ble_gap_test_util_rx_update_complete(event_status, params);
break;
case BLE_ERR_UNKNOWN_HCI_CMD:
break;
default:
TEST_ASSERT_FATAL(0);
break;
}
TEST_ASSERT(ble_gap_dbg_update_active(2));
/* Attempt two duplicate updates; ensure BLE_HS_EALREADY gets returned
* both times. Make sure initial update still completes successfully
* (MYNEWT-702).
*/
rc = ble_hs_test_util_conn_update(2, params, 0);
TEST_ASSERT(rc == BLE_HS_EALREADY);
rc = ble_hs_test_util_conn_update(2, params, 0);
TEST_ASSERT(rc == BLE_HS_EALREADY);
l2cap_params.itvl_min = params->itvl_min;
l2cap_params.itvl_max = params->itvl_max;
l2cap_params.slave_latency = params->latency;
@@ -1974,8 +1969,9 @@ ble_gap_test_util_update_l2cap_tmo(struct ble_gap_upd_params *params,
ble_gap_test_util_init();
ble_hs_test_util_create_conn(2, peer_addr, ble_gap_test_util_connect_cb,
NULL);
ble_hs_test_util_create_conn_feat(2, peer_addr,
BLE_HS_TEST_CONN_FEAT_NO_CONN_PARAM,
ble_gap_test_util_connect_cb, NULL);
ble_hs_lock();
conn = ble_hs_conn_find(2);
@@ -1988,24 +1984,9 @@ ble_gap_test_util_update_l2cap_tmo(struct ble_gap_upd_params *params,
*/
ble_gap_test_util_reset_cb_info();
rc = ble_hs_test_util_conn_update(2, params, hci_status);
rc = ble_hs_test_util_conn_update(2, params, 0xFF);
TEST_ASSERT(rc == 0);
/* Verify tx of connection update command. */
ble_gap_test_util_verify_tx_update_conn(params);
switch (hci_status) {
case 0:
/* Receive connection update complete event. */
ble_gap_test_util_rx_update_complete(event_status, params);
break;
case BLE_ERR_UNKNOWN_HCI_CMD:
break;
default:
TEST_ASSERT_FATAL(0);
break;
}
TEST_ASSERT(ble_gap_dbg_update_active(2));
if (rx_l2cap) {
@@ -2418,26 +2399,11 @@ TEST_CASE(ble_gap_test_case_update_conn_l2cap)
.max_ce_len = 456,
};
/* Accepted L2CAP failover; success. */
ble_gap_test_util_update_l2cap(&params, BLE_ERR_UNKNOWN_HCI_CMD, 0,
BLE_L2CAP_SIG_UPDATE_RSP_RESULT_ACCEPT);
ble_gap_test_util_update_l2cap(&params, 0, BLE_ERR_UNSUPP_REM_FEATURE,
BLE_L2CAP_SIG_UPDATE_RSP_RESULT_ACCEPT);
/* Accepted L2CAP. */
ble_gap_test_util_update_l2cap(&params, BLE_L2CAP_SIG_UPDATE_RSP_RESULT_ACCEPT);
/* Accepted L2CAP failover; failure. */
ble_gap_test_util_update_l2cap(&params, BLE_ERR_UNKNOWN_HCI_CMD, 0,
BLE_L2CAP_SIG_UPDATE_RSP_RESULT_ACCEPT);
ble_gap_test_util_update_l2cap(&params, 0, BLE_ERR_UNSUPP_REM_FEATURE,
BLE_L2CAP_SIG_UPDATE_RSP_RESULT_ACCEPT);
/* Rejected L2CAP failovers. */
ble_gap_test_util_update_l2cap(&params, BLE_ERR_UNKNOWN_HCI_CMD, 0,
BLE_L2CAP_SIG_UPDATE_RSP_RESULT_REJECT);
ble_gap_test_util_update_l2cap(&params, 0, BLE_ERR_UNSUPP_REM_FEATURE,
BLE_L2CAP_SIG_UPDATE_RSP_RESULT_REJECT);
/* Don't attempt L2CAP failover on other event status. */
ble_gap_test_util_update_l2cap(&params, BLE_ERR_UNKNOWN_HCI_CMD, 0, 0);
/* Rejected L2CAP. */
ble_gap_test_util_update_l2cap(&params, BLE_L2CAP_SIG_UPDATE_RSP_RESULT_REJECT);
}
TEST_CASE(ble_gap_test_case_update_peer_good)
+12
View File
@@ -59,6 +59,10 @@ TEST_CASE(ble_hs_conn_test_direct_connect_success)
TEST_ASSERT(ble_gap_master_in_progress());
/* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */
ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
/* Receive successful connection complete event. */
memset(&evt, 0, sizeof evt);
evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
@@ -112,6 +116,10 @@ TEST_CASE(ble_hs_conn_test_direct_connectable_success)
TEST_ASSERT(!ble_gap_master_in_progress());
TEST_ASSERT(ble_gap_adv_active());
/* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */
ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
/* Receive successful connection complete event. */
memset(&evt, 0, sizeof evt);
evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
@@ -173,6 +181,10 @@ TEST_CASE(ble_hs_conn_test_undirect_connectable_success)
TEST_ASSERT(!ble_gap_master_in_progress());
TEST_ASSERT(ble_gap_adv_active());
/* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */
ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
/* Receive successful connection complete event. */
memset(&evt, 0, sizeof evt);
evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
+35 -3
View File
@@ -370,10 +370,12 @@ ble_hs_test_util_create_rpa_conn(uint16_t handle, uint8_t own_addr_type,
uint8_t peer_addr_type,
const uint8_t *peer_id_addr,
const uint8_t *peer_rpa,
uint8_t conn_features,
ble_gap_event_fn *cb, void *cb_arg)
{
ble_addr_t addr;
struct hci_le_conn_complete evt;
struct hci_le_rd_rem_supp_feat_complete evt2;
int rc;
addr.type = peer_addr_type;
@@ -382,6 +384,10 @@ ble_hs_test_util_create_rpa_conn(uint16_t handle, uint8_t own_addr_type,
ble_hs_test_util_connect(own_addr_type, &addr,
0, NULL, cb, cb_arg, 0);
/* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */
ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
memset(&evt, 0, sizeof evt);
evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
evt.status = BLE_ERR_SUCCESS;
@@ -398,6 +404,13 @@ ble_hs_test_util_create_rpa_conn(uint16_t handle, uint8_t own_addr_type,
rc = ble_gap_rx_conn_complete(&evt);
TEST_ASSERT(rc == 0);
evt2.subevent_code = BLE_HCI_LE_SUBEV_RD_REM_USED_FEAT;
evt2.status = BLE_ERR_SUCCESS;
evt2.connection_handle = handle;
memcpy(evt2.features, (uint8_t[]){ conn_features, 0, 0, 0, 0, 0, 0, 0 }, 8);
ble_gap_rx_rd_rem_sup_feat_complete(&evt2);
ble_hs_test_util_prev_hci_tx_clear();
}
@@ -409,7 +422,19 @@ ble_hs_test_util_create_conn(uint16_t handle, const uint8_t *peer_id_addr,
ble_hs_test_util_create_rpa_conn(handle, BLE_OWN_ADDR_PUBLIC, null_addr,
BLE_ADDR_PUBLIC, peer_id_addr,
null_addr, cb, cb_arg);
null_addr, BLE_HS_TEST_CONN_FEAT_ALL,
cb, cb_arg);
}
void
ble_hs_test_util_create_conn_feat(uint16_t handle, const uint8_t *peer_id_addr,
uint8_t conn_features, ble_gap_event_fn *cb, void *cb_arg)
{
static uint8_t null_addr[6];
ble_hs_test_util_create_rpa_conn(handle, BLE_OWN_ADDR_PUBLIC, null_addr,
BLE_ADDR_PUBLIC, peer_id_addr,
null_addr, conn_features, cb, cb_arg);
}
static void
@@ -862,8 +887,15 @@ ble_hs_test_util_conn_update(uint16_t conn_handle,
{
int rc;
ble_hs_test_util_set_ack(
BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_CONN_UPDATE), hci_status);
/*
* 0xFF is magic value used for cases where we expect update over L2CAP to
* be triggered - in this case we don't need phony ack.
*/
if (hci_status != 0xFF) {
ble_hs_test_util_set_ack(
BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_CONN_UPDATE),
hci_status);
}
rc = ble_gap_update_params(conn_handle, params);
return rc;
+7
View File
@@ -71,6 +71,9 @@ struct ble_hs_test_util_att_group_type_entry {
.hdh_len = (len) \
})
#define BLE_HS_TEST_CONN_FEAT_ALL (0xFF)
#define BLE_HS_TEST_CONN_FEAT_NO_CONN_PARAM (0xFD)
void ble_hs_test_util_prev_tx_enqueue(struct os_mbuf *om);
struct os_mbuf *ble_hs_test_util_prev_tx_dequeue(void);
struct os_mbuf *ble_hs_test_util_prev_tx_dequeue_pullup(void);
@@ -95,9 +98,13 @@ void ble_hs_test_util_create_rpa_conn(uint16_t handle, uint8_t own_addr_type,
uint8_t peer_addr_type,
const uint8_t *peer_id_addr,
const uint8_t *peer_rpa,
uint8_t conn_features,
ble_gap_event_fn *cb, void *cb_arg);
void ble_hs_test_util_create_conn(uint16_t handle, const uint8_t *addr,
ble_gap_event_fn *cb, void *cb_arg);
void ble_hs_test_util_create_conn_feat(uint16_t handle, const uint8_t *addr,
uint8_t conn_features,
ble_gap_event_fn *cb, void *cb_arg);
int ble_hs_test_util_connect(uint8_t own_addr_type,
const ble_addr_t *peer_addr,
int32_t duration_ms,
+10
View File
@@ -144,6 +144,10 @@ ble_gap_direct_connect_test_task_handler(void *arg)
TEST_ASSERT(!ble_os_test_misc_conn_exists(BLE_HS_CONN_HANDLE_NONE));
TEST_ASSERT(!cb_called);
/* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */
ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
/* Receive an HCI connection-complete event. */
memset(&evt, 0, sizeof evt);
evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
@@ -305,6 +309,9 @@ ble_gap_terminate_test_task_handler(void *arg)
ble_hs_test_util_connect(BLE_OWN_ADDR_PUBLIC,
&addr1, 0, NULL, ble_gap_terminate_cb,
&disconn_handle, 0);
/* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */
ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
memset(&conn_evt, 0, sizeof conn_evt);
conn_evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
conn_evt.status = BLE_ERR_SUCCESS;
@@ -316,6 +323,9 @@ ble_gap_terminate_test_task_handler(void *arg)
ble_hs_test_util_connect(BLE_OWN_ADDR_PUBLIC,
&addr2, 0, NULL, ble_gap_terminate_cb,
&disconn_handle, 0);
/* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */
ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE,
BLE_HCI_OCF_LE_RD_REM_FEAT), 0);
memset(&conn_evt, 0, sizeof conn_evt);
conn_evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
conn_evt.status = BLE_ERR_SUCCESS;
+5 -1
View File
@@ -537,6 +537,7 @@ ble_sm_test_util_init_good(struct ble_sm_test_params *params,
ble_hs_test_util_create_rpa_conn(2, out_us->addr_type, out_us->rpa,
out_peer->addr_type,
out_peer->id_addr, out_peer->rpa,
BLE_HS_TEST_CONN_FEAT_ALL,
ble_sm_test_util_conn_cb,
NULL);
@@ -1613,6 +1614,7 @@ ble_sm_test_util_peer_bonding_good(int send_enc_req,
ble_hs_test_util_create_rpa_conn(2, our_addr_type, our_rpa, peer_addr_type,
peer_id_addr, peer_rpa,
BLE_HS_TEST_CONN_FEAT_ALL,
ble_sm_test_util_conn_cb, NULL);
/* This test inspects and modifies the connection object after unlocking
@@ -1743,7 +1745,8 @@ ble_sm_test_util_us_bonding_good(int send_enc_req, uint8_t our_addr_type,
ble_hs_test_util_create_rpa_conn(2, our_addr_type, our_rpa,
peer_addr_type, peer_id_addr,
peer_rpa, ble_sm_test_util_conn_cb, NULL);
peer_rpa, BLE_HS_TEST_CONN_FEAT_ALL,
ble_sm_test_util_conn_cb, NULL);
/* This test inspects and modifies the connection object after unlocking
* the host mutex. It is not OK for real code to do this, but this test
@@ -2919,6 +2922,7 @@ ble_sm_test_util_repeat_pairing(struct ble_sm_test_params *params, int sc)
ble_hs_test_util_create_rpa_conn(2, our_entity.addr_type, our_entity.rpa,
peer_entity.addr_type,
peer_entity.id_addr, peer_entity.rpa,
BLE_HS_TEST_CONN_FEAT_ALL,
ble_sm_test_util_conn_cb,
NULL);
ble_hs_lock();