1fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker/******************************************************************************
2fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *
3fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *  Copyright (C) 2016 Google, Inc.
4fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *
5fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *  Licensed under the Apache License, Version 2.0 (the "License");
6fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *  you may not use this file except in compliance with the License.
7fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *  You may obtain a copy of the License at:
8fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *
9fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *  http://www.apache.org/licenses/LICENSE-2.0
10fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *
11fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *  Unless required by applicable law or agreed to in writing, software
12fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *  distributed under the License is distributed on an "AS IS" BASIS,
13fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *  See the License for the specific language governing permissions and
15fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *  limitations under the License.
16fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker *
17fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker ******************************************************************************/
18fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
19fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker#include "rfcomm/rfcomm_test.h"
20911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "adapter/bluetooth_test.h"
21fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
22fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker#include "btcore/include/bdaddr.h"
23fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker#include "btcore/include/uuid.h"
24fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
25fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panickernamespace bttest {
26fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
27911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonconst bt_uuid_t RFCommTest::HFP_UUID = {{0x00, 0x00, 0x11, 0x1E, 0x00, 0x00,
28911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                         0x10, 0x00, 0x80, 0x00, 0x00, 0x80,
29911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                         0x5F, 0x9B, 0x34, 0xFB}};
30fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
31911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid RFCommTest::SetUp() {
32fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  BluetoothTest::SetUp();
33fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
34fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  ASSERT_EQ(bt_interface()->enable(false), BT_STATUS_SUCCESS);
35fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  semaphore_wait(adapter_state_changed_callback_sem_);
36fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  ASSERT_TRUE(GetState() == BT_STATE_ON);
37911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  socket_interface_ =
38911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (const btsock_interface_t*)bt_interface()->get_profile_interface(
39911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          BT_PROFILE_SOCKETS_ID);
40fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  ASSERT_NE(socket_interface_, nullptr);
41fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
42fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  // Find a bonded device that supports HFP
43fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  string_to_bdaddr("00:00:00:00:00:00", &bt_remote_bdaddr_);
44fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  char value[1280];
45fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
46911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bt_property_t* bonded_devices_prop =
47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      GetProperty(BT_PROPERTY_ADAPTER_BONDED_DEVICES);
48fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  bt_bdaddr_t* devices = (bt_bdaddr_t*)bonded_devices_prop->val;
49fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  int num_bonded_devices = bonded_devices_prop->len / sizeof(bt_bdaddr_t);
50fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
51911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  for (int i = 0; i < num_bonded_devices && bdaddr_is_empty(&bt_remote_bdaddr_);
52911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       i++) {
53fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker    ClearSemaphore(remote_device_properties_callback_sem_);
54fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker    bt_interface()->get_remote_device_property(&devices[i], BT_PROPERTY_UUIDS);
55fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker    semaphore_wait(remote_device_properties_callback_sem_);
56fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
57911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    bt_property_t* uuid_prop =
58911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        GetRemoteDeviceProperty(&devices[i], BT_PROPERTY_UUIDS);
59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (uuid_prop == nullptr) continue;
60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    bt_uuid_t* uuids = (bt_uuid_t*)uuid_prop->val;
61fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker    int num_uuids = uuid_prop->len / sizeof(bt_uuid_t);
62fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
63fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker    for (int j = 0; j < num_uuids; j++) {
64fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker      uuid_to_string(&uuids[j], (uuid_string_t*)value);
65fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker      if (!memcmp(uuids + j, &HFP_UUID, sizeof(bt_uuid_t))) {
66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        bdaddr_copy(&bt_remote_bdaddr_, devices + i);
67fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker        break;
68fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker      }
69fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker    }
70fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  }
71fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
72fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  ASSERT_FALSE(bdaddr_is_empty(&bt_remote_bdaddr_))
73fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker      << "Could not find paired device that supports HFP";
74fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker}
75fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
76fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panickervoid RFCommTest::TearDown() {
77fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  socket_interface_ = NULL;
78fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
79fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  ASSERT_EQ(bt_interface()->disable(), BT_STATUS_SUCCESS);
80fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  semaphore_wait(adapter_state_changed_callback_sem_);
81fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
82fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker  BluetoothTest::TearDown();
83fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker}
84fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker
85fa717c0b47bb1fed04da295eaa580a92bc08c622Ajay Panicker}  // bttest
86