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