1 /* main.c - Application main entry point */
2 
3 /*
4  * Copyright (c) 2024 Nordic Semiconductor ASA
5  *
6  * SPDX-License-Identifier: Apache-2.0
7  */
8 
9 #include <errno.h>
10 #include <stdbool.h>
11 #include <stddef.h>
12 #include <stdlib.h>
13 #include <string.h>
14 
15 #include <zephyr/autoconf.h>
16 #include <zephyr/bluetooth/audio/ccp.h>
17 #include <zephyr/bluetooth/audio/tbs.h>
18 #include <zephyr/bluetooth/gatt.h>
19 #include <zephyr/bluetooth/uuid.h>
20 #include <zephyr/fff.h>
21 #include <zephyr/sys/util.h>
22 #include <zephyr/sys/util_macro.h>
23 #include <zephyr/ztest_test.h>
24 #include <zephyr/ztest_assert.h>
25 
26 DEFINE_FFF_GLOBALS;
27 
28 #define DEFAULT_BEARER_NAME "test"
29 
30 struct ccp_call_control_server_test_suite_fixture {
31 	/** Need 1 additional bearer than the max to trigger some corner cases */
32 	struct bt_ccp_call_control_server_bearer
33 		*bearers[CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT + 1];
34 };
35 
ccp_call_control_server_test_suite_setup(void)36 static void *ccp_call_control_server_test_suite_setup(void)
37 {
38 	struct ccp_call_control_server_test_suite_fixture *fixture;
39 
40 	fixture = malloc(sizeof(*fixture));
41 	zassert_not_null(fixture);
42 
43 	return fixture;
44 }
45 
ccp_call_control_server_test_suite_before(void * f)46 static void ccp_call_control_server_test_suite_before(void *f)
47 {
48 	memset(f, 0, sizeof(struct ccp_call_control_server_test_suite_fixture));
49 }
50 
ccp_call_control_server_test_suite_after(void * f)51 static void ccp_call_control_server_test_suite_after(void *f)
52 {
53 	struct ccp_call_control_server_test_suite_fixture *fixture = f;
54 
55 	/* We unregister from largest to lowest index, as GTBS shall be unregistered last and is
56 	 * always at index 0
57 	 */
58 	for (size_t i = ARRAY_SIZE(fixture->bearers); i > 0; i--) {
59 		/* Since size_t cannot be negative, we cannot use the regular i >= 0 when counting
60 		 * downwards as that will always be true, so we use an additional index variable
61 		 */
62 		const size_t index_to_unreg = i - 1;
63 
64 		if (fixture->bearers[index_to_unreg] != NULL) {
65 			bt_ccp_call_control_server_unregister_bearer(
66 				fixture->bearers[index_to_unreg]);
67 		}
68 
69 		fixture->bearers[index_to_unreg] = NULL;
70 	}
71 }
72 
ccp_call_control_server_test_suite_teardown(void * f)73 static void ccp_call_control_server_test_suite_teardown(void *f)
74 {
75 	free(f);
76 }
77 
78 ZTEST_SUITE(ccp_call_control_server_test_suite, NULL, ccp_call_control_server_test_suite_setup,
79 	    ccp_call_control_server_test_suite_before, ccp_call_control_server_test_suite_after,
80 	    ccp_call_control_server_test_suite_teardown);
81 
register_default_bearer(struct ccp_call_control_server_test_suite_fixture * fixture)82 static void register_default_bearer(struct ccp_call_control_server_test_suite_fixture *fixture)
83 {
84 	const struct bt_tbs_register_param register_param = {
85 		.provider_name = DEFAULT_BEARER_NAME,
86 		.uci = "un999",
87 		.uri_schemes_supported = "tel",
88 		.gtbs = true,
89 		.authorization_required = false,
90 		.technology = BT_TBS_TECHNOLOGY_3G,
91 		.supported_features = 0,
92 	};
93 	int err;
94 
95 	err = bt_ccp_call_control_server_register_bearer(&register_param, &fixture->bearers[0]);
96 	zassert_equal(err, 0, "Unexpected return value %d", err);
97 }
98 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_bearer)99 static ZTEST_F(ccp_call_control_server_test_suite, test_ccp_call_control_server_register_bearer)
100 {
101 	register_default_bearer(fixture);
102 }
103 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_multiple_bearers)104 static ZTEST_F(ccp_call_control_server_test_suite,
105 	       test_ccp_call_control_server_register_multiple_bearers)
106 {
107 	if (CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT == 1) {
108 		ztest_test_skip();
109 	}
110 
111 	register_default_bearer(fixture);
112 
113 	for (int i = 1; i < CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT; i++) {
114 		struct bt_tbs_register_param register_param = {
115 			.provider_name = "test",
116 			.uci = "un999",
117 			.uri_schemes_supported = "tel",
118 			.gtbs = false,
119 			.authorization_required = false,
120 			.technology = BT_TBS_TECHNOLOGY_3G,
121 			.supported_features = 0,
122 		};
123 		int err;
124 
125 		err = bt_ccp_call_control_server_register_bearer(&register_param,
126 								 &fixture->bearers[i]);
127 		zassert_equal(err, 0, "Unexpected return value %d", err);
128 	}
129 }
130 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_bearer_inval_null_param)131 static ZTEST_F(ccp_call_control_server_test_suite,
132 	       test_ccp_call_control_server_register_bearer_inval_null_param)
133 {
134 	int err;
135 
136 	err = bt_ccp_call_control_server_register_bearer(NULL, &fixture->bearers[0]);
137 	zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
138 }
139 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_bearer_inval_null_bearer)140 static ZTEST_F(ccp_call_control_server_test_suite,
141 	       test_ccp_call_control_server_register_bearer_inval_null_bearer)
142 {
143 	const struct bt_tbs_register_param register_param = {
144 		.provider_name = "test",
145 		.uci = "un999",
146 		.uri_schemes_supported = "tel",
147 		.gtbs = true,
148 		.authorization_required = false,
149 		.technology = BT_TBS_TECHNOLOGY_3G,
150 		.supported_features = 0,
151 	};
152 	int err;
153 
154 	err = bt_ccp_call_control_server_register_bearer(&register_param, NULL);
155 	zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
156 }
157 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_bearer_inval_no_gtbs)158 static ZTEST_F(ccp_call_control_server_test_suite,
159 	       test_ccp_call_control_server_register_bearer_inval_no_gtbs)
160 {
161 	const struct bt_tbs_register_param register_param = {
162 		.provider_name = "test",
163 		.uci = "un999",
164 		.uri_schemes_supported = "tel",
165 		.gtbs = false,
166 		.authorization_required = false,
167 		.technology = BT_TBS_TECHNOLOGY_3G,
168 		.supported_features = 0,
169 	};
170 	int err;
171 
172 	err = bt_ccp_call_control_server_register_bearer(&register_param, &fixture->bearers[0]);
173 	zassert_equal(err, -EAGAIN, "Unexpected return value %d", err);
174 }
175 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_bearer_inval_double_gtbs)176 static ZTEST_F(ccp_call_control_server_test_suite,
177 	       test_ccp_call_control_server_register_bearer_inval_double_gtbs)
178 {
179 	const struct bt_tbs_register_param register_param = {
180 		.provider_name = "test",
181 		.uci = "un999",
182 		.uri_schemes_supported = "tel",
183 		.gtbs = true,
184 		.authorization_required = false,
185 		.technology = BT_TBS_TECHNOLOGY_3G,
186 		.supported_features = 0,
187 	};
188 	int err;
189 
190 	if (CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT == 1) {
191 		ztest_test_skip();
192 	}
193 
194 	register_default_bearer(fixture);
195 
196 	err = bt_ccp_call_control_server_register_bearer(&register_param, &fixture->bearers[1]);
197 	zassert_equal(err, -EALREADY, "Unexpected return value %d", err);
198 }
199 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_bearer_inval_cnt)200 static ZTEST_F(ccp_call_control_server_test_suite,
201 	       test_ccp_call_control_server_register_bearer_inval_cnt)
202 {
203 	const struct bt_tbs_register_param register_param = {
204 		.provider_name = "test",
205 		.uci = "un999",
206 		.uri_schemes_supported = "tel",
207 		.gtbs = false,
208 		.authorization_required = false,
209 		.technology = BT_TBS_TECHNOLOGY_3G,
210 		.supported_features = 0,
211 	};
212 	int err;
213 
214 	if (CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT == 1) {
215 		ztest_test_skip();
216 	}
217 
218 	register_default_bearer(fixture);
219 
220 	for (int i = 1; i < CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT; i++) {
221 
222 		err = bt_ccp_call_control_server_register_bearer(&register_param,
223 								 &fixture->bearers[i]);
224 		zassert_equal(err, 0, "Unexpected return value %d", err);
225 	}
226 
227 	err = bt_ccp_call_control_server_register_bearer(
228 		&register_param, &fixture->bearers[CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT]);
229 	zassert_equal(err, -ENOMEM, "Unexpected return value %d", err);
230 }
231 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_unregister_bearer)232 static ZTEST_F(ccp_call_control_server_test_suite, test_ccp_call_control_server_unregister_bearer)
233 {
234 	int err;
235 
236 	register_default_bearer(fixture);
237 
238 	err = bt_ccp_call_control_server_unregister_bearer(fixture->bearers[0]);
239 	zassert_equal(err, 0, "Unexpected return value %d", err);
240 }
241 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_unregister_bearer_inval_double_unregister)242 static ZTEST_F(ccp_call_control_server_test_suite,
243 	       test_ccp_call_control_server_unregister_bearer_inval_double_unregister)
244 {
245 	int err;
246 
247 	register_default_bearer(fixture);
248 
249 	err = bt_ccp_call_control_server_unregister_bearer(fixture->bearers[0]);
250 	zassert_equal(err, 0, "Unexpected return value %d", err);
251 
252 	err = bt_ccp_call_control_server_unregister_bearer(fixture->bearers[0]);
253 	zassert_equal(err, -EALREADY, "Unexpected return value %d", err);
254 
255 	fixture->bearers[0] = NULL;
256 }
257 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_unregister_bearer_inval_null_bearer)258 static ZTEST_F(ccp_call_control_server_test_suite,
259 	       test_ccp_call_control_server_unregister_bearer_inval_null_bearer)
260 {
261 	int err;
262 
263 	err = bt_ccp_call_control_server_unregister_bearer(NULL);
264 	zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
265 }
266 
ZTEST_F(ccp_call_control_server_test_suite,test_bt_ccp_call_control_server_set_bearer_provider_name)267 static ZTEST_F(ccp_call_control_server_test_suite,
268 	       test_bt_ccp_call_control_server_set_bearer_provider_name)
269 {
270 	const char *new_bearer_name = "New bearer name";
271 	const char *res_bearer_name;
272 	int err;
273 
274 	register_default_bearer(fixture);
275 
276 	err = bt_ccp_call_control_server_set_bearer_provider_name(fixture->bearers[0],
277 								  new_bearer_name);
278 	zassert_equal(err, 0, "Unexpected return value %d", err);
279 
280 	err = bt_ccp_call_control_server_get_bearer_provider_name(fixture->bearers[0],
281 								  &res_bearer_name);
282 	zassert_equal(err, 0, "Unexpected return value %d", err);
283 
284 	zassert_str_equal(new_bearer_name, res_bearer_name, "%s != %s", new_bearer_name,
285 			  res_bearer_name);
286 }
287 
ZTEST_F(ccp_call_control_server_test_suite,test_bt_ccp_call_control_server_set_bearer_provider_name_inval_not_registered)288 static ZTEST_F(ccp_call_control_server_test_suite,
289 	       test_bt_ccp_call_control_server_set_bearer_provider_name_inval_not_registered)
290 {
291 	const char *new_bearer_name = "New bearer name";
292 	int err;
293 
294 	/* Register and unregister bearer to get a valid pointer but where it is unregistered*/
295 	register_default_bearer(fixture);
296 	err = bt_ccp_call_control_server_unregister_bearer(fixture->bearers[0]);
297 	zassert_equal(err, 0, "Unexpected return value %d", err);
298 
299 	err = bt_ccp_call_control_server_set_bearer_provider_name(fixture->bearers[0],
300 								  new_bearer_name);
301 	zassert_equal(err, -EFAULT, "Unexpected return value %d", err);
302 }
303 
ZTEST_F(ccp_call_control_server_test_suite,test_bt_ccp_call_control_server_set_bearer_provider_name_inval_null_bearer)304 static ZTEST_F(ccp_call_control_server_test_suite,
305 	       test_bt_ccp_call_control_server_set_bearer_provider_name_inval_null_bearer)
306 {
307 	const char *new_bearer_name = "New bearer name";
308 	int err;
309 
310 	register_default_bearer(fixture);
311 
312 	err = bt_ccp_call_control_server_set_bearer_provider_name(NULL, new_bearer_name);
313 	zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
314 }
315 
ZTEST_F(ccp_call_control_server_test_suite,test_bt_ccp_call_control_server_set_bearer_provider_name_inval_null_name)316 static ZTEST_F(ccp_call_control_server_test_suite,
317 	       test_bt_ccp_call_control_server_set_bearer_provider_name_inval_null_name)
318 {
319 	int err;
320 
321 	register_default_bearer(fixture);
322 
323 	err = bt_ccp_call_control_server_set_bearer_provider_name(fixture->bearers[0], NULL);
324 	zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
325 }
326 
ZTEST_F(ccp_call_control_server_test_suite,test_bt_ccp_call_control_server_set_bearer_provider_name_inval_empty_name)327 static ZTEST_F(ccp_call_control_server_test_suite,
328 	       test_bt_ccp_call_control_server_set_bearer_provider_name_inval_empty_name)
329 {
330 	const char *inval_bearer_name = "";
331 	int err;
332 
333 	register_default_bearer(fixture);
334 
335 	err = bt_ccp_call_control_server_set_bearer_provider_name(fixture->bearers[0],
336 								  inval_bearer_name);
337 	zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
338 }
339 
ZTEST_F(ccp_call_control_server_test_suite,test_bt_ccp_call_control_server_set_bearer_provider_name_inval_long_name)340 static ZTEST_F(ccp_call_control_server_test_suite,
341 	       test_bt_ccp_call_control_server_set_bearer_provider_name_inval_long_name)
342 {
343 	char inval_bearer_name[CONFIG_BT_CCP_CALL_CONTROL_SERVER_PROVIDER_NAME_MAX_LENGTH + 1];
344 	int err;
345 
346 	for (size_t i = 0; i < ARRAY_SIZE(inval_bearer_name); i++) {
347 		inval_bearer_name[i] = 'a';
348 	}
349 
350 	register_default_bearer(fixture);
351 
352 	err = bt_ccp_call_control_server_set_bearer_provider_name(fixture->bearers[0],
353 								  inval_bearer_name);
354 	zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
355 }
356 
ZTEST_F(ccp_call_control_server_test_suite,test_bt_ccp_call_control_server_get_bearer_provider_name)357 static ZTEST_F(ccp_call_control_server_test_suite,
358 	       test_bt_ccp_call_control_server_get_bearer_provider_name)
359 {
360 	const char *res_bearer_name;
361 	int err;
362 
363 	register_default_bearer(fixture);
364 
365 	err = bt_ccp_call_control_server_get_bearer_provider_name(fixture->bearers[0],
366 								  &res_bearer_name);
367 	zassert_equal(err, 0, "Unexpected return value %d", err);
368 
369 	zassert_str_equal(DEFAULT_BEARER_NAME, res_bearer_name, "%s != %s", DEFAULT_BEARER_NAME,
370 			  res_bearer_name);
371 }
372 
ZTEST_F(ccp_call_control_server_test_suite,test_bt_ccp_call_control_server_get_bearer_provider_name_inval_not_registered)373 static ZTEST_F(ccp_call_control_server_test_suite,
374 	       test_bt_ccp_call_control_server_get_bearer_provider_name_inval_not_registered)
375 {
376 	const char *res_bearer_name;
377 	int err;
378 
379 	/* Register and unregister bearer to get a valid pointer but where it is unregistered*/
380 	register_default_bearer(fixture);
381 	err = bt_ccp_call_control_server_unregister_bearer(fixture->bearers[0]);
382 	zassert_equal(err, 0, "Unexpected return value %d", err);
383 
384 	err = bt_ccp_call_control_server_get_bearer_provider_name(fixture->bearers[0],
385 								  &res_bearer_name);
386 	zassert_equal(err, -EFAULT, "Unexpected return value %d", err);
387 }
388 
ZTEST_F(ccp_call_control_server_test_suite,test_bt_ccp_call_control_server_get_bearer_provider_name_inval_null_bearer)389 static ZTEST_F(ccp_call_control_server_test_suite,
390 	       test_bt_ccp_call_control_server_get_bearer_provider_name_inval_null_bearer)
391 {
392 	const char *res_bearer_name;
393 	int err;
394 
395 	register_default_bearer(fixture);
396 
397 	err = bt_ccp_call_control_server_get_bearer_provider_name(NULL, &res_bearer_name);
398 	zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
399 }
400 
ZTEST_F(ccp_call_control_server_test_suite,test_bt_ccp_call_control_server_get_bearer_provider_name_inval_null_name)401 static ZTEST_F(ccp_call_control_server_test_suite,
402 	       test_bt_ccp_call_control_server_get_bearer_provider_name_inval_null_name)
403 {
404 	int err;
405 
406 	register_default_bearer(fixture);
407 
408 	err = bt_ccp_call_control_server_get_bearer_provider_name(fixture->bearers[0], NULL);
409 	zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
410 }
411