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(®ister_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(®ister_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(®ister_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(®ister_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(®ister_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(®ister_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 ®ister_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