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