1 /*
2 * Copyright (c) 2022 Codecoup
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6 #include <stdbool.h>
7 #include <stddef.h>
8 #include <stdint.h>
9
10 #include <zephyr/autoconf.h>
11 #include <zephyr/bluetooth/audio/has.h>
12 #include <zephyr/bluetooth/bluetooth.h>
13 #include <zephyr/bluetooth/gatt.h>
14 #include <zephyr/logging/log.h>
15 #include <zephyr/logging/log_core.h>
16 #include <zephyr/sys/util_macro.h>
17
18 #include "bstests.h"
19 #include "common.h"
20
21 LOG_MODULE_REGISTER(has_test, LOG_LEVEL_DBG);
22
23 extern enum bst_result_t bst_result;
24
25 const uint8_t test_preset_index_1 = 0x01;
26 const uint8_t test_preset_index_3 = 0x03;
27 const uint8_t test_preset_index_5 = 0x05;
28 const char *test_preset_name_1 = "test_preset_name_1";
29 const char *test_preset_name_3 = "test_preset_name_3";
30 const char *test_preset_name_5 = "test_preset_name_5";
31 const enum bt_has_properties test_preset_properties = BT_HAS_PROP_AVAILABLE;
32
preset_select(uint8_t index,bool sync)33 static int preset_select(uint8_t index, bool sync)
34 {
35 return 0;
36 }
37
38 static const struct bt_has_preset_ops preset_ops = {
39 .select = preset_select,
40 };
41
start_adv(void)42 static void start_adv(void)
43 {
44 struct bt_le_ext_adv *ext_adv;
45
46 setup_connectable_adv(&ext_adv);
47 }
48
test_common(void)49 static void test_common(void)
50 {
51 struct bt_has_features_param has_param = {0};
52 struct bt_has_preset_register_param preset_param;
53
54 int err;
55
56 err = bt_enable(NULL);
57 if (err) {
58 FAIL("Bluetooth enable failed (err %d)\n", err);
59 return;
60 }
61
62 LOG_DBG("Bluetooth initialized");
63
64 start_adv();
65
66 has_param.type = BT_HAS_HEARING_AID_TYPE_BINAURAL;
67 has_param.preset_sync_support = true;
68
69 err = bt_has_register(&has_param);
70 if (err) {
71 FAIL("HAS register failed (err %d)\n", err);
72 return;
73 }
74
75 has_param.type = BT_HAS_HEARING_AID_TYPE_MONAURAL;
76 has_param.preset_sync_support = false;
77
78 err = bt_has_features_set(&has_param);
79 if (err) {
80 FAIL("HAS register failed (err %d)\n", err);
81 return;
82 }
83
84 preset_param.index = test_preset_index_5;
85 preset_param.properties = test_preset_properties;
86 preset_param.name = test_preset_name_5;
87 preset_param.ops = &preset_ops,
88
89 err = bt_has_preset_register(&preset_param);
90 if (err) {
91 FAIL("Preset register failed (err %d)\n", err);
92 return;
93 }
94
95 preset_param.index = test_preset_index_1;
96 preset_param.properties = test_preset_properties;
97 preset_param.name = test_preset_name_1;
98
99 err = bt_has_preset_register(&preset_param);
100 if (err) {
101 FAIL("Preset register failed (err %d)\n", err);
102 return;
103 }
104
105 LOG_DBG("Presets registered");
106
107 PASS("HAS passed\n");
108 }
109
test_main(void)110 static void test_main(void)
111 {
112 test_common();
113
114 PASS("HAS passed\n");
115 }
116
test_offline_behavior(void)117 static void test_offline_behavior(void)
118 {
119 struct bt_has_preset_register_param preset_param;
120 struct bt_has_features_param has_param = {0};
121 int err;
122
123 test_common();
124
125 WAIT_FOR_FLAG(flag_connected);
126 WAIT_FOR_UNSET_FLAG(flag_connected);
127 start_adv();
128
129 preset_param.index = test_preset_index_3;
130 preset_param.properties = test_preset_properties;
131 preset_param.name = test_preset_name_3;
132 preset_param.ops = &preset_ops,
133
134 err = bt_has_preset_register(&preset_param);
135 if (err) {
136 FAIL("Preset register failed (err %d)\n", err);
137 return;
138 }
139
140 has_param.type = BT_HAS_HEARING_AID_TYPE_BINAURAL;
141 has_param.preset_sync_support = true;
142
143 err = bt_has_features_set(&has_param);
144 if (err) {
145 FAIL("Features set failed (err %d)\n", err);
146 return;
147 }
148
149 err = bt_has_preset_active_set(test_preset_index_3);
150 if (err) {
151 FAIL("Preset activation failed (err %d)\n", err);
152 return;
153 }
154
155 WAIT_FOR_FLAG(flag_connected);
156
157 PASS("HAS passed\n");
158 }
159
160 static const struct bst_test_instance test_has[] = {
161 {
162 .test_id = "has",
163 .test_pre_init_f = test_init,
164 .test_tick_f = test_tick,
165 .test_main_f = test_main,
166 },
167 {
168 .test_id = "has_offline_behavior",
169 .test_pre_init_f = test_init,
170 .test_tick_f = test_tick,
171 .test_main_f = test_offline_behavior,
172 },
173 BSTEST_END_MARKER,
174 };
175
test_has_install(struct bst_test_list * tests)176 struct bst_test_list *test_has_install(struct bst_test_list *tests)
177 {
178 if (IS_ENABLED(CONFIG_BT_HAS)) {
179 return bst_add_tests(tests, test_has);
180 } else {
181 return tests;
182 }
183 }
184