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