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 
24 #include <ztest_test.h>
25 #include <ztest_assert.h>
26 
27 DEFINE_FFF_GLOBALS;
28 
29 struct ccp_call_control_server_test_suite_fixture {
30 	/** Need 1 additional bearer than the max to trigger some corner cases */
31 	struct bt_ccp_call_control_server_bearer
32 		*bearers[CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT + 1];
33 };
34 
ccp_call_control_server_test_suite_setup(void)35 static void *ccp_call_control_server_test_suite_setup(void)
36 {
37 	struct ccp_call_control_server_test_suite_fixture *fixture;
38 
39 	fixture = malloc(sizeof(*fixture));
40 	zassert_not_null(fixture);
41 
42 	return fixture;
43 }
44 
ccp_call_control_server_test_suite_before(void * f)45 static void ccp_call_control_server_test_suite_before(void *f)
46 {
47 	memset(f, 0, sizeof(struct ccp_call_control_server_test_suite_fixture));
48 }
49 
ccp_call_control_server_test_suite_after(void * f)50 static void ccp_call_control_server_test_suite_after(void *f)
51 {
52 	struct ccp_call_control_server_test_suite_fixture *fixture = f;
53 
54 	/* We unregister from largest to lowest index, as GTBS shall be unregistered last and is
55 	 * always at index 0
56 	 */
57 	for (size_t i = ARRAY_SIZE(fixture->bearers); i > 0; i--) {
58 		/* Since size_t cannot be negative, we cannot use the regular i >= 0 when counting
59 		 * downwards as that will always be true, so we use an additional index variable
60 		 */
61 		const size_t index_to_unreg = i - 1;
62 
63 		if (fixture->bearers[index_to_unreg] != NULL) {
64 			bt_ccp_call_control_server_unregister_bearer(
65 				fixture->bearers[index_to_unreg]);
66 		}
67 
68 		fixture->bearers[index_to_unreg] = NULL;
69 	}
70 }
71 
ccp_call_control_server_test_suite_teardown(void * f)72 static void ccp_call_control_server_test_suite_teardown(void *f)
73 {
74 	free(f);
75 }
76 
77 ZTEST_SUITE(ccp_call_control_server_test_suite, NULL, ccp_call_control_server_test_suite_setup,
78 	    ccp_call_control_server_test_suite_before, ccp_call_control_server_test_suite_after,
79 	    ccp_call_control_server_test_suite_teardown);
80 
register_default_bearer(struct ccp_call_control_server_test_suite_fixture * fixture)81 static void register_default_bearer(struct ccp_call_control_server_test_suite_fixture *fixture)
82 {
83 	const struct bt_tbs_register_param register_param = {
84 		.provider_name = "test",
85 		.uci = "un999",
86 		.uri_schemes_supported = "tel",
87 		.gtbs = true,
88 		.authorization_required = false,
89 		.technology = BT_TBS_TECHNOLOGY_3G,
90 		.supported_features = 0,
91 	};
92 	int err;
93 
94 	err = bt_ccp_call_control_server_register_bearer(&register_param, &fixture->bearers[0]);
95 	zassert_equal(err, 0, "Unexpected return value %d", err);
96 }
97 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_bearer)98 static ZTEST_F(ccp_call_control_server_test_suite, test_ccp_call_control_server_register_bearer)
99 {
100 	register_default_bearer(fixture);
101 }
102 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_multiple_bearers)103 static ZTEST_F(ccp_call_control_server_test_suite,
104 	       test_ccp_call_control_server_register_multiple_bearers)
105 {
106 	if (CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT == 1) {
107 		ztest_test_skip();
108 	}
109 
110 	register_default_bearer(fixture);
111 
112 	for (int i = 1; i < CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT; i++) {
113 		struct bt_tbs_register_param register_param = {
114 			.provider_name = "test",
115 			.uci = "un999",
116 			.uri_schemes_supported = "tel",
117 			.gtbs = false,
118 			.authorization_required = false,
119 			.technology = BT_TBS_TECHNOLOGY_3G,
120 			.supported_features = 0,
121 		};
122 		int err;
123 
124 		err = bt_ccp_call_control_server_register_bearer(&register_param,
125 								 &fixture->bearers[i]);
126 		zassert_equal(err, 0, "Unexpected return value %d", err);
127 	}
128 }
129 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_bearer_inval_null_param)130 static ZTEST_F(ccp_call_control_server_test_suite,
131 	       test_ccp_call_control_server_register_bearer_inval_null_param)
132 {
133 	int err;
134 
135 	err = bt_ccp_call_control_server_register_bearer(NULL, &fixture->bearers[0]);
136 	zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
137 }
138 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_bearer_inval_null_bearer)139 static ZTEST_F(ccp_call_control_server_test_suite,
140 	       test_ccp_call_control_server_register_bearer_inval_null_bearer)
141 {
142 	const struct bt_tbs_register_param register_param = {
143 		.provider_name = "test",
144 		.uci = "un999",
145 		.uri_schemes_supported = "tel",
146 		.gtbs = true,
147 		.authorization_required = false,
148 		.technology = BT_TBS_TECHNOLOGY_3G,
149 		.supported_features = 0,
150 	};
151 	int err;
152 
153 	err = bt_ccp_call_control_server_register_bearer(&register_param, NULL);
154 	zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
155 }
156 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_bearer_inval_no_gtbs)157 static ZTEST_F(ccp_call_control_server_test_suite,
158 	       test_ccp_call_control_server_register_bearer_inval_no_gtbs)
159 {
160 	const struct bt_tbs_register_param register_param = {
161 		.provider_name = "test",
162 		.uci = "un999",
163 		.uri_schemes_supported = "tel",
164 		.gtbs = false,
165 		.authorization_required = false,
166 		.technology = BT_TBS_TECHNOLOGY_3G,
167 		.supported_features = 0,
168 	};
169 	int err;
170 
171 	err = bt_ccp_call_control_server_register_bearer(&register_param, &fixture->bearers[0]);
172 	zassert_equal(err, -EAGAIN, "Unexpected return value %d", err);
173 }
174 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_bearer_inval_double_gtbs)175 static ZTEST_F(ccp_call_control_server_test_suite,
176 	       test_ccp_call_control_server_register_bearer_inval_double_gtbs)
177 {
178 	const struct bt_tbs_register_param register_param = {
179 		.provider_name = "test",
180 		.uci = "un999",
181 		.uri_schemes_supported = "tel",
182 		.gtbs = true,
183 		.authorization_required = false,
184 		.technology = BT_TBS_TECHNOLOGY_3G,
185 		.supported_features = 0,
186 	};
187 	int err;
188 
189 	if (CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT == 1) {
190 		ztest_test_skip();
191 	}
192 
193 	register_default_bearer(fixture);
194 
195 	err = bt_ccp_call_control_server_register_bearer(&register_param, &fixture->bearers[1]);
196 	zassert_equal(err, -EALREADY, "Unexpected return value %d", err);
197 }
198 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_register_bearer_inval_cnt)199 static ZTEST_F(ccp_call_control_server_test_suite,
200 	       test_ccp_call_control_server_register_bearer_inval_cnt)
201 {
202 	const struct bt_tbs_register_param register_param = {
203 		.provider_name = "test",
204 		.uci = "un999",
205 		.uri_schemes_supported = "tel",
206 		.gtbs = false,
207 		.authorization_required = false,
208 		.technology = BT_TBS_TECHNOLOGY_3G,
209 		.supported_features = 0,
210 	};
211 	int err;
212 
213 	if (CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT == 1) {
214 		ztest_test_skip();
215 	}
216 
217 	register_default_bearer(fixture);
218 
219 	for (int i = 1; i < CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT; i++) {
220 
221 		err = bt_ccp_call_control_server_register_bearer(&register_param,
222 								 &fixture->bearers[i]);
223 		zassert_equal(err, 0, "Unexpected return value %d", err);
224 	}
225 
226 	err = bt_ccp_call_control_server_register_bearer(
227 		&register_param, &fixture->bearers[CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT]);
228 	zassert_equal(err, -ENOMEM, "Unexpected return value %d", err);
229 }
230 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_unregister_bearer)231 static ZTEST_F(ccp_call_control_server_test_suite, test_ccp_call_control_server_unregister_bearer)
232 {
233 	int err;
234 
235 	register_default_bearer(fixture);
236 
237 	err = bt_ccp_call_control_server_unregister_bearer(fixture->bearers[0]);
238 	zassert_equal(err, 0, "Unexpected return value %d", err);
239 }
240 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_unregister_bearer_inval_double_unregister)241 static ZTEST_F(ccp_call_control_server_test_suite,
242 	       test_ccp_call_control_server_unregister_bearer_inval_double_unregister)
243 {
244 	int err;
245 
246 	register_default_bearer(fixture);
247 
248 	err = bt_ccp_call_control_server_unregister_bearer(fixture->bearers[0]);
249 	zassert_equal(err, 0, "Unexpected return value %d", err);
250 
251 	err = bt_ccp_call_control_server_unregister_bearer(fixture->bearers[0]);
252 	zassert_equal(err, -EALREADY, "Unexpected return value %d", err);
253 
254 	fixture->bearers[0] = NULL;
255 }
256 
ZTEST_F(ccp_call_control_server_test_suite,test_ccp_call_control_server_unregister_bearer_inval_null_bearer)257 static ZTEST_F(ccp_call_control_server_test_suite,
258 	       test_ccp_call_control_server_unregister_bearer_inval_null_bearer)
259 {
260 	int err;
261 
262 	err = bt_ccp_call_control_server_unregister_bearer(NULL);
263 	zassert_equal(err, -EINVAL, "Unexpected return value %d", err);
264 }
265