blob: fbe2a6d6b6664f2153aca3ab647658c9e876a391 [file] [log] [blame]
/* test_ase_state_transition.c - ASE state transition tests */
/*
* Copyright (c) 2023 Codecoup
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdlib.h>
#include <zephyr/types.h>
#include <zephyr/bluetooth/audio/audio.h>
#include <zephyr/bluetooth/audio/bap.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/sys/util_macro.h>
#include "bap_unicast_server.h"
#include "bap_unicast_server_expects.h"
#include "bap_stream.h"
#include "bap_stream_expects.h"
#include "conn.h"
#include "gatt.h"
#include "gatt_expects.h"
#include "iso.h"
#include "test_common.h"
#define test_sink_ase_state_transition_fixture test_ase_state_transition_fixture
#define test_source_ase_state_transition_fixture test_ase_state_transition_fixture
static const struct bt_codec_qos_pref qos_pref = BT_CODEC_QOS_PREF(true, BT_GAP_LE_PHY_2M,
0x02, 10, 40000, 40000,
40000, 40000);
struct test_ase_state_transition_fixture {
struct bt_conn conn;
struct bt_bap_stream stream;
struct {
uint8_t id;
const struct bt_gatt_attr *attr;
} ase;
};
static void *test_sink_ase_state_transition_setup(void)
{
struct test_ase_state_transition_fixture *fixture;
fixture = malloc(sizeof(*fixture));
zassert_not_null(fixture);
memset(fixture, 0, sizeof(*fixture));
test_conn_init(&fixture->conn);
test_ase_snk_get(1, &fixture->ase.attr);
if (fixture->ase.attr != NULL) {
fixture->ase.id = test_ase_id_get(fixture->ase.attr);
}
return fixture;
}
static void test_ase_state_transition_before(void *f)
{
bt_bap_unicast_server_register_cb(&mock_bap_unicast_server_cb);
}
static void test_ase_state_transition_after(void *f)
{
bt_bap_unicast_server_unregister_cb(&mock_bap_unicast_server_cb);
}
static void test_ase_state_transition_teardown(void *f)
{
free(f);
}
ZTEST_SUITE(test_sink_ase_state_transition, NULL, test_sink_ase_state_transition_setup,
test_ase_state_transition_before, test_ase_state_transition_after,
test_ase_state_transition_teardown);
ZTEST_F(test_sink_ase_state_transition, test_client_idle_to_codec_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_ase_control_client_config_codec(conn, ase_id, stream);
/* Verification */
expect_bt_bap_unicast_server_cb_config_called_once(conn, EMPTY, BT_AUDIO_DIR_SINK, EMPTY);
expect_bt_bap_stream_ops_configured_called_once(stream, EMPTY);
}
ZTEST_F(test_sink_ase_state_transition, test_client_codec_configured_to_qos_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_codec_configured(conn, ase_id, stream);
test_ase_control_client_config_qos(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_qos_called_once(stream, EMPTY);
expect_bt_bap_stream_ops_qos_set_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_client_qos_configured_to_enabling)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_qos_configured(conn, ase_id, stream);
test_ase_control_client_enable(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_enable_called_once(stream, EMPTY, EMPTY);
expect_bt_bap_stream_ops_enabled_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_client_enabling_to_qos_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_enabling(conn, ase_id, stream);
test_ase_control_client_disable(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_disable_called_once(stream);
expect_bt_bap_stream_ops_qos_set_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_client_qos_configured_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_qos_configured(conn, ase_id, stream);
test_ase_control_client_release(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_client_codec_configured_to_codec_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_codec_configured(conn, ase_id, stream);
test_ase_control_client_config_codec(conn, ase_id, stream);
/* Verification */
expect_bt_bap_unicast_server_cb_config_not_called();
expect_bt_bap_unicast_server_cb_reconfig_called_once(stream, BT_AUDIO_DIR_SINK, EMPTY);
expect_bt_bap_stream_ops_configured_called_once(stream, EMPTY);
}
ZTEST_F(test_sink_ase_state_transition, test_client_qos_configured_to_qos_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_qos_configured(conn, ase_id, stream);
test_ase_control_client_config_qos(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_qos_called_once(stream, EMPTY);
expect_bt_bap_stream_ops_qos_set_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_client_qos_configured_to_codec_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_qos_configured(conn, ase_id, stream);
test_ase_control_client_config_codec(conn, ase_id, stream);
/* Verification */
expect_bt_bap_unicast_server_cb_reconfig_called_once(stream, BT_AUDIO_DIR_SINK, EMPTY);
expect_bt_bap_stream_ops_configured_called_once(stream, EMPTY);
}
ZTEST_F(test_sink_ase_state_transition, test_client_codec_configured_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_codec_configured(conn, ase_id, stream);
test_ase_control_client_release(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_client_enabling_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_enabling(conn, ase_id, stream);
test_ase_control_client_release(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_client_enabling_to_enabling)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_enabling(conn, ase_id, stream);
test_ase_control_client_update_metadata(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_metadata_called_once(stream, EMPTY, EMPTY);
expect_bt_bap_stream_ops_metadata_updated_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_client_streaming_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_streaming(conn, ase_id, stream, &chan, false);
test_ase_control_client_release(conn, ase_id);
/* Client disconnects the ISO */
mock_bt_iso_disconnect(chan);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_client_streaming_to_streaming)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_streaming(conn, ase_id, stream, &chan, false);
test_ase_control_client_update_metadata(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_metadata_called_once(stream, EMPTY, EMPTY);
expect_bt_bap_stream_ops_metadata_updated_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_client_streaming_to_qos_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_streaming(conn, ase_id, stream, &chan, false);
test_ase_control_client_disable(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_disable_called_once(stream);
expect_bt_bap_stream_ops_qos_set_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_server_idle_to_codec_configured)
{
struct bt_codec codec = BT_CODEC_LC3_CONFIG_16_2(BT_AUDIO_LOCATION_FRONT_LEFT,
BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED);
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
err = bt_bap_unicast_server_config_ase(conn, stream, &codec, &qos_pref);
zassert_false(err < 0, "bt_bap_unicast_server_config_ase returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_config_not_called();
expect_bt_bap_stream_ops_configured_called_once(stream, EMPTY);
}
ZTEST_F(test_sink_ase_state_transition, test_server_codec_configured_to_codec_configured)
{
struct bt_codec codec = BT_CODEC_LC3_CONFIG_16_2(BT_AUDIO_LOCATION_FRONT_LEFT,
BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED);
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_codec_configured(conn, ase_id, stream);
err = bt_bap_stream_reconfig(stream, &codec);
zassert_false(err < 0, "bt_bap_stream_reconfig returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_reconfig_called_once(stream, BT_AUDIO_DIR_SINK, EMPTY);
expect_bt_bap_stream_ops_configured_called_once(stream, EMPTY);
}
ZTEST_F(test_sink_ase_state_transition, test_server_codec_configured_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_codec_configured(conn, ase_id, stream);
err = bt_bap_stream_release(stream);
zassert_false(err < 0, "bt_bap_stream_release returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_server_qos_configured_to_codec_configured)
{
struct bt_codec codec = BT_CODEC_LC3_CONFIG_16_2(BT_AUDIO_LOCATION_FRONT_LEFT,
BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED);
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_qos_configured(conn, ase_id, stream);
err = bt_bap_stream_reconfig(stream, &codec);
zassert_false(err < 0, "bt_bap_stream_reconfig returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_reconfig_called_once(stream, BT_AUDIO_DIR_SINK, EMPTY);
expect_bt_bap_stream_ops_configured_called_once(stream, EMPTY);
}
ZTEST_F(test_sink_ase_state_transition, test_server_qos_configured_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_qos_configured(conn, ase_id, stream);
err = bt_bap_stream_release(stream);
zassert_false(err < 0, "bt_bap_stream_release returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_server_enabling_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_enabling(conn, ase_id, stream);
err = bt_bap_stream_release(stream);
zassert_false(err < 0, "bt_bap_stream_release returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_server_enabling_to_enabling)
{
struct bt_codec_data meta[] = {
BT_CODEC_DATA(BT_AUDIO_METADATA_TYPE_STREAM_CONTEXT,
(BT_AUDIO_CONTEXT_TYPE_MEDIA & 0xFFU),
((BT_AUDIO_CONTEXT_TYPE_MEDIA >> 8) & 0xFFU)),
};
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_enabling(conn, ase_id, stream);
err = bt_bap_stream_metadata(stream, meta, ARRAY_SIZE(meta));
zassert_false(err < 0, "bt_bap_stream_metadata returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_metadata_called_once(stream, EMPTY, EMPTY);
expect_bt_bap_stream_ops_metadata_updated_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_server_enabling_to_qos_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_enabling(conn, ase_id, stream);
err = bt_bap_stream_disable(stream);
zassert_false(err < 0, "bt_bap_stream_disable returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_disable_called_once(stream);
expect_bt_bap_stream_ops_qos_set_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_server_enabling_to_streaming)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_enabling(conn, ase_id, stream);
err = mock_bt_iso_accept(conn, 0x01, 0x01, &chan);
zassert_equal(0, err, "Failed to connect iso: err %d", err);
err = bt_bap_stream_start(stream);
zassert_false(err < 0, "bt_bap_stream_start returned err %d", err);
/* Verification */
expect_bt_bap_stream_ops_started_called_once(stream);
/* XXX: unicast_server_cb->start is not called for Sink ASE */
}
ZTEST_F(test_sink_ase_state_transition, test_server_streaming_to_streaming)
{
struct bt_codec_data meta[] = {
BT_CODEC_DATA(BT_AUDIO_METADATA_TYPE_STREAM_CONTEXT,
(BT_AUDIO_CONTEXT_TYPE_MEDIA & 0xFFU),
((BT_AUDIO_CONTEXT_TYPE_MEDIA >> 8) & 0xFFU)),
};
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_streaming(conn, ase_id, stream, &chan, false);
err = bt_bap_stream_metadata(stream, meta, ARRAY_SIZE(meta));
zassert_false(err < 0, "bt_bap_stream_metadata returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_metadata_called_once(stream, EMPTY, EMPTY);
expect_bt_bap_stream_ops_metadata_updated_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_server_streaming_to_qos_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_streaming(conn, ase_id, stream, &chan, false);
err = bt_bap_stream_disable(stream);
zassert_false(err < 0, "bt_bap_stream_disable returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_disable_called_once(stream);
expect_bt_bap_stream_ops_qos_set_called_once(stream);
}
ZTEST_F(test_sink_ase_state_transition, test_server_streaming_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SNK);
test_preamble_state_streaming(conn, ase_id, stream, &chan, false);
err = bt_bap_stream_release(stream);
zassert_false(err < 0, "bt_bap_stream_release returned err %d", err);
/* Client disconnects the ISO */
mock_bt_iso_disconnect(chan);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
static void *test_source_ase_state_transition_setup(void)
{
struct test_ase_state_transition_fixture *fixture;
fixture = malloc(sizeof(*fixture));
zassert_not_null(fixture);
memset(fixture, 0, sizeof(*fixture));
test_conn_init(&fixture->conn);
test_ase_src_get(1, &fixture->ase.attr);
if (fixture->ase.attr != NULL) {
fixture->ase.id = test_ase_id_get(fixture->ase.attr);
}
return fixture;
}
ZTEST_SUITE(test_source_ase_state_transition, NULL, test_source_ase_state_transition_setup,
test_ase_state_transition_before, test_ase_state_transition_after,
test_ase_state_transition_teardown);
ZTEST_F(test_source_ase_state_transition, test_client_idle_to_codec_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_ase_control_client_config_codec(conn, ase_id, stream);
/* Verification */
expect_bt_bap_unicast_server_cb_config_called_once(conn, EMPTY, BT_AUDIO_DIR_SOURCE, EMPTY);
expect_bt_bap_stream_ops_configured_called_once(stream, EMPTY);
}
ZTEST_F(test_source_ase_state_transition, test_client_codec_configured_to_qos_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_codec_configured(conn, ase_id, stream);
test_ase_control_client_config_qos(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_qos_called_once(stream, EMPTY);
expect_bt_bap_stream_ops_qos_set_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_qos_configured_to_enabling)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_qos_configured(conn, ase_id, stream);
test_ase_control_client_enable(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_enable_called_once(stream, EMPTY, EMPTY);
expect_bt_bap_stream_ops_enabled_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_enabling_to_disabling)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_enabling(conn, ase_id, stream);
test_ase_control_client_disable(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_disable_called_once(stream);
expect_bt_bap_stream_ops_disabled_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_qos_configured_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_qos_configured(conn, ase_id, stream);
test_ase_control_client_release(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_enabling_to_streaming)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_enabling(conn, ase_id, stream);
err = mock_bt_iso_accept(conn, 0x01, 0x01, &chan);
zassert_equal(0, err, "Failed to connect iso: err %d", err);
test_ase_control_client_receiver_start_ready(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_start_called_once(stream);
expect_bt_bap_stream_ops_started_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_codec_configured_to_codec_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_codec_configured(conn, ase_id, stream);
test_ase_control_client_config_codec(conn, ase_id, stream);
/* Verification */
expect_bt_bap_unicast_server_cb_reconfig_called_once(stream, BT_AUDIO_DIR_SOURCE, EMPTY);
expect_bt_bap_stream_ops_configured_called_once(stream, EMPTY);
}
ZTEST_F(test_source_ase_state_transition, test_client_qos_configured_to_qos_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_qos_configured(conn, ase_id, stream);
test_ase_control_client_config_qos(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_qos_called_once(stream, EMPTY);
expect_bt_bap_stream_ops_qos_set_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_qos_configured_to_codec_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_qos_configured(conn, ase_id, stream);
test_ase_control_client_config_codec(conn, ase_id, stream);
/* Verification */
expect_bt_bap_unicast_server_cb_reconfig_called_once(stream, BT_AUDIO_DIR_SOURCE, EMPTY);
expect_bt_bap_stream_ops_configured_called_once(stream, EMPTY);
}
ZTEST_F(test_source_ase_state_transition, test_client_codec_configured_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_codec_configured(conn, ase_id, stream);
test_ase_control_client_release(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_enabling_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_enabling(conn, ase_id, stream);
test_ase_control_client_release(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_enabling_to_enabling)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_enabling(conn, ase_id, stream);
test_ase_control_client_update_metadata(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_metadata_called_once(stream, EMPTY, EMPTY);
expect_bt_bap_stream_ops_metadata_updated_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_streaming_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_streaming(conn, ase_id, stream, &chan, true);
test_ase_control_client_release(conn, ase_id);
/* Client disconnects the ISO */
mock_bt_iso_disconnect(chan);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_stopped_called_once(stream, EMPTY);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_streaming_to_streaming)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_streaming(conn, ase_id, stream, &chan, true);
test_ase_control_client_update_metadata(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_metadata_called_once(stream, EMPTY, EMPTY);
expect_bt_bap_stream_ops_metadata_updated_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_streaming_to_disabling)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_streaming(conn, ase_id, stream, &chan, true);
test_ase_control_client_disable(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_disable_called_once(stream);
expect_bt_bap_stream_ops_disabled_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_enabling_to_disabling_to_qos_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_enabling(conn, ase_id, stream);
test_ase_control_client_disable(conn, ase_id);
test_mocks_reset();
test_ase_control_client_receiver_stop_ready(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_stop_called_once(stream);
expect_bt_bap_stream_ops_qos_set_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_client_streaming_to_disabling_to_qos_configured)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_streaming(conn, ase_id, stream, &chan, true);
test_ase_control_client_disable(conn, ase_id);
test_mocks_reset();
test_ase_control_client_receiver_stop_ready(conn, ase_id);
/* Verification */
expect_bt_bap_unicast_server_cb_stop_called_once(stream);
expect_bt_bap_stream_ops_qos_set_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_server_idle_to_codec_configured)
{
struct bt_codec codec = BT_CODEC_LC3_CONFIG_16_2(BT_AUDIO_LOCATION_FRONT_LEFT,
BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED);
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
err = bt_bap_unicast_server_config_ase(conn, stream, &codec, &qos_pref);
zassert_false(err < 0, "bt_bap_unicast_server_config_ase returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_config_not_called();
expect_bt_bap_stream_ops_configured_called_once(stream, EMPTY);
}
ZTEST_F(test_source_ase_state_transition, test_server_codec_configured_to_codec_configured)
{
struct bt_codec codec = BT_CODEC_LC3_CONFIG_16_2(BT_AUDIO_LOCATION_FRONT_LEFT,
BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED);
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_codec_configured(conn, ase_id, stream);
err = bt_bap_stream_reconfig(stream, &codec);
zassert_false(err < 0, "bt_bap_stream_reconfig returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_reconfig_called_once(stream, BT_AUDIO_DIR_SOURCE, EMPTY);
expect_bt_bap_stream_ops_configured_called_once(stream, EMPTY);
}
ZTEST_F(test_source_ase_state_transition, test_server_codec_configured_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_codec_configured(conn, ase_id, stream);
err = bt_bap_stream_release(stream);
zassert_false(err < 0, "bt_bap_stream_release returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_server_qos_configured_to_codec_configured)
{
struct bt_codec codec = BT_CODEC_LC3_CONFIG_16_2(BT_AUDIO_LOCATION_FRONT_LEFT,
BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED);
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_qos_configured(conn, ase_id, stream);
err = bt_bap_stream_reconfig(stream, &codec);
zassert_false(err < 0, "bt_bap_stream_reconfig returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_reconfig_called_once(stream, BT_AUDIO_DIR_SOURCE, EMPTY);
expect_bt_bap_stream_ops_configured_called_once(stream, EMPTY);
}
ZTEST_F(test_source_ase_state_transition, test_server_qos_configured_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_qos_configured(conn, ase_id, stream);
err = bt_bap_stream_release(stream);
zassert_false(err < 0, "bt_bap_stream_release returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_server_enabling_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_enabling(conn, ase_id, stream);
err = bt_bap_stream_release(stream);
zassert_false(err < 0, "bt_bap_stream_release returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_released_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_server_enabling_to_enabling)
{
struct bt_codec_data meta[] = {
BT_CODEC_DATA(BT_AUDIO_METADATA_TYPE_STREAM_CONTEXT,
(BT_AUDIO_CONTEXT_TYPE_MEDIA & 0xFFU),
((BT_AUDIO_CONTEXT_TYPE_MEDIA >> 8) & 0xFFU)),
};
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_enabling(conn, ase_id, stream);
err = bt_bap_stream_metadata(stream, meta, ARRAY_SIZE(meta));
zassert_false(err < 0, "bt_bap_stream_metadata returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_metadata_called_once(stream, EMPTY, EMPTY);
expect_bt_bap_stream_ops_metadata_updated_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_server_enabling_to_disabling)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_enabling(conn, ase_id, stream);
err = bt_bap_stream_disable(stream);
zassert_false(err < 0, "bt_bap_stream_disable returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_disable_called_once(stream);
expect_bt_bap_stream_ops_disabled_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_server_streaming_to_streaming)
{
struct bt_codec_data meta[] = {
BT_CODEC_DATA(BT_AUDIO_METADATA_TYPE_STREAM_CONTEXT,
(BT_AUDIO_CONTEXT_TYPE_MEDIA & 0xFFU),
((BT_AUDIO_CONTEXT_TYPE_MEDIA >> 8) & 0xFFU)),
};
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_streaming(conn, ase_id, stream, &chan, true);
err = bt_bap_stream_metadata(stream, meta, ARRAY_SIZE(meta));
zassert_false(err < 0, "bt_bap_stream_metadata returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_metadata_called_once(stream, EMPTY, EMPTY);
expect_bt_bap_stream_ops_metadata_updated_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_server_streaming_to_disabling)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_streaming(conn, ase_id, stream, &chan, true);
err = bt_bap_stream_disable(stream);
zassert_false(err < 0, "bt_bap_stream_disable returned err %d", err);
/* Verification */
expect_bt_bap_unicast_server_cb_disable_called_once(stream);
expect_bt_bap_stream_ops_disabled_called_once(stream);
}
ZTEST_F(test_source_ase_state_transition, test_server_streaming_to_releasing)
{
struct bt_bap_stream *stream = &fixture->stream;
struct bt_conn *conn = &fixture->conn;
uint8_t ase_id = fixture->ase.id;
struct bt_iso_chan *chan;
int err;
Z_TEST_SKIP_IFNDEF(CONFIG_BT_ASCS_ASE_SRC);
test_preamble_state_streaming(conn, ase_id, stream, &chan, true);
err = bt_bap_stream_release(stream);
zassert_false(err < 0, "bt_bap_stream_release returned err %d", err);
/* Client disconnects the ISO */
mock_bt_iso_disconnect(chan);
/* Verification */
expect_bt_bap_unicast_server_cb_release_called_once(stream);
expect_bt_bap_stream_ops_stopped_called_once(stream, EMPTY);
expect_bt_bap_stream_ops_released_called_once(stream);
}