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