android/tester: Add A2DP connect - Success test case

This commit is contained in:
Luiz Augusto von Dentz 2014-08-08 13:52:57 +03:00
parent ca1485e986
commit 78e54de856
3 changed files with 134 additions and 0 deletions

View File

@ -18,15 +18,129 @@
#include <stdbool.h>
#include "emulator/bthost.h"
#include "src/shared/util.h"
#include "tester-main.h"
#include "android/utils.h"
static struct queue *list;
struct emu_cid_data {
uint16_t handle;
uint16_t cid;
};
static struct emu_cid_data cid_data;
static const uint8_t req_dsc[] = { 0x00, 0x01 };
static const uint8_t rsp_dsc[] = { 0x02, 0x01, 0x04, 0x08 };
static const uint8_t req_get[] = { 0x10, 0x02, 0x04 };
static const uint8_t rsp_get[] = { 0x12, 0x02, 0x01, 0x00, 0x07, 0x06, 0x00,
0x00, 0xff, 0xff, 0x02, 0x40 };
static const uint8_t req_cfg[] = { 0x20, 0x03, 0x04, 0x04, 0x01, 0x00, 0x07,
0x06, 0x00, 0x00, 0x21, 0x15, 0x02,
0x40 };
static const uint8_t rsp_cfg[] = { 0x22, 0x03 };
static const uint8_t req_open[] = { 0x30, 0x06, 0x04 };
static const uint8_t rsp_open[] = { 0x32, 0x06 };
const struct pdu {
const uint8_t *req;
size_t req_len;
const uint8_t *rsp;
size_t rsp_len;
} pdus[] = {
{ req_dsc, sizeof(req_dsc), rsp_dsc, sizeof(rsp_dsc) },
{ req_get, sizeof(req_get), rsp_get, sizeof(rsp_get) },
{ req_cfg, sizeof(req_cfg), rsp_cfg, sizeof(rsp_cfg) },
{ req_open, sizeof(req_open), rsp_open, sizeof(rsp_open) },
{ },
};
static void print_data(const char *str, void *user_data)
{
tester_debug("a2dp: %s", str);
}
static void a2dp_cid_hook_cb(const void *data, uint16_t len, void *user_data)
{
struct emu_cid_data *cid_data = user_data;
struct test_data *t_data = tester_get_data();
struct bthost *bthost = hciemu_client_get_host(t_data->hciemu);
int i;
util_hexdump('>', data, len, print_data, NULL);
for (i = 0; pdus[i].req; i++) {
if (pdus[i].req_len != len)
continue;
if (memcmp(pdus[i].req, data, len))
continue;
util_hexdump('<', pdus[i].rsp, pdus[i].rsp_len, print_data,
NULL);
bthost_send_cid(bthost, cid_data->handle, cid_data->cid,
pdus[i].rsp, pdus[i].rsp_len);
}
}
static void a2dp_connect_request_cb(uint16_t handle, uint16_t cid,
void *user_data)
{
struct test_data *data = tester_get_data();
struct bthost *bthost = hciemu_client_get_host(data->hciemu);
if (cid_data.handle)
return;
cid_data.handle = handle;
cid_data.cid = cid;
bthost_add_cid_hook(bthost, handle, cid, a2dp_cid_hook_cb, &cid_data);
}
static struct emu_set_l2cap_data l2cap_setup_data = {
.psm = 25,
.func = a2dp_connect_request_cb,
.user_data = NULL,
};
static void a2dp_connect_action(void)
{
struct test_data *data = tester_get_data();
const uint8_t *addr = hciemu_get_client_bdaddr(data->hciemu);
struct step *step = g_new0(struct step, 1);
bt_bdaddr_t bdaddr;
bdaddr2android((const bdaddr_t *) addr, &bdaddr);
step->action_status = data->if_a2dp->connect(&bdaddr);
schedule_action_verification(step);
}
static struct test_case test_cases[] = {
TEST_CASE_BREDRLE("A2DP Init",
ACTION_SUCCESS(dummy_action, NULL),
),
TEST_CASE_BREDRLE("A2DP Connect - 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_set_ssp_mode_action, NULL),
ACTION_SUCCESS(emu_add_l2cap_server_action, &l2cap_setup_data),
ACTION_SUCCESS(a2dp_connect_action, NULL),
CALLBACK_AV_CONN_STATE(CB_A2DP_CONN_STATE,
BTAV_CONNECTION_STATE_CONNECTING),
CALLBACK_AV_CONN_STATE(CB_A2DP_CONN_STATE,
BTAV_CONNECTION_STATE_CONNECTED),
ACTION_SUCCESS(bluetooth_disable_action, NULL),
CALLBACK_AV_CONN_STATE(CB_A2DP_CONN_STATE,
BTAV_CONNECTION_STATE_DISCONNECTED),
CALLBACK_STATE(CB_BT_ADAPTER_STATE_CHANGED, BT_STATE_OFF),
),
};
struct queue *get_a2dp_tests(void)

View File

@ -1085,8 +1085,20 @@ static bthl_callbacks_t bthl_callbacks = {
.channel_state_cb = hdp_channel_state_cb,
};
static void a2dp_connection_state_cb(btav_connection_state_t state,
bt_bdaddr_t *bd_addr)
{
struct step *step = g_new0(struct step, 1);
step->callback = CB_A2DP_CONN_STATE;
step->callback_result.state = state;
schedule_callback_call(step);
}
static btav_callbacks_t bta2dp_callbacks = {
.size = sizeof(bta2dp_callbacks),
.connection_state_cb = a2dp_connection_state_cb,
};
static const btgatt_client_callbacks_t btgatt_client_callbacks = {

View File

@ -180,6 +180,11 @@
.callback_result.channel_state = cb_state, \
}
#define CALLBACK_AV_CONN_STATE(cb, cb_state) { \
.callback = cb, \
.callback_result.state = cb_state, \
}
#define CALLBACK_DEVICE_PROPS(props, prop_cnt) \
CALLBACK_PROPS(CB_BT_REMOTE_DEVICE_PROPERTIES, props, prop_cnt)
@ -243,6 +248,9 @@ typedef enum {
CB_HDP_APP_REG_STATE,
CB_HDP_CHANNEL_STATE,
/* A2DP cb */
CB_A2DP_CONN_STATE,
/* Gatt client */
CB_GATTC_REGISTER_CLIENT,
CB_GATTC_SCAN_RESULT,