2 * Copyright (C) 2014 Intel Corporation
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include "emulator/bthost.h"
23 #include "src/shared/tester.h"
24 #include "src/shared/queue.h"
25 #include "tester-main.h"
27 static struct queue *list; /* List of socket test cases */
29 static bt_bdaddr_t bdaddr_dummy = {
30 .address = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55}
33 static int got_fd_result = -1;
35 static struct bt_action_data btsock_param_socktype_0 = {
36 .addr = &bdaddr_dummy,
40 .service_name = "Test service",
45 static struct bt_action_data btsock_param_socktype_l2cap = {
46 .addr = &bdaddr_dummy,
47 .sock_type = BTSOCK_L2CAP,
50 .service_name = "Test service",
55 static struct bt_action_data btsock_param_channel_0 = {
56 .addr = &bdaddr_dummy,
57 .sock_type = BTSOCK_RFCOMM,
60 .service_name = "Test service",
65 static struct bt_action_data btsock_param = {
66 .addr = &bdaddr_dummy,
67 .sock_type = BTSOCK_RFCOMM,
70 .service_name = "Test service",
75 static struct bt_action_data btsock_param_inv_bdaddr = {
77 .sock_type = BTSOCK_RFCOMM,
80 .service_name = "Test service",
85 static bt_bdaddr_t emu_remote_bdaddr_val = {
86 .address = { 0x00, 0xaa, 0x01, 0x01, 0x00, 0x00 },
88 static bt_property_t prop_emu_remote_bdadr = {
89 .type = BT_PROPERTY_BDADDR,
90 .val = &emu_remote_bdaddr_val,
91 .len = sizeof(emu_remote_bdaddr_val),
93 static bt_property_t prop_emu_remotes_default_set[] = {
94 { BT_PROPERTY_BDADDR, sizeof(emu_remote_bdaddr_val),
95 &emu_remote_bdaddr_val },
98 static struct bt_action_data btsock_param_emu_bdaddr = {
99 .addr = &emu_remote_bdaddr_val,
100 .sock_type = BTSOCK_RFCOMM,
102 .service_uuid = NULL,
103 .service_name = "Test service",
105 .fd = &got_fd_result,
108 static struct emu_set_l2cap_data l2cap_setup_data = {
114 static struct bt_action_data prop_emu_remote_bdaddr_req = {
115 .addr = &emu_remote_bdaddr_val,
116 .prop_type = BT_PROPERTY_BDADDR,
117 .prop = &prop_emu_remote_bdadr,
120 static void socket_listen_action(void)
122 struct test_data *data = tester_get_data();
123 struct step *current_data_step = queue_peek_head(data->steps);
124 struct bt_action_data *action_data = current_data_step->set_data;
125 struct step *step = g_new0(struct step, 1);
127 *action_data->fd = -1;
129 step->action_status = data->if_sock->listen(action_data->sock_type,
130 action_data->service_name,
131 action_data->service_uuid,
132 action_data->channel,
136 schedule_action_verification(step);
139 static void socket_connect_action(void)
141 struct test_data *data = tester_get_data();
142 struct step *current_data_step = queue_peek_head(data->steps);
143 struct bt_action_data *action_data = current_data_step->set_data;
147 *action_data->fd = -1;
149 status = data->if_sock->connect(action_data->addr,
150 action_data->sock_type,
151 action_data->service_uuid,
152 action_data->channel,
156 tester_print("status %d sock_fd %d", status, *action_data->fd);
161 step = g_new0(struct step, 1);
162 step->action_status = status;
164 schedule_action_verification(step);
167 static gboolean socket_chan_cb(GIOChannel *io, GIOCondition cond,
170 int sock_fd = g_io_channel_unix_get_fd(io);
171 struct step *step = g_new0(struct step, 1);
174 tester_print("%s", __func__);
176 if (cond & G_IO_HUP) {
177 tester_warn("Socket %d hang up", sock_fd);
179 step->action_status = BT_STATUS_FAIL;
183 if (cond & (G_IO_ERR | G_IO_NVAL)) {
184 tester_warn("Socket error: sock %d cond %d", sock_fd, cond);
186 step->action_status = BT_STATUS_FAIL;
190 len = read(sock_fd, &channel, sizeof(channel));
191 if (len != sizeof(channel)) {
192 tester_warn("Socket read failed");
194 step->action_status = BT_STATUS_FAIL;
198 tester_print("read correct channel: %d", channel);
200 step->action_status = BT_STATUS_SUCCESS;
203 schedule_action_verification(step);
207 static void socket_read_fd_action(void)
209 struct test_data *data = tester_get_data();
210 struct step *current_data_step = queue_peek_head(data->steps);
211 struct bt_action_data *action_data = current_data_step->set_data;
214 io = g_io_channel_unix_new(*action_data->fd);
215 g_io_channel_set_close_on_unref(io, TRUE);
217 g_io_add_watch(io, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
218 socket_chan_cb, NULL);
220 g_io_channel_unref(io);
223 static void socket_verify_fd_action(void)
225 struct test_data *data = tester_get_data();
226 struct step *current_data_step = queue_peek_head(data->steps);
227 struct bt_action_data *action_data = current_data_step->set_data;
228 struct step *step = g_new0(struct step, 1);
230 if (!*action_data->fd) {
231 step->action_status = BT_STATUS_FAIL;
235 step->action_status = (fcntl(*action_data->fd, F_GETFD) < 0) ?
236 BT_STATUS_FAIL : BT_STATUS_SUCCESS;
239 schedule_action_verification(step);
242 static void socket_verify_channel_action(void)
244 struct test_data *data = tester_get_data();
245 struct step *current_data_step = queue_peek_head(data->steps);
246 struct bt_action_data *action_data = current_data_step->set_data;
248 struct step *step = g_new0(struct step, 1);
250 if (!*action_data->fd) {
251 tester_warn("Ups no action_data->fd");
253 step->action_status = BT_STATUS_FAIL;
257 len = read(*action_data->fd, &channel, sizeof(channel));
258 if (len != sizeof(channel) || channel != action_data->channel) {
259 tester_warn("Ups bad channel");
261 step->action_status = BT_STATUS_FAIL;
265 step->action_status = BT_STATUS_SUCCESS;
268 schedule_action_verification(step);
271 static void socket_close_channel_action(void)
273 struct test_data *data = tester_get_data();
274 struct step *current_data_step = queue_peek_head(data->steps);
275 struct bt_action_data *action_data = current_data_step->set_data;
276 struct step *step = g_new0(struct step, 1);
278 if (!*action_data->fd) {
279 tester_warn("Ups no action_data->fd");
281 step->action_status = BT_STATUS_FAIL;
285 close(*action_data->fd);
286 *action_data->fd = -1;
288 step->action_status = BT_STATUS_SUCCESS;
291 schedule_action_verification(step);
294 static struct test_case test_cases[] = {
295 TEST_CASE_BREDRLE("Socket Init",
296 ACTION_SUCCESS(dummy_action, NULL),
298 TEST_CASE_BREDRLE("Socket Listen - Invalid: sock_type 0",
299 ACTION_SUCCESS(bluetooth_enable_action, NULL),
300 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
301 ACTION(BT_STATUS_PARM_INVALID, socket_listen_action,
302 &btsock_param_socktype_0),
303 ACTION_SUCCESS(bluetooth_disable_action, NULL),
304 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
306 TEST_CASE_BREDRLE("Socket Listen - Invalid: sock_type L2CAP",
307 ACTION_SUCCESS(bluetooth_enable_action, NULL),
308 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
309 ACTION(BT_STATUS_UNSUPPORTED, socket_listen_action,
310 &btsock_param_socktype_l2cap),
311 ACTION_SUCCESS(bluetooth_disable_action, NULL),
312 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
314 TEST_CASE_BREDRLE("Socket Listen - Invalid: chan, uuid",
315 ACTION_SUCCESS(bluetooth_enable_action, NULL),
316 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
317 ACTION(BT_STATUS_PARM_INVALID, socket_listen_action,
318 &btsock_param_channel_0),
319 ACTION_SUCCESS(bluetooth_disable_action, NULL),
320 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
322 TEST_CASE_BREDRLE("Socket Listen - Check returned fd valid",
323 ACTION_SUCCESS(bluetooth_enable_action, NULL),
324 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
325 ACTION_SUCCESS(socket_listen_action, &btsock_param),
326 ACTION_SUCCESS(socket_verify_fd_action, &btsock_param),
327 ACTION_SUCCESS(bluetooth_disable_action, NULL),
328 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
330 TEST_CASE_BREDRLE("Socket Listen - Check returned channel",
331 ACTION_SUCCESS(bluetooth_enable_action, NULL),
332 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
333 ACTION_SUCCESS(socket_listen_action, &btsock_param),
334 ACTION_SUCCESS(socket_verify_fd_action, &btsock_param),
335 ACTION_SUCCESS(socket_verify_channel_action, &btsock_param),
336 ACTION_SUCCESS(bluetooth_disable_action, NULL),
337 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
339 TEST_CASE_BREDRLE("Socket Listen - Close and Listen again",
340 ACTION_SUCCESS(bluetooth_enable_action, NULL),
341 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
342 ACTION_SUCCESS(socket_listen_action, &btsock_param),
343 ACTION_SUCCESS(socket_verify_fd_action, &btsock_param),
344 ACTION_SUCCESS(socket_verify_channel_action, &btsock_param),
345 ACTION_SUCCESS(socket_close_channel_action, &btsock_param),
346 ACTION_SUCCESS(socket_listen_action, &btsock_param),
347 ACTION_SUCCESS(socket_verify_fd_action, &btsock_param),
348 ACTION_SUCCESS(socket_verify_channel_action, &btsock_param),
349 ACTION_SUCCESS(bluetooth_disable_action, NULL),
350 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
352 TEST_CASE_BREDRLE("Socket Listen - Invalid: double Listen",
353 ACTION_SUCCESS(bluetooth_enable_action, NULL),
354 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
355 ACTION_SUCCESS(socket_listen_action, &btsock_param),
356 ACTION_SUCCESS(socket_verify_fd_action, &btsock_param),
357 ACTION_SUCCESS(socket_verify_channel_action, &btsock_param),
358 ACTION(BT_STATUS_BUSY, socket_listen_action, &btsock_param),
359 ACTION_SUCCESS(bluetooth_disable_action, NULL),
360 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
362 TEST_CASE_BREDRLE("Socket Connect - Invalid: sock_type 0",
363 ACTION_SUCCESS(bluetooth_enable_action, NULL),
364 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
365 ACTION(BT_STATUS_PARM_INVALID, socket_connect_action,
366 &btsock_param_socktype_0),
367 ACTION_SUCCESS(bluetooth_disable_action, NULL),
368 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
370 TEST_CASE_BREDRLE("Socket Connect - Invalid: sock_type L2CAP",
371 ACTION_SUCCESS(bluetooth_enable_action, NULL),
372 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
373 ACTION(BT_STATUS_UNSUPPORTED, socket_connect_action,
374 &btsock_param_socktype_l2cap),
375 ACTION_SUCCESS(bluetooth_disable_action, NULL),
376 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
378 TEST_CASE_BREDRLE("Socket Connect - Invalid: chan, uuid",
379 ACTION_SUCCESS(bluetooth_enable_action, NULL),
380 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
381 ACTION(BT_STATUS_PARM_INVALID, socket_connect_action,
382 &btsock_param_channel_0),
383 ACTION_SUCCESS(bluetooth_disable_action, NULL),
384 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
386 TEST_CASE_BREDRLE("Socket Connect - Invalid: bdaddr",
387 ACTION_SUCCESS(bluetooth_enable_action, NULL),
388 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
389 ACTION(BT_STATUS_PARM_INVALID, socket_connect_action,
390 &btsock_param_inv_bdaddr),
391 ACTION_SUCCESS(bluetooth_disable_action, NULL),
392 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
394 TEST_CASE_BREDRLE("Socket Connect - Check returned fd valid",
395 ACTION_SUCCESS(set_default_ssp_request_handler, NULL),
396 ACTION_SUCCESS(bluetooth_enable_action, NULL),
397 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
398 ACTION_SUCCESS(emu_setup_powered_remote_action, NULL),
399 ACTION_SUCCESS(emu_set_ssp_mode_action, NULL),
400 ACTION_SUCCESS(bt_create_bond_action,
401 &prop_emu_remote_bdaddr_req),
402 CALLBACK_BOND_STATE(BT_BOND_STATE_BONDING,
403 &prop_emu_remote_bdadr, 1),
404 CALLBACK_DEVICE_FOUND(prop_emu_remotes_default_set, 1),
405 CALLBACK_BOND_STATE(BT_BOND_STATE_BONDED,
406 &prop_emu_remote_bdadr, 1),
407 CALLBACK_DEVICE_PROPS(NULL, 0),
408 ACTION_SUCCESS(emu_add_l2cap_server_action, &l2cap_setup_data),
409 ACTION_SUCCESS(emu_add_rfcomm_server_action,
410 &btsock_param_emu_bdaddr),
411 ACTION_SUCCESS(socket_connect_action, &btsock_param_emu_bdaddr),
412 ACTION_SUCCESS(socket_verify_fd_action,
413 &btsock_param_emu_bdaddr),
414 ACTION_SUCCESS(bluetooth_disable_action, NULL),
415 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
417 TEST_CASE_BREDRLE("Socket Connect - Check returned chann",
418 ACTION_SUCCESS(set_default_ssp_request_handler, NULL),
419 ACTION_SUCCESS(bluetooth_enable_action, NULL),
420 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON),
421 ACTION_SUCCESS(emu_setup_powered_remote_action, NULL),
422 ACTION_SUCCESS(emu_set_ssp_mode_action, NULL),
423 ACTION_SUCCESS(bt_create_bond_action,
424 &prop_emu_remote_bdaddr_req),
425 CALLBACK_BOND_STATE(BT_BOND_STATE_BONDING,
426 &prop_emu_remote_bdadr, 1),
427 CALLBACK_DEVICE_FOUND(prop_emu_remotes_default_set, 1),
428 CALLBACK_BOND_STATE(BT_BOND_STATE_BONDED,
429 &prop_emu_remote_bdadr, 1),
430 CALLBACK_DEVICE_PROPS(NULL, 0),
431 ACTION_SUCCESS(emu_add_l2cap_server_action, &l2cap_setup_data),
432 ACTION_SUCCESS(emu_add_rfcomm_server_action,
433 &btsock_param_emu_bdaddr),
434 ACTION_SUCCESS(socket_connect_action, &btsock_param_emu_bdaddr),
435 ACTION_SUCCESS(socket_verify_fd_action,
436 &btsock_param_emu_bdaddr),
437 ACTION_SUCCESS(socket_verify_channel_action,
438 &btsock_param_emu_bdaddr),
439 ACTION_SUCCESS(socket_read_fd_action, &btsock_param_emu_bdaddr),
440 ACTION_SUCCESS(bluetooth_disable_action, NULL),
441 CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
445 struct queue *get_socket_tests(void)
451 for (; i < sizeof(test_cases) / sizeof(test_cases[0]); ++i)
452 queue_push_tail(list, &test_cases[i]);
457 void remove_socket_tests(void)
459 queue_destroy(list, NULL);