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