// SPDX-License-Identifier: Apache-2.0 /* * Copyright (C) 2014 Intel Corporation * */ #define _GNU_SOURCE #include #include "emulator/bthost.h" #include "src/shared/tester.h" #include "src/shared/queue.h" #include "tester-main.h" static struct queue *list = NULL; /* List of map client test cases */ #define INST0_ID 0 #define INST1_ID 1 #define sdp_rsp_pdu 0x07, \ 0x00, 0x00, \ 0x00, 0xb5, \ 0x00, 0xb2, \ 0x35, 0xb0, 0x36, 0x00, 0x56, 0x09, 0x00, 0x00, 0x0a, \ 0x00, 0x01, 0x00, 0x09, 0x09, 0x00, 0x01, 0x35, 0x03, \ 0x19, 0x11, 0x32, 0x09, 0x00, 0x04, 0x35, 0x11, 0x35, \ 0x03, 0x19, 0x01, 0x00, 0x35, 0x05, 0x19, 0x00, 0x03, \ 0x08, 0x04, 0x35, 0x03, 0x19, 0x00, 0x08, 0x09, 0x00, \ 0x05, 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x09, \ 0x35, 0x08, 0x35, 0x06, 0x19, 0x11, 0x34, 0x09, 0x01, \ 0x01, 0x09, 0x01, 0x00, 0x25, 0x0c, 0x4d, 0x41, 0x50, \ 0x20, 0x53, 0x4d, 0x53, 0x2f, 0x4d, 0x4d, 0x53, 0x00, \ 0x09, 0x03, 0x15, 0x08, 0x00, 0x09, 0x03, 0x16, 0x08, \ 0x0e, 0x36, 0x00, 0x54, 0x09, 0x00, 0x00, 0x0a, 0x00, \ 0x01, 0x00, 0x0a, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, \ 0x11, 0x32, 0x09, 0x00, 0x04, 0x35, 0x11, 0x35, 0x03, \ 0x19, 0x01, 0x00, 0x35, 0x05, 0x19, 0x00, 0x03, 0x08, \ 0x05, 0x35, 0x03, 0x19, 0x00, 0x08, 0x09, 0x00, 0x05, \ 0x35, 0x03, 0x19, 0x10, 0x02, 0x09, 0x00, 0x09, 0x35, \ 0x08, 0x35, 0x06, 0x19, 0x11, 0x34, 0x09, 0x01, 0x01, \ 0x09, 0x01, 0x00, 0x25, 0x0a, 0x4d, 0x41, 0x50, 0x20, \ 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x00, 0x09, 0x03, 0x15, \ 0x08, 0x01, 0x09, 0x03, 0x16, 0x08, 0x01, \ 0x00 static const struct pdu_set pdus[] = { { end_pdu, raw_pdu(sdp_rsp_pdu) }, { end_pdu, end_pdu }, }; static struct emu_l2cap_cid_data cid_data = { .pdu = pdus, }; static bt_bdaddr_t emu_remote_bdaddr_val = { .address = { 0x00, 0xaa, 0x01, 0x01, 0x00, 0x00 }, }; static struct emu_set_l2cap_data l2cap_sdp_setup_data = { .psm = 1, .func = tester_generic_connect_cb, .user_data = &cid_data, }; /* TODO define all parameters according to specification document */ static btmce_mas_instance_t remote_map_inst_sms_mms_email_val[] = { { INST0_ID, 4, 14, "MAP SMS/MMS" }, { INST1_ID, 5, 1, "MAP EMAIL" }, }; static void map_client_cid_hook_cb(const void *data, uint16_t len, void *user_data) { /* TODO extend if needed */ } static void map_client_conn_cb(uint16_t handle, void *user_data) { struct test_data *data = tester_get_data(); struct bthost *bthost = hciemu_client_get_host(data->hciemu); tester_print("New connection with handle 0x%04x", handle); if (data->hciemu_type == HCIEMU_TYPE_BREDR) { tester_warn("Not handled device type."); return; } cid_data.cid = 0x0040; cid_data.handle = handle; bthost_add_cid_hook(bthost, handle, cid_data.cid, map_client_cid_hook_cb, &cid_data); } static void map_client_get_instances_action(void) { struct test_data *data = tester_get_data(); struct step *current_data_step = queue_peek_head(data->steps); bt_bdaddr_t *bd_addr = current_data_step->set_data; struct step *step = g_new0(struct step, 1); step->action_status = data->if_map_client->get_remote_mas_instances(bd_addr); schedule_action_verification(step); } static struct test_case test_cases[] = { TEST_CASE_BREDRLE("MAP Client Init", ACTION_SUCCESS(dummy_action, NULL), ), TEST_CASE_BREDRLE("MAP Client - Get mas instances success", ACTION_SUCCESS(bluetooth_enable_action, NULL), CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_ON), ACTION_SUCCESS(emu_setup_powered_remote_action, NULL), ACTION_SUCCESS(emu_add_l2cap_server_action, &l2cap_sdp_setup_data), ACTION_SUCCESS(emu_set_connect_cb_action, map_client_conn_cb), ACTION_SUCCESS(map_client_get_instances_action, &emu_remote_bdaddr_val), CALLBACK_MAP_CLIENT_REMOTE_MAS_INSTANCE(BT_STATUS_SUCCESS, NULL, 2, remote_map_inst_sms_mms_email_val), ACTION_SUCCESS(bluetooth_disable_action, NULL), CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF), ), }; struct queue *get_map_client_tests(void) { uint16_t i = 0; list = queue_new(); for (; i < sizeof(test_cases) / sizeof(test_cases[0]); ++i) queue_push_tail(list, &test_cases[i]); return list; } void remove_map_client_tests(void) { queue_destroy(list, NULL); }