test: bsim: bluetooth: mesh: Wait until adv is actually sent

k_sleep may not be enough to let advertiser send the message. Instead we
should rely on the bt_mesh_send_cb.

Signed-off-by: Pavel Vasilyev <pavel.vasilyev@nordicsemi.no>
This commit is contained in:
Pavel Vasilyev 2024-10-30 14:29:43 +01:00 committed by Mahesh Mahadevan
commit 457a20c4a2
3 changed files with 33 additions and 3 deletions

View file

@ -569,11 +569,17 @@ uint16_t bt_mesh_test_own_addr_get(uint16_t start_addr)
}
void bt_mesh_test_send_over_adv(void *data, size_t len)
{
bt_mesh_test_send_over_adv_cb(data, len, NULL, NULL);
}
void bt_mesh_test_send_over_adv_cb(void *data, size_t len, const struct bt_mesh_send_cb *cb,
void *cb_data)
{
struct bt_mesh_adv *adv = bt_mesh_adv_create(BT_MESH_ADV_DATA, BT_MESH_ADV_TAG_LOCAL,
BT_MESH_TRANSMIT(0, 20), K_NO_WAIT);
net_buf_simple_add_mem(&adv->b, data, len);
bt_mesh_adv_send(adv, NULL, NULL);
bt_mesh_adv_send(adv, cb, cb_data);
}
int bt_mesh_test_wait_for_packet(bt_le_scan_cb_t scan_cb, struct k_sem *observer_sem, uint16_t wait)

View file

@ -204,6 +204,8 @@ void bt_mesh_test_ra_cb_setup(void (*cb)(uint8_t *, size_t));
uint16_t bt_mesh_test_own_addr_get(uint16_t start_addr);
void bt_mesh_test_send_over_adv(void *data, size_t len);
void bt_mesh_test_send_over_adv_cb(void *data, size_t len, const struct bt_mesh_send_cb *cb,
void *cb_data);
/* Wait for a packet (i. e. an advertisement or a GATT frame) sent by a device.
* `scan_cb` is triggered if the packet is received, and must release `observer_sem` when finished.
*/

View file

@ -318,8 +318,29 @@ static void dut_pub_common(bool disable_bt)
ASSERT_OK(bt_mesh_suspend());
}
static void send_start(uint16_t duration, int err, void *cb_data)
{
if (err) {
FAIL("Failed to send message (err %d)", err);
}
}
static void send_end(int err, void *cb_data)
{
k_sem_give((struct k_sem *)cb_data);
}
static void dut_gatt_common(bool disable_bt)
{
struct k_sem send_sem;
k_sem_init(&send_sem, 0, 1);
const struct bt_mesh_send_cb send_cb = {
.start = send_start,
.end = send_end,
};
bt_mesh_test_cfg_set(NULL, WAIT_TIME);
bt_mesh_device_setup(&prov, &comp);
ASSERT_OK_MSG(bt_mesh_prov_enable(BT_MESH_PROV_GATT), "Failed to enable GATT provisioner");
@ -336,8 +357,9 @@ static void dut_gatt_common(bool disable_bt)
/* Send a mesh message to notify Tester that DUT is about to be suspended. */
dut_status = DUT_SUSPENDED;
bt_mesh_test_send_over_adv(&dut_status, sizeof(enum dut_mesh_status));
k_sleep(K_MSEC(150));
bt_mesh_test_send_over_adv_cb(&dut_status, sizeof(enum dut_mesh_status), &send_cb,
&send_sem);
ASSERT_OK(k_sem_take(&send_sem, K_MSEC(200)));
ASSERT_OK_MSG(bt_mesh_suspend(), "Failed to suspend Mesh.");