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