1 /* main.c - Application main entry point */
2
3 /*
4 * Copyright (c) 2023 Nordic Semiconductor ASA
5 *
6 * SPDX-License-Identifier: Apache-2.0
7 */
8
9 #include <stdint.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <errno.h>
13
14 #include <zephyr/bluetooth/audio/audio.h>
15 #include <zephyr/bluetooth/audio/bap.h>
16 #include <zephyr/bluetooth/bluetooth.h>
17 #include <zephyr/ztest_assert.h>
18 #include <zephyr/ztest_test.h>
19 #include <zephyr/fff.h>
20
21 DEFINE_FFF_GLOBALS;
22
23 struct bap_base_test_suite_fixture {
24 struct bt_data valid_base_ad;
25 uint8_t *valid_base_data;
26 struct bt_data invalid_base_ad;
27 uint8_t *invalid_base_data;
28 };
29
bap_base_test_suite_fixture_init(struct bap_base_test_suite_fixture * fixture)30 static void bap_base_test_suite_fixture_init(struct bap_base_test_suite_fixture *fixture)
31 {
32 uint8_t base_data[] = {
33 0x51, 0x18, /* uuid */
34 0x40, 0x9C, 0x00, /* pd */
35 0x02, /* subgroup count */
36 0x01, /* Subgroup 1: bis count */
37 0x06, 0x00, 0x00, 0x00, 0x00, /* LC3 codec_id*/
38 0x10, /* cc length */
39 0x02, 0x01, 0x03, 0x02, 0x02, 0x01, 0x05, 0x03,
40 0x01, 0x00, 0x00, 0x00, 0x03, 0x04, 0x28, 0x00, /* cc */
41 0x04, /* meta length */
42 0x03, 0x02, 0x01, 0x00, /* meta */
43 0x01, /* bis index */
44 0x03, /* bis cc length */
45 0x02, 0x03, 0x03, /* bis cc length */
46 0x01, /* Subgroup 1: bis count */
47 0x06, 0x00, 0x00, 0x00, 0x00, /* LC3 codec_id*/
48 0x10, /* cc length */
49 0x02, 0x01, 0x03, 0x02, 0x02, 0x01, 0x05, 0x03,
50 0x01, 0x00, 0x00, 0x00, 0x03, 0x04, 0x28, 0x00, /* cc */
51 0x04, /* meta length */
52 0x03, 0x02, 0x01, 0x00, /* meta */
53 0x02, /* bis index */
54 0x03, /* bis cc length */
55 0x02, 0x03, 0x03 /* bis cc length */
56 };
57
58 fixture->valid_base_data = malloc(sizeof(base_data));
59 zassert_not_null(fixture->valid_base_data);
60 memcpy(fixture->valid_base_data, base_data, sizeof(base_data));
61
62 fixture->valid_base_ad.type = 0x16; /* service data */
63 fixture->valid_base_ad.data_len = sizeof(base_data);
64 fixture->valid_base_ad.data = fixture->valid_base_data;
65
66 /* Modify the CC length to generate an invalid BASE for invalid BASE tests */
67 base_data[12] = 0xaa; /* Set invalid CC length*/
68 fixture->invalid_base_data = malloc(sizeof(base_data));
69 zassert_not_null(fixture->invalid_base_data);
70 memcpy(fixture->invalid_base_data, base_data, sizeof(base_data));
71
72 fixture->invalid_base_ad.type = 0x16; /* service data */
73 fixture->invalid_base_ad.data_len = sizeof(base_data);
74 fixture->invalid_base_ad.data = fixture->invalid_base_data;
75 }
76
bap_base_test_suite_setup(void)77 static void *bap_base_test_suite_setup(void)
78 {
79 struct bap_base_test_suite_fixture *fixture;
80
81 fixture = malloc(sizeof(*fixture));
82 zassert_not_null(fixture);
83
84 return fixture;
85 }
86
bap_base_test_suite_before(void * f)87 static void bap_base_test_suite_before(void *f)
88 {
89 memset(f, 0, sizeof(struct bap_base_test_suite_fixture));
90 bap_base_test_suite_fixture_init(f);
91 }
92
bap_base_test_suite_after(void * f)93 static void bap_base_test_suite_after(void *f)
94 {
95 struct bap_base_test_suite_fixture *fixture = f;
96
97 free(fixture->valid_base_data);
98 }
99
bap_base_test_suite_teardown(void * f)100 static void bap_base_test_suite_teardown(void *f)
101 {
102 free(f);
103 }
104
105 ZTEST_SUITE(bap_base_test_suite, NULL, bap_base_test_suite_setup, bap_base_test_suite_before,
106 bap_base_test_suite_after, bap_base_test_suite_teardown);
107
ZTEST_F(bap_base_test_suite,test_base_get_base_from_ad)108 ZTEST_F(bap_base_test_suite, test_base_get_base_from_ad)
109 {
110 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
111
112 zassert_not_null(base);
113 }
114
ZTEST_F(bap_base_test_suite,test_base_get_base_from_ad_inval_base)115 ZTEST_F(bap_base_test_suite, test_base_get_base_from_ad_inval_base)
116 {
117 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->invalid_base_ad);
118
119 zassert_is_null(base);
120 }
121
ZTEST_F(bap_base_test_suite,test_base_get_base_from_ad_inval_param_null)122 ZTEST_F(bap_base_test_suite, test_base_get_base_from_ad_inval_param_null)
123 {
124 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(NULL);
125
126 zassert_is_null(base);
127 }
128
ZTEST_F(bap_base_test_suite,test_base_get_base_from_ad_inval_param_type)129 ZTEST_F(bap_base_test_suite, test_base_get_base_from_ad_inval_param_type)
130 {
131 const struct bt_bap_base *base;
132
133 fixture->valid_base_ad.type = 0x03; /* BT_DATA_UUID16_ALL */
134
135 base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
136
137 zassert_is_null(base);
138 }
139
ZTEST_F(bap_base_test_suite,test_base_get_base_from_ad_inval_param_len)140 ZTEST_F(bap_base_test_suite, test_base_get_base_from_ad_inval_param_len)
141 {
142 const struct bt_bap_base *base;
143
144 fixture->valid_base_ad.data_len = 0x03; /* Minimum len is BASE_MIN_SIZE (16) */
145
146 base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
147
148 zassert_is_null(base);
149 }
150
ZTEST_F(bap_base_test_suite,test_base_get_base_from_ad_inval_param_uuid)151 ZTEST_F(bap_base_test_suite, test_base_get_base_from_ad_inval_param_uuid)
152 {
153 const struct bt_bap_base *base;
154
155 /* Modify the BASE data to have invalid UUID */
156 fixture->valid_base_data[0] = 0x01;
157 fixture->valid_base_data[1] = 0x02;
158
159 base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
160
161 zassert_is_null(base);
162 }
163
ZTEST_F(bap_base_test_suite,test_base_get_size)164 ZTEST_F(bap_base_test_suite, test_base_get_size)
165 {
166 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
167 int ret;
168
169 zassert_not_null(base);
170
171 ret = bt_bap_base_get_size(base);
172 zassert_equal(ret, 70, "Unexpected BASE size: %d", ret);
173 }
174
ZTEST_F(bap_base_test_suite,test_base_get_size_inval_param_null)175 ZTEST_F(bap_base_test_suite, test_base_get_size_inval_param_null)
176 {
177 int ret;
178
179 ret = bt_bap_base_get_size(NULL);
180 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
181 }
182
ZTEST_F(bap_base_test_suite,test_base_get_pres_delay)183 ZTEST_F(bap_base_test_suite, test_base_get_pres_delay)
184 {
185 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
186 int ret;
187
188 zassert_not_null(base);
189
190 ret = bt_bap_base_get_pres_delay(base);
191 zassert_equal(ret, 40000, "Unexpected presentation delay: %d", ret);
192 }
193
ZTEST_F(bap_base_test_suite,test_base_get_pres_delay_inval_param_null)194 ZTEST_F(bap_base_test_suite, test_base_get_pres_delay_inval_param_null)
195 {
196 int ret;
197
198 ret = bt_bap_base_get_pres_delay(NULL);
199 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
200 }
201
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_count)202 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_count)
203 {
204 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
205 int ret;
206
207 zassert_not_null(base);
208
209 ret = bt_bap_base_get_subgroup_count(base);
210 zassert_equal(ret, 2, "Unexpected presentation delay: %d", ret);
211 }
212
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_count_inval_param_null)213 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_count_inval_param_null)
214 {
215 int ret;
216
217 ret = bt_bap_base_get_subgroup_count(NULL);
218 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
219 }
220
ZTEST_F(bap_base_test_suite,test_base_get_bis_indexes)221 ZTEST_F(bap_base_test_suite, test_base_get_bis_indexes)
222 {
223 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
224 uint32_t bis_indexes;
225 int ret;
226
227 zassert_not_null(base);
228
229 ret = bt_bap_base_get_bis_indexes(base, &bis_indexes);
230 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
231 zassert_equal(bis_indexes, 0x00000003 /* Bit 1 and 2 */,
232 "Unexpected BIS index value: 0x%08X", bis_indexes);
233 }
234
ZTEST_F(bap_base_test_suite,test_base_get_bis_indexes_inval_param_null_base)235 ZTEST_F(bap_base_test_suite, test_base_get_bis_indexes_inval_param_null_base)
236 {
237 uint32_t bis_indexes;
238 int ret;
239
240 ret = bt_bap_base_get_bis_indexes(NULL, &bis_indexes);
241 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
242 }
243
ZTEST_F(bap_base_test_suite,test_base_get_bis_indexes_inval_param_null_index)244 ZTEST_F(bap_base_test_suite, test_base_get_bis_indexes_inval_param_null_index)
245 {
246 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
247 int ret;
248
249 zassert_not_null(base);
250
251 ret = bt_bap_base_get_bis_indexes(base, NULL);
252 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
253 }
254
test_base_foreach_subgroup_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)255 static bool test_base_foreach_subgroup_cb(const struct bt_bap_base_subgroup *subgroup,
256 void *user_data)
257 {
258 size_t *count = user_data;
259
260 (*count)++;
261
262 return true;
263 }
264
ZTEST_F(bap_base_test_suite,test_base_foreach_subgroup)265 ZTEST_F(bap_base_test_suite, test_base_foreach_subgroup)
266 {
267 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
268 size_t count = 0U;
269 int ret;
270
271 zassert_not_null(base);
272
273 ret = bt_bap_base_foreach_subgroup(base, test_base_foreach_subgroup_cb, &count);
274 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
275 zassert_equal(count, 0x02, "Unexpected subgroup count value: %u", count);
276 }
277
ZTEST_F(bap_base_test_suite,test_base_foreach_subgroup_inval_param_null_base)278 ZTEST_F(bap_base_test_suite, test_base_foreach_subgroup_inval_param_null_base)
279 {
280 size_t count;
281 int ret;
282
283 ret = bt_bap_base_foreach_subgroup(NULL, test_base_foreach_subgroup_cb, &count);
284 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
285 }
286
ZTEST_F(bap_base_test_suite,test_base_foreach_subgroup_inval_param_null_cb)287 ZTEST_F(bap_base_test_suite, test_base_foreach_subgroup_inval_param_null_cb)
288 {
289 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
290 int ret;
291
292 zassert_not_null(base);
293
294 ret = bt_bap_base_foreach_subgroup(base, NULL, NULL);
295 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
296 }
297
test_base_get_subgroup_codec_id_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)298 static bool test_base_get_subgroup_codec_id_cb(const struct bt_bap_base_subgroup *subgroup,
299 void *user_data)
300 {
301 struct bt_bap_base_codec_id codec_id;
302 int ret;
303
304 ret = bt_bap_base_get_subgroup_codec_id(subgroup, &codec_id);
305 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
306 zassert_equal(codec_id.id, 0x06, "Unexpected codec.id value: %u", codec_id.id);
307 zassert_equal(codec_id.cid, 0x0000, "Unexpected codec.cid value: %u", codec_id.cid);
308 zassert_equal(codec_id.vid, 0x0000, "Unexpected codec.vid value: %u", codec_id.vid);
309
310 return true;
311 }
312
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_codec_id)313 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_codec_id)
314 {
315 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
316 int ret;
317
318 zassert_not_null(base);
319
320 ret = bt_bap_base_foreach_subgroup(base, test_base_get_subgroup_codec_id_cb, NULL);
321 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
322 }
323
test_base_get_subgroup_codec_id_inval_param_null_subgroup_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)324 static bool test_base_get_subgroup_codec_id_inval_param_null_subgroup_cb(
325 const struct bt_bap_base_subgroup *subgroup, void *user_data)
326 {
327 struct bt_bap_base_codec_id codec_id;
328 int ret;
329
330 ret = bt_bap_base_get_subgroup_codec_id(NULL, &codec_id);
331 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
332
333 return true;
334 }
335
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_codec_id_inval_param_null_subgroup)336 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_codec_id_inval_param_null_subgroup)
337 {
338 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
339 int ret;
340
341 zassert_not_null(base);
342
343 ret = bt_bap_base_foreach_subgroup(
344 base, test_base_get_subgroup_codec_id_inval_param_null_subgroup_cb, NULL);
345 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
346 }
347
348 static bool
test_base_get_subgroup_codec_id_inval_param_null_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)349 test_base_get_subgroup_codec_id_inval_param_null_cb(const struct bt_bap_base_subgroup *subgroup,
350 void *user_data)
351 {
352 int ret;
353
354 ret = bt_bap_base_get_subgroup_codec_id(subgroup, NULL);
355 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
356
357 return true;
358 }
359
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_codec_id_inval_param_null)360 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_codec_id_inval_param_null)
361 {
362 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
363 int ret;
364
365 zassert_not_null(base);
366
367 ret = bt_bap_base_foreach_subgroup(
368 base, test_base_get_subgroup_codec_id_inval_param_null_cb, NULL);
369 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
370 }
371
test_base_get_subgroup_codec_data_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)372 static bool test_base_get_subgroup_codec_data_cb(const struct bt_bap_base_subgroup *subgroup,
373 void *user_data)
374 {
375 const uint8_t expected_data[] = {
376 0x02, 0x01, 0x03, 0x02, 0x02, 0x01, 0x05, 0x03,
377 0x01, 0x00, 0x00, 0x00, 0x03, 0x04, 0x28, 0x00,
378 };
379 uint8_t *data;
380 int ret;
381
382 ret = bt_bap_base_get_subgroup_codec_data(subgroup, &data);
383 zassert_equal(ret, sizeof(expected_data), "Unexpected return value: %d", ret);
384 zassert_mem_equal(data, expected_data, sizeof(expected_data));
385
386 return true;
387 }
388
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_codec_data)389 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_codec_data)
390 {
391 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
392 int ret;
393
394 zassert_not_null(base);
395
396 ret = bt_bap_base_foreach_subgroup(base, test_base_get_subgroup_codec_data_cb, NULL);
397 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
398 }
399
test_base_get_subgroup_codec_data_inval_param_null_subgroup_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)400 static bool test_base_get_subgroup_codec_data_inval_param_null_subgroup_cb(
401 const struct bt_bap_base_subgroup *subgroup, void *user_data)
402 {
403 uint8_t *data;
404 int ret;
405
406 ret = bt_bap_base_get_subgroup_codec_data(NULL, &data);
407 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
408
409 return true;
410 }
411
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_codec_data_inval_param_null_subgroup)412 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_codec_data_inval_param_null_subgroup)
413 {
414 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
415 int ret;
416
417 zassert_not_null(base);
418
419 ret = bt_bap_base_foreach_subgroup(
420 base, test_base_get_subgroup_codec_data_inval_param_null_subgroup_cb, NULL);
421 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
422 }
423
424 static bool
test_base_get_subgroup_codec_data_inval_param_null_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)425 test_base_get_subgroup_codec_data_inval_param_null_cb(const struct bt_bap_base_subgroup *subgroup,
426 void *user_data)
427 {
428 int ret;
429
430 ret = bt_bap_base_get_subgroup_codec_data(subgroup, NULL);
431 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
432
433 return true;
434 }
435
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_codec_data_inval_param_null)436 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_codec_data_inval_param_null)
437 {
438 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
439 int ret;
440
441 zassert_not_null(base);
442
443 ret = bt_bap_base_foreach_subgroup(
444 base, test_base_get_subgroup_codec_data_inval_param_null_cb, NULL);
445 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
446 }
447
test_base_get_subgroup_codec_meta_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)448 static bool test_base_get_subgroup_codec_meta_cb(const struct bt_bap_base_subgroup *subgroup,
449 void *user_data)
450 {
451 const uint8_t expected_data[] = {0x03, 0x02, 0x01, 0x00};
452 uint8_t *data;
453 int ret;
454
455 ret = bt_bap_base_get_subgroup_codec_meta(subgroup, &data);
456 zassert_equal(ret, sizeof(expected_data), "Unexpected return value: %d", ret);
457 zassert_mem_equal(data, expected_data, sizeof(expected_data));
458
459 return true;
460 }
461
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_codec_meta)462 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_codec_meta)
463 {
464 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
465 int ret;
466
467 zassert_not_null(base);
468
469 ret = bt_bap_base_foreach_subgroup(base, test_base_get_subgroup_codec_meta_cb, NULL);
470 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
471 }
472
test_base_get_subgroup_codec_meta_inval_param_null_subgroup_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)473 static bool test_base_get_subgroup_codec_meta_inval_param_null_subgroup_cb(
474 const struct bt_bap_base_subgroup *subgroup, void *user_data)
475 {
476 uint8_t *data;
477 int ret;
478
479 ret = bt_bap_base_get_subgroup_codec_meta(NULL, &data);
480 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
481
482 return true;
483 }
484
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_codec_meta_inval_param_null_subgroup)485 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_codec_meta_inval_param_null_subgroup)
486 {
487 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
488 int ret;
489
490 zassert_not_null(base);
491
492 ret = bt_bap_base_foreach_subgroup(
493 base, test_base_get_subgroup_codec_meta_inval_param_null_subgroup_cb, NULL);
494 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
495 }
496
497 static bool
test_base_get_subgroup_codec_meta_inval_param_null_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)498 test_base_get_subgroup_codec_meta_inval_param_null_cb(const struct bt_bap_base_subgroup *subgroup,
499 void *user_data)
500 {
501 int ret;
502
503 ret = bt_bap_base_get_subgroup_codec_meta(subgroup, NULL);
504 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
505
506 return true;
507 }
508
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_codec_meta_inval_param_null)509 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_codec_meta_inval_param_null)
510 {
511 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
512 int ret;
513
514 zassert_not_null(base);
515
516 ret = bt_bap_base_foreach_subgroup(
517 base, test_base_get_subgroup_codec_meta_inval_param_null_cb, NULL);
518 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
519 }
520
test_base_subgroup_codec_to_codec_cfg_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)521 static bool test_base_subgroup_codec_to_codec_cfg_cb(const struct bt_bap_base_subgroup *subgroup,
522 void *user_data)
523 {
524 const uint8_t expected_meta[] = {0x03, 0x02, 0x01, 0x00};
525 const uint8_t expected_data[] = {
526 0x02, 0x01, 0x03, 0x02, 0x02, 0x01, 0x05, 0x03,
527 0x01, 0x00, 0x00, 0x00, 0x03, 0x04, 0x28, 0x00,
528 };
529 struct bt_audio_codec_cfg codec_cfg;
530 int ret;
531
532 ret = bt_bap_base_subgroup_codec_to_codec_cfg(subgroup, &codec_cfg);
533 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
534 zassert_equal(codec_cfg.data_len, sizeof(expected_data), "Unexpected data length: %d", ret);
535 zassert_equal(codec_cfg.meta_len, sizeof(expected_meta), "Unexpected meta length: %d", ret);
536 zassert_mem_equal(codec_cfg.data, expected_data, sizeof(expected_data));
537 zassert_mem_equal(codec_cfg.meta, expected_meta, sizeof(expected_meta));
538
539 return true;
540 }
541
ZTEST_F(bap_base_test_suite,test_base_subgroup_codec_to_codec_cfg)542 ZTEST_F(bap_base_test_suite, test_base_subgroup_codec_to_codec_cfg)
543 {
544 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
545 int ret;
546
547 zassert_not_null(base);
548
549 ret = bt_bap_base_foreach_subgroup(base, test_base_subgroup_codec_to_codec_cfg_cb, NULL);
550 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
551 }
552
test_base_subgroup_codec_to_codec_cfg_inval_param_null_subgroup_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)553 static bool test_base_subgroup_codec_to_codec_cfg_inval_param_null_subgroup_cb(
554 const struct bt_bap_base_subgroup *subgroup, void *user_data)
555 {
556 struct bt_audio_codec_cfg codec_cfg;
557 int ret;
558
559 ret = bt_bap_base_subgroup_codec_to_codec_cfg(NULL, &codec_cfg);
560 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
561
562 return true;
563 }
564
ZTEST_F(bap_base_test_suite,test_base_subgroup_codec_to_codec_cfg_inval_param_null_subgroup)565 ZTEST_F(bap_base_test_suite, test_base_subgroup_codec_to_codec_cfg_inval_param_null_subgroup)
566 {
567 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
568 int ret;
569
570 zassert_not_null(base);
571
572 ret = bt_bap_base_foreach_subgroup(
573 base, test_base_subgroup_codec_to_codec_cfg_inval_param_null_subgroup_cb, NULL);
574 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
575 }
576
test_base_subgroup_codec_to_codec_cfg_inval_param_null_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)577 static bool test_base_subgroup_codec_to_codec_cfg_inval_param_null_cb(
578 const struct bt_bap_base_subgroup *subgroup, void *user_data)
579 {
580 int ret;
581
582 ret = bt_bap_base_subgroup_codec_to_codec_cfg(subgroup, NULL);
583 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
584
585 return true;
586 }
587
ZTEST_F(bap_base_test_suite,test_base_subgroup_codec_to_codec_cfg_inval_param_null)588 ZTEST_F(bap_base_test_suite, test_base_subgroup_codec_to_codec_cfg_inval_param_null)
589 {
590 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
591 int ret;
592
593 zassert_not_null(base);
594
595 ret = bt_bap_base_foreach_subgroup(
596 base, test_base_subgroup_codec_to_codec_cfg_inval_param_null_cb, NULL);
597 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
598 }
599
test_base_get_subgroup_bis_count_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)600 static bool test_base_get_subgroup_bis_count_cb(const struct bt_bap_base_subgroup *subgroup,
601 void *user_data)
602 {
603 int ret;
604
605 ret = bt_bap_base_get_subgroup_bis_count(subgroup);
606 zassert_equal(ret, 0x01, "Unexpected return value: %d", ret);
607
608 return true;
609 }
610
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_bis_count)611 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_bis_count)
612 {
613 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
614 int ret;
615
616 zassert_not_null(base);
617
618 ret = bt_bap_base_foreach_subgroup(base, test_base_get_subgroup_bis_count_cb, NULL);
619 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
620 }
621
test_base_get_subgroup_bis_count_inval_param_null_subgroup_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)622 static bool test_base_get_subgroup_bis_count_inval_param_null_subgroup_cb(
623 const struct bt_bap_base_subgroup *subgroup, void *user_data)
624 {
625 int ret;
626
627 ret = bt_bap_base_get_subgroup_bis_count(NULL);
628 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
629
630 return true;
631 }
632
ZTEST_F(bap_base_test_suite,test_base_get_subgroup_bis_count_inval_param_null_subgroup)633 ZTEST_F(bap_base_test_suite, test_base_get_subgroup_bis_count_inval_param_null_subgroup)
634 {
635 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
636 int ret;
637
638 zassert_not_null(base);
639
640 ret = bt_bap_base_foreach_subgroup(
641 base, test_base_get_subgroup_bis_count_inval_param_null_subgroup_cb, NULL);
642 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
643 }
644
645 static bool
test_bt_bap_base_subgroup_get_bis_indexes_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)646 test_bt_bap_base_subgroup_get_bis_indexes_cb(const struct bt_bap_base_subgroup *subgroup,
647 void *user_data)
648 {
649 uint32_t bis_indexes;
650 int ret;
651
652 ret = bt_bap_base_subgroup_get_bis_indexes(subgroup, &bis_indexes);
653 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
654 zassert_not_equal(bis_indexes, 0 /* May be Bit 1 or 2 */,
655 "Unexpected BIS index value: 0x%08X", bis_indexes);
656
657 return true;
658 }
659
ZTEST_F(bap_base_test_suite,test_bt_bap_base_subgroup_get_bis_indexes)660 ZTEST_F(bap_base_test_suite, test_bt_bap_base_subgroup_get_bis_indexes)
661 {
662 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
663 int ret;
664
665 zassert_not_null(base);
666
667 ret = bt_bap_base_foreach_subgroup(base, test_bt_bap_base_subgroup_get_bis_indexes_cb,
668 NULL);
669 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
670 }
671
test_bt_bap_base_subgroup_get_bis_indexes_inval_param_null_subgroup_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)672 static bool test_bt_bap_base_subgroup_get_bis_indexes_inval_param_null_subgroup_cb(
673 const struct bt_bap_base_subgroup *subgroup, void *user_data)
674 {
675 uint32_t bis_indexes;
676 int ret;
677
678 ret = bt_bap_base_subgroup_get_bis_indexes(NULL, &bis_indexes);
679 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
680
681 return true;
682 }
683
ZTEST_F(bap_base_test_suite,test_bt_bap_base_subgroup_get_bis_indexes_inval_param_null_subgroup)684 ZTEST_F(bap_base_test_suite, test_bt_bap_base_subgroup_get_bis_indexes_inval_param_null_subgroup)
685 {
686 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
687 int ret;
688
689 zassert_not_null(base);
690
691 ret = bt_bap_base_foreach_subgroup(
692 base, test_bt_bap_base_subgroup_get_bis_indexes_inval_param_null_subgroup_cb, NULL);
693 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
694 }
695
test_bt_bap_base_subgroup_get_bis_indexes_inval_param_null_index_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)696 static bool test_bt_bap_base_subgroup_get_bis_indexes_inval_param_null_index_cb(
697 const struct bt_bap_base_subgroup *subgroup, void *user_data)
698 {
699 int ret;
700
701 ret = bt_bap_base_subgroup_get_bis_indexes(subgroup, NULL);
702 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
703
704 return true;
705 }
706
ZTEST_F(bap_base_test_suite,test_bt_bap_base_subgroup_get_bis_indexes_inval_param_null_index)707 ZTEST_F(bap_base_test_suite, test_bt_bap_base_subgroup_get_bis_indexes_inval_param_null_index)
708 {
709 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
710 int ret;
711
712 zassert_not_null(base);
713
714 ret = bt_bap_base_foreach_subgroup(
715 base, test_bt_bap_base_subgroup_get_bis_indexes_inval_param_null_index_cb, NULL);
716 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
717 }
718
719 static bool
test_base_subgroup_foreach_bis_subgroup_bis_cb(const struct bt_bap_base_subgroup_bis * bis,void * user_data)720 test_base_subgroup_foreach_bis_subgroup_bis_cb(const struct bt_bap_base_subgroup_bis *bis,
721 void *user_data)
722 {
723 size_t *count = user_data;
724
725 (*count)++;
726
727 return true;
728 }
729
test_base_subgroup_foreach_bis_subgroup_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)730 static bool test_base_subgroup_foreach_bis_subgroup_cb(const struct bt_bap_base_subgroup *subgroup,
731 void *user_data)
732 {
733 size_t *total_count = user_data;
734 size_t count = 0U;
735 int ret;
736
737 ret = bt_bap_base_subgroup_foreach_bis(
738 subgroup, test_base_subgroup_foreach_bis_subgroup_bis_cb, &count);
739 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
740 zassert_equal(count, 0x01, "Unexpected subgroup count value: %u", count);
741
742 *total_count += count;
743
744 return true;
745 }
746
ZTEST_F(bap_base_test_suite,test_base_subgroup_foreach_bis)747 ZTEST_F(bap_base_test_suite, test_base_subgroup_foreach_bis)
748 {
749 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
750 size_t count = 0U;
751 int ret;
752
753 zassert_not_null(base);
754
755 ret = bt_bap_base_foreach_subgroup(base, test_base_subgroup_foreach_bis_subgroup_cb,
756 &count);
757 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
758 zassert_equal(count, 0x02, "Unexpected subgroup count value: %u", count);
759 }
760
test_base_subgroup_foreach_bis_inval_param_null_subgroup_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)761 static bool test_base_subgroup_foreach_bis_inval_param_null_subgroup_cb(
762 const struct bt_bap_base_subgroup *subgroup, void *user_data)
763 {
764 size_t count;
765 int ret;
766
767 ret = bt_bap_base_subgroup_foreach_bis(NULL, test_base_subgroup_foreach_bis_subgroup_bis_cb,
768 &count);
769 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
770
771 return true;
772 }
773
ZTEST_F(bap_base_test_suite,test_base_subgroup_foreach_bis_inval_param_null_subgroup)774 ZTEST_F(bap_base_test_suite, test_base_subgroup_foreach_bis_inval_param_null_subgroup)
775 {
776 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
777 int ret;
778
779 zassert_not_null(base);
780
781 ret = bt_bap_base_foreach_subgroup(
782 base, test_base_subgroup_foreach_bis_inval_param_null_subgroup_cb, NULL);
783 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
784 }
785
786 static bool
test_base_subgroup_foreach_bis_inval_param_null_cb_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)787 test_base_subgroup_foreach_bis_inval_param_null_cb_cb(const struct bt_bap_base_subgroup *subgroup,
788 void *user_data)
789 {
790 int ret;
791
792 ret = bt_bap_base_subgroup_foreach_bis(subgroup, NULL, NULL);
793 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
794
795 return true;
796 }
797
ZTEST_F(bap_base_test_suite,test_base_subgroup_foreach_bis_inval_param_null_cb)798 ZTEST_F(bap_base_test_suite, test_base_subgroup_foreach_bis_inval_param_null_cb)
799 {
800 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
801 int ret;
802
803 zassert_not_null(base);
804
805 ret = bt_bap_base_foreach_subgroup(
806 base, test_base_subgroup_foreach_bis_inval_param_null_cb_cb, NULL);
807 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
808 }
809
810 static bool
test_base_subgroup_bis_codec_to_codec_cfg_bis_cb(const struct bt_bap_base_subgroup_bis * bis,void * user_data)811 test_base_subgroup_bis_codec_to_codec_cfg_bis_cb(const struct bt_bap_base_subgroup_bis *bis,
812 void *user_data)
813 {
814 const uint8_t expected_data[] = {0x02, 0x03, 0x03};
815 struct bt_audio_codec_cfg codec_cfg;
816 int ret;
817
818 ret = bt_bap_base_subgroup_bis_codec_to_codec_cfg(bis, &codec_cfg);
819 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
820 zassert_equal(codec_cfg.data_len, sizeof(expected_data), "Unexpected data length: %d", ret);
821 zassert_mem_equal(codec_cfg.data, expected_data, sizeof(expected_data));
822
823 return true;
824 }
825
826 static bool
test_base_subgroup_bis_codec_to_codec_cfg_subgroup_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)827 test_base_subgroup_bis_codec_to_codec_cfg_subgroup_cb(const struct bt_bap_base_subgroup *subgroup,
828 void *user_data)
829 {
830 int ret;
831
832 ret = bt_bap_base_subgroup_foreach_bis(
833 subgroup, test_base_subgroup_bis_codec_to_codec_cfg_bis_cb, NULL);
834 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
835
836 return true;
837 }
838
ZTEST_F(bap_base_test_suite,test_base_subgroup_bis_codec_to_codec_cfg)839 ZTEST_F(bap_base_test_suite, test_base_subgroup_bis_codec_to_codec_cfg)
840 {
841 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
842 int ret;
843
844 zassert_not_null(base);
845
846 ret = bt_bap_base_foreach_subgroup(
847 base, test_base_subgroup_bis_codec_to_codec_cfg_subgroup_cb, NULL);
848 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
849 }
850
test_base_subgroup_bis_codec_to_codec_cfg_inval_param_null_bis_bis_cb(const struct bt_bap_base_subgroup_bis * bis,void * user_data)851 static bool test_base_subgroup_bis_codec_to_codec_cfg_inval_param_null_bis_bis_cb(
852 const struct bt_bap_base_subgroup_bis *bis, void *user_data)
853 {
854 struct bt_audio_codec_cfg codec_cfg;
855 int ret;
856
857 ret = bt_bap_base_subgroup_bis_codec_to_codec_cfg(NULL, &codec_cfg);
858 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
859
860 return true;
861 }
862
test_base_subgroup_bis_codec_to_codec_cfg_inval_param_null_bis_subgroup_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)863 static bool test_base_subgroup_bis_codec_to_codec_cfg_inval_param_null_bis_subgroup_cb(
864 const struct bt_bap_base_subgroup *subgroup, void *user_data)
865 {
866 int ret;
867
868 ret = bt_bap_base_subgroup_foreach_bis(
869 NULL, test_base_subgroup_bis_codec_to_codec_cfg_inval_param_null_bis_bis_cb, NULL);
870 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
871
872 return true;
873 }
874
ZTEST_F(bap_base_test_suite,test_base_subgroup_foreach_bis_inval_param_null_bis)875 ZTEST_F(bap_base_test_suite, test_base_subgroup_foreach_bis_inval_param_null_bis)
876 {
877 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
878 int ret;
879
880 zassert_not_null(base);
881
882 ret = bt_bap_base_foreach_subgroup(
883 base, test_base_subgroup_bis_codec_to_codec_cfg_inval_param_null_bis_subgroup_cb,
884 NULL);
885 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
886 }
887
test_base_subgroup_bis_codec_to_codec_cfg_inval_param_null_codec_cfg_bis_cb(const struct bt_bap_base_subgroup_bis * bis,void * user_data)888 static bool test_base_subgroup_bis_codec_to_codec_cfg_inval_param_null_codec_cfg_bis_cb(
889 const struct bt_bap_base_subgroup_bis *bis, void *user_data)
890 {
891 int ret;
892
893 ret = bt_bap_base_subgroup_bis_codec_to_codec_cfg(bis, NULL);
894 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
895
896 return true;
897 }
898
test_base_subgroup_bis_codec_to_codec_cfg_inval_param_null_codec_cfg_subgroup_cb(const struct bt_bap_base_subgroup * subgroup,void * user_data)899 static bool test_base_subgroup_bis_codec_to_codec_cfg_inval_param_null_codec_cfg_subgroup_cb(
900 const struct bt_bap_base_subgroup *subgroup, void *user_data)
901 {
902 int ret;
903
904 ret = bt_bap_base_subgroup_foreach_bis(
905 NULL, test_base_subgroup_bis_codec_to_codec_cfg_inval_param_null_codec_cfg_bis_cb,
906 NULL);
907 zassert_equal(ret, -EINVAL, "Unexpected return value: %d", ret);
908
909 return true;
910 }
911
ZTEST_F(bap_base_test_suite,test_base_subgroup_foreach_bis_inval_param_null_codec_cfg)912 ZTEST_F(bap_base_test_suite, test_base_subgroup_foreach_bis_inval_param_null_codec_cfg)
913 {
914 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(&fixture->valid_base_ad);
915 int ret;
916
917 zassert_not_null(base);
918
919 ret = bt_bap_base_foreach_subgroup(
920 base,
921 test_base_subgroup_bis_codec_to_codec_cfg_inval_param_null_codec_cfg_subgroup_cb,
922 NULL);
923 zassert_equal(ret, 0, "Unexpected return value: %d", ret);
924 }
925