mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-23 12:14:26 +08:00
iso-tester: Add test for Broadcast Receiver Defer sync to 2 BIGs
This adds a new Broadcast Receiver test, for a Broadcast Sink synchronizing to 2 Broadcasters, using defer setup. ISO Broadcaster Receiver2 Defer - Success
This commit is contained in:
parent
b87c3767f5
commit
bae6c32940
@ -518,7 +518,8 @@ struct iso_client_data {
|
||||
bool no_poll_errqueue;
|
||||
};
|
||||
|
||||
typedef bool (*iso_defer_accept_t)(struct test_data *data, GIOChannel *io);
|
||||
typedef bool (*iso_defer_accept_t)(struct test_data *data, GIOChannel *io,
|
||||
uint8_t num, GIOFunc func);
|
||||
|
||||
static void mgmt_debug(const char *str, void *user_data)
|
||||
{
|
||||
@ -1446,6 +1447,16 @@ static const struct iso_client_data bcast_16_2_1_recv_defer = {
|
||||
.big = true,
|
||||
};
|
||||
|
||||
static const struct iso_client_data bcast_16_2_1_recv2_defer = {
|
||||
.qos = QOS_IN_16_2_1,
|
||||
.expect_err = 0,
|
||||
.defer = true,
|
||||
.bcast = true,
|
||||
.server = true,
|
||||
.listen_bind = true,
|
||||
.big = true,
|
||||
};
|
||||
|
||||
static const struct iso_client_data bcast_16_2_1_recv_defer_no_bis = {
|
||||
.qos = QOS_IN_16_2_1,
|
||||
.expect_err = 0,
|
||||
@ -2923,7 +2934,8 @@ static void setup_listen(struct test_data *data, uint8_t num, GIOFunc func)
|
||||
return setup_listen_many(data, 1, &num, &func);
|
||||
}
|
||||
|
||||
static bool iso_defer_accept_bcast(struct test_data *data, GIOChannel *io)
|
||||
static bool iso_defer_accept_bcast(struct test_data *data, GIOChannel *io,
|
||||
uint8_t num, GIOFunc func)
|
||||
{
|
||||
int sk;
|
||||
char c;
|
||||
@ -2957,17 +2969,20 @@ static bool iso_defer_accept_bcast(struct test_data *data, GIOChannel *io)
|
||||
|
||||
tester_print("Accept deferred setup");
|
||||
|
||||
data->io_queue = queue_new();
|
||||
if (!data->io_queue)
|
||||
data->io_queue = queue_new();
|
||||
|
||||
if (data->io_queue)
|
||||
queue_push_tail(data->io_queue, io);
|
||||
|
||||
data->io_id[0] = g_io_add_watch(io, G_IO_IN,
|
||||
iso_accept_cb, NULL);
|
||||
data->io_id[num] = g_io_add_watch(io, G_IO_IN,
|
||||
func, NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool iso_defer_accept_ucast(struct test_data *data, GIOChannel *io)
|
||||
static bool iso_defer_accept_ucast(struct test_data *data, GIOChannel *io,
|
||||
uint8_t num, GIOFunc func)
|
||||
{
|
||||
int sk;
|
||||
char c;
|
||||
@ -2997,19 +3012,20 @@ static bool iso_defer_accept_ucast(struct test_data *data, GIOChannel *io)
|
||||
if (data->io_queue)
|
||||
queue_push_tail(data->io_queue, io);
|
||||
|
||||
data->io_id[0] = g_io_add_watch(io, G_IO_OUT,
|
||||
iso_connect_cb, NULL);
|
||||
data->io_id[num] = g_io_add_watch(io, G_IO_OUT,
|
||||
func, NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static gboolean iso_accept(GIOChannel *io, GIOCondition cond,
|
||||
gpointer user_data)
|
||||
gpointer user_data, uint8_t num, GIOFunc func)
|
||||
{
|
||||
struct test_data *data = tester_get_data();
|
||||
const struct iso_client_data *isodata = data->test_data;
|
||||
int sk, new_sk;
|
||||
gboolean ret;
|
||||
GIOChannel *new_io;
|
||||
iso_defer_accept_t iso_defer_accept = isodata->bcast ?
|
||||
iso_defer_accept_bcast :
|
||||
iso_defer_accept_ucast;
|
||||
@ -3022,26 +3038,32 @@ static gboolean iso_accept(GIOChannel *io, GIOCondition cond,
|
||||
return false;
|
||||
}
|
||||
|
||||
io = g_io_channel_unix_new(new_sk);
|
||||
g_io_channel_set_close_on_unref(io, TRUE);
|
||||
new_io = g_io_channel_unix_new(new_sk);
|
||||
g_io_channel_set_close_on_unref(new_io, TRUE);
|
||||
|
||||
if (isodata->defer) {
|
||||
if (isodata->expect_err < 0) {
|
||||
g_io_channel_unref(io);
|
||||
g_io_channel_unref(new_io);
|
||||
tester_test_passed();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isodata->bcast) {
|
||||
iso_connect(io, cond, user_data);
|
||||
iso_connect(new_io, cond, user_data);
|
||||
|
||||
if (!data->step) {
|
||||
g_io_channel_unref(io);
|
||||
g_io_channel_unref(new_io);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Return if connection has already been accepted */
|
||||
if (queue_find(data->io_queue, NULL, io)) {
|
||||
g_io_channel_unref(new_io);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!iso_defer_accept(data, io)) {
|
||||
if (!iso_defer_accept(data, new_io, num, func)) {
|
||||
tester_warn("Unable to accept deferred setup");
|
||||
tester_test_failed();
|
||||
}
|
||||
@ -3060,9 +3082,9 @@ static gboolean iso_accept(GIOChannel *io, GIOCondition cond,
|
||||
}
|
||||
}
|
||||
|
||||
ret = iso_connect(io, cond, user_data);
|
||||
ret = iso_connect(new_io, cond, user_data);
|
||||
|
||||
g_io_channel_unref(io);
|
||||
g_io_channel_unref(new_io);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -3070,10 +3092,14 @@ static gboolean iso_accept_cb(GIOChannel *io, GIOCondition cond,
|
||||
gpointer user_data)
|
||||
{
|
||||
struct test_data *data = tester_get_data();
|
||||
const struct iso_client_data *isodata = data->test_data;
|
||||
|
||||
data->io_id[0] = 0;
|
||||
|
||||
return iso_accept(io, cond, user_data);
|
||||
if (isodata->bcast)
|
||||
return iso_accept(io, cond, user_data, 0, iso_accept_cb);
|
||||
else
|
||||
return iso_accept(io, cond, user_data, 0, iso_connect_cb);
|
||||
}
|
||||
|
||||
static gboolean iso_accept2_cb(GIOChannel *io, GIOCondition cond,
|
||||
@ -3083,7 +3109,7 @@ static gboolean iso_accept2_cb(GIOChannel *io, GIOCondition cond,
|
||||
|
||||
data->io_id[1] = 0;
|
||||
|
||||
return iso_accept(io, cond, user_data);
|
||||
return iso_accept(io, cond, user_data, 1, iso_accept2_cb);
|
||||
}
|
||||
|
||||
static void test_listen(const void *test_data)
|
||||
@ -3379,6 +3405,17 @@ static void test_bcast_recv_defer(const void *test_data)
|
||||
setup_listen(data, 0, iso_accept_cb);
|
||||
}
|
||||
|
||||
static void test_bcast_recv2_defer(const void *test_data)
|
||||
{
|
||||
struct test_data *data = tester_get_data();
|
||||
uint8_t num[2] = {0, 1};
|
||||
GIOFunc funcs[2] = {iso_accept_cb, iso_accept2_cb};
|
||||
|
||||
data->step = 2;
|
||||
|
||||
setup_listen_many(data, 2, num, funcs);
|
||||
}
|
||||
|
||||
static void test_connect2_suspend(const void *test_data)
|
||||
{
|
||||
test_connect2(test_data);
|
||||
@ -3770,6 +3807,11 @@ int main(int argc, char *argv[])
|
||||
&bcast_16_2_1_recv_defer,
|
||||
setup_powered,
|
||||
test_bcast_recv_defer);
|
||||
test_iso2("ISO Broadcaster Receiver2 Defer - Success",
|
||||
&bcast_16_2_1_recv2_defer,
|
||||
setup_powered,
|
||||
test_bcast_recv2_defer);
|
||||
|
||||
test_iso("ISO Broadcaster Receiver Defer No BIS - Success",
|
||||
&bcast_16_2_1_recv_defer_no_bis,
|
||||
setup_powered,
|
||||
|
Loading…
Reference in New Issue
Block a user