1eb50aa96ca050bb76636401f81965df12be7e21bJack He/****************************************************************************** 2eb50aa96ca050bb76636401f81965df12be7e21bJack He * 3eb50aa96ca050bb76636401f81965df12be7e21bJack He * Copyright (C) 2017 Google, Inc. 4eb50aa96ca050bb76636401f81965df12be7e21bJack He * 5eb50aa96ca050bb76636401f81965df12be7e21bJack He * Licensed under the Apache License, Version 2.0 (the "License"); 6eb50aa96ca050bb76636401f81965df12be7e21bJack He * you may not use this file except in compliance with the License. 7eb50aa96ca050bb76636401f81965df12be7e21bJack He * You may obtain a copy of the License at: 8eb50aa96ca050bb76636401f81965df12be7e21bJack He * 9eb50aa96ca050bb76636401f81965df12be7e21bJack He * http://www.apache.org/licenses/LICENSE-2.0 10eb50aa96ca050bb76636401f81965df12be7e21bJack He * 11eb50aa96ca050bb76636401f81965df12be7e21bJack He * Unless required by applicable law or agreed to in writing, software 12eb50aa96ca050bb76636401f81965df12be7e21bJack He * distributed under the License is distributed on an "AS IS" BASIS, 13eb50aa96ca050bb76636401f81965df12be7e21bJack He * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14eb50aa96ca050bb76636401f81965df12be7e21bJack He * See the License for the specific language governing permissions and 15eb50aa96ca050bb76636401f81965df12be7e21bJack He * limitations under the License. 16eb50aa96ca050bb76636401f81965df12be7e21bJack He * 17eb50aa96ca050bb76636401f81965df12be7e21bJack He ******************************************************************************/ 18eb50aa96ca050bb76636401f81965df12be7e21bJack He#include <gtest/gtest.h> 19eb50aa96ca050bb76636401f81965df12be7e21bJack He 20eb50aa96ca050bb76636401f81965df12be7e21bJack He#include "btif/include/btif_profile_queue.h" 21eb50aa96ca050bb76636401f81965df12be7e21bJack He#include "stack_manager.h" 22eb50aa96ca050bb76636401f81965df12be7e21bJack He#include "types/raw_address.h" 23eb50aa96ca050bb76636401f81965df12be7e21bJack He 24eb50aa96ca050bb76636401f81965df12be7e21bJack Hestatic bool sStackRunning; 25eb50aa96ca050bb76636401f81965df12be7e21bJack He 26eb50aa96ca050bb76636401f81965df12be7e21bJack Hebool get_stack_is_running(void) { return sStackRunning; } 27eb50aa96ca050bb76636401f81965df12be7e21bJack He 28eb50aa96ca050bb76636401f81965df12be7e21bJack Hestatic stack_manager_t sStackManager = {nullptr, nullptr, nullptr, nullptr, 29eb50aa96ca050bb76636401f81965df12be7e21bJack He get_stack_is_running}; 30eb50aa96ca050bb76636401f81965df12be7e21bJack He 31eb50aa96ca050bb76636401f81965df12be7e21bJack Heconst stack_manager_t* stack_manager_get_interface() { return &sStackManager; } 32eb50aa96ca050bb76636401f81965df12be7e21bJack He 33eb50aa96ca050bb76636401f81965df12be7e21bJack Hetypedef void(tBTIF_CBACK)(uint16_t event, char* p_param); 34eb50aa96ca050bb76636401f81965df12be7e21bJack Hetypedef void(tBTIF_COPY_CBACK)(uint16_t event, char* p_dest, char* p_src); 35eb50aa96ca050bb76636401f81965df12be7e21bJack Hebt_status_t btif_transfer_context(tBTIF_CBACK* p_cback, uint16_t event, 36eb50aa96ca050bb76636401f81965df12be7e21bJack He char* p_params, int param_len, 37eb50aa96ca050bb76636401f81965df12be7e21bJack He tBTIF_COPY_CBACK* p_copy_cback) { 38eb50aa96ca050bb76636401f81965df12be7e21bJack He p_cback(event, p_params); 39eb50aa96ca050bb76636401f81965df12be7e21bJack He return BT_STATUS_SUCCESS; 40eb50aa96ca050bb76636401f81965df12be7e21bJack He} 41eb50aa96ca050bb76636401f81965df12be7e21bJack He 42eb50aa96ca050bb76636401f81965df12be7e21bJack Heenum ResultType { 43eb50aa96ca050bb76636401f81965df12be7e21bJack He NOT_SET = 0, 44eb50aa96ca050bb76636401f81965df12be7e21bJack He UNKNOWN, 45eb50aa96ca050bb76636401f81965df12be7e21bJack He UUID1_ADDR1, 46eb50aa96ca050bb76636401f81965df12be7e21bJack He UUID1_ADDR2, 47eb50aa96ca050bb76636401f81965df12be7e21bJack He UUID2_ADDR1, 48eb50aa96ca050bb76636401f81965df12be7e21bJack He UUID2_ADDR2 49eb50aa96ca050bb76636401f81965df12be7e21bJack He}; 50eb50aa96ca050bb76636401f81965df12be7e21bJack He 51eb50aa96ca050bb76636401f81965df12be7e21bJack Hestatic ResultType sResult; 52eb50aa96ca050bb76636401f81965df12be7e21bJack He 53eb50aa96ca050bb76636401f81965df12be7e21bJack Heclass BtifProfileQueueTest : public ::testing::Test { 54eb50aa96ca050bb76636401f81965df12be7e21bJack He public: 55eb50aa96ca050bb76636401f81965df12be7e21bJack He static const uint16_t kTestUuid1 = 0x9527; 56eb50aa96ca050bb76636401f81965df12be7e21bJack He static const uint16_t kTestUuid2 = 0x819F; 57eb50aa96ca050bb76636401f81965df12be7e21bJack He static const RawAddress kTestAddr1; 58eb50aa96ca050bb76636401f81965df12be7e21bJack He static const RawAddress kTestAddr2; 59eb50aa96ca050bb76636401f81965df12be7e21bJack He 60eb50aa96ca050bb76636401f81965df12be7e21bJack He protected: 61eb50aa96ca050bb76636401f81965df12be7e21bJack He void SetUp() override { 62eb50aa96ca050bb76636401f81965df12be7e21bJack He sStackRunning = true; 63eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 64eb50aa96ca050bb76636401f81965df12be7e21bJack He }; 65eb50aa96ca050bb76636401f81965df12be7e21bJack He void TearDown() override { btif_queue_release(); }; 66eb50aa96ca050bb76636401f81965df12be7e21bJack He}; 67eb50aa96ca050bb76636401f81965df12be7e21bJack He 68eb50aa96ca050bb76636401f81965df12be7e21bJack Heconst RawAddress BtifProfileQueueTest::kTestAddr1{ 69eb50aa96ca050bb76636401f81965df12be7e21bJack He {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}}; 70eb50aa96ca050bb76636401f81965df12be7e21bJack Heconst RawAddress BtifProfileQueueTest::kTestAddr2{ 71eb50aa96ca050bb76636401f81965df12be7e21bJack He {0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56}}; 72eb50aa96ca050bb76636401f81965df12be7e21bJack He 73eb50aa96ca050bb76636401f81965df12be7e21bJack Hestatic bt_status_t test_connect_cb(RawAddress* bda, uint16_t uuid) { 74eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = UNKNOWN; 75eb50aa96ca050bb76636401f81965df12be7e21bJack He if (*bda == BtifProfileQueueTest::kTestAddr1) { 76eb50aa96ca050bb76636401f81965df12be7e21bJack He if (uuid == BtifProfileQueueTest::kTestUuid1) { 77eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = UUID1_ADDR1; 78eb50aa96ca050bb76636401f81965df12be7e21bJack He } else if (uuid == BtifProfileQueueTest::kTestUuid2) { 79eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = UUID2_ADDR1; 80eb50aa96ca050bb76636401f81965df12be7e21bJack He } 81eb50aa96ca050bb76636401f81965df12be7e21bJack He } else if (*bda == BtifProfileQueueTest::kTestAddr2) { 82eb50aa96ca050bb76636401f81965df12be7e21bJack He if (uuid == BtifProfileQueueTest::kTestUuid1) { 83eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = UUID1_ADDR2; 84eb50aa96ca050bb76636401f81965df12be7e21bJack He } else if (uuid == BtifProfileQueueTest::kTestUuid2) { 85eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = UUID2_ADDR2; 86eb50aa96ca050bb76636401f81965df12be7e21bJack He } 87eb50aa96ca050bb76636401f81965df12be7e21bJack He } 88eb50aa96ca050bb76636401f81965df12be7e21bJack He return BT_STATUS_SUCCESS; 89eb50aa96ca050bb76636401f81965df12be7e21bJack He} 90eb50aa96ca050bb76636401f81965df12be7e21bJack He 91eb50aa96ca050bb76636401f81965df12be7e21bJack HeTEST_F(BtifProfileQueueTest, test_connect) { 92eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 93eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid1, &kTestAddr1, test_connect_cb); 94eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, UUID1_ADDR1); 95eb50aa96ca050bb76636401f81965df12be7e21bJack He} 96eb50aa96ca050bb76636401f81965df12be7e21bJack He 97eb50aa96ca050bb76636401f81965df12be7e21bJack HeTEST_F(BtifProfileQueueTest, test_connect_same_uuid_do_not_repeat) { 98eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 99eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid1, &kTestAddr1, test_connect_cb); 100eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, UUID1_ADDR1); 101eb50aa96ca050bb76636401f81965df12be7e21bJack He // Second connection request on the same UUID do not repeat 102eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 103eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid1, &kTestAddr1, test_connect_cb); 104eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, NOT_SET); 105eb50aa96ca050bb76636401f81965df12be7e21bJack He // Not even after we advance the queue 106eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 107eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_advance(); 108eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect_next(); 109eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, NOT_SET); 110eb50aa96ca050bb76636401f81965df12be7e21bJack He} 111eb50aa96ca050bb76636401f81965df12be7e21bJack He 112eb50aa96ca050bb76636401f81965df12be7e21bJack HeTEST_F(BtifProfileQueueTest, test_multiple_connects) { 113eb50aa96ca050bb76636401f81965df12be7e21bJack He // First item is executed 114eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 115eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid1, &kTestAddr1, test_connect_cb); 116eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, UUID1_ADDR1); 117eb50aa96ca050bb76636401f81965df12be7e21bJack He // Second item with advance is executed 118eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 119eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_advance(); 120eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid2, &kTestAddr1, test_connect_cb); 121eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, UUID2_ADDR1); 122eb50aa96ca050bb76636401f81965df12be7e21bJack He} 123eb50aa96ca050bb76636401f81965df12be7e21bJack He 124eb50aa96ca050bb76636401f81965df12be7e21bJack HeTEST_F(BtifProfileQueueTest, test_multiple_connects_without_advance) { 125eb50aa96ca050bb76636401f81965df12be7e21bJack He // First item is executed 126eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 127eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid1, &kTestAddr1, test_connect_cb); 128eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, UUID1_ADDR1); 129eb50aa96ca050bb76636401f81965df12be7e21bJack He // Second item without advance is not executed 130eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 131eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid2, &kTestAddr1, test_connect_cb); 132eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, NOT_SET); 133eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 134eb50aa96ca050bb76636401f81965df12be7e21bJack He // Connect next doesn't work 135eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect_next(); 136eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, NOT_SET); 137eb50aa96ca050bb76636401f81965df12be7e21bJack He // Advance moves queue to execute next item 138eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 139eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_advance(); 140eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, UUID2_ADDR1); 141eb50aa96ca050bb76636401f81965df12be7e21bJack He} 142eb50aa96ca050bb76636401f81965df12be7e21bJack He 143eb50aa96ca050bb76636401f81965df12be7e21bJack HeTEST_F(BtifProfileQueueTest, test_cleanup_first_allow_second) { 144eb50aa96ca050bb76636401f81965df12be7e21bJack He // First item is executed 145eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 146eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid1, &kTestAddr1, test_connect_cb); 147eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, UUID1_ADDR1); 148eb50aa96ca050bb76636401f81965df12be7e21bJack He // Second item without advance is not executed 149eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 150eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid2, &kTestAddr1, test_connect_cb); 151eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, NOT_SET); 152eb50aa96ca050bb76636401f81965df12be7e21bJack He // Connect next doesn't work 153eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 154eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect_next(); 155eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, NOT_SET); 156eb50aa96ca050bb76636401f81965df12be7e21bJack He // Cleanup UUID1 allows the next profile connection to be executed 157eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 158eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_cleanup(kTestUuid1); 159eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect_next(); 160eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, UUID2_ADDR1); 161eb50aa96ca050bb76636401f81965df12be7e21bJack He} 162eb50aa96ca050bb76636401f81965df12be7e21bJack He 163eb50aa96ca050bb76636401f81965df12be7e21bJack HeTEST_F(BtifProfileQueueTest, test_cleanup_both) { 164eb50aa96ca050bb76636401f81965df12be7e21bJack He // First item is executed 165eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 166eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid1, &kTestAddr1, test_connect_cb); 167eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, UUID1_ADDR1); 168eb50aa96ca050bb76636401f81965df12be7e21bJack He // Second item without advance is not executed 169eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 170eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid2, &kTestAddr1, test_connect_cb); 171eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, NOT_SET); 172eb50aa96ca050bb76636401f81965df12be7e21bJack He // Connect next doesn't work 173eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 174eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect_next(); 175eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, NOT_SET); 176eb50aa96ca050bb76636401f81965df12be7e21bJack He // Cleanup both leaves nothing to execute 177eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 178eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_cleanup(kTestUuid1); 179eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_cleanup(kTestUuid2); 180eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect_next(); 181eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, NOT_SET); 182eb50aa96ca050bb76636401f81965df12be7e21bJack He} 183eb50aa96ca050bb76636401f81965df12be7e21bJack He 184eb50aa96ca050bb76636401f81965df12be7e21bJack HeTEST_F(BtifProfileQueueTest, test_cleanup_both_reverse_order) { 185eb50aa96ca050bb76636401f81965df12be7e21bJack He // First item is executed 186eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 187eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid1, &kTestAddr1, test_connect_cb); 188eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, UUID1_ADDR1); 189eb50aa96ca050bb76636401f81965df12be7e21bJack He // Second item without advance is not executed 190eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 191eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect(kTestUuid2, &kTestAddr1, test_connect_cb); 192eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, NOT_SET); 193eb50aa96ca050bb76636401f81965df12be7e21bJack He // Connect next doesn't work 194eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 195eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect_next(); 196eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, NOT_SET); 197eb50aa96ca050bb76636401f81965df12be7e21bJack He // Cleanup both in reverse order leaves nothing to execute 198eb50aa96ca050bb76636401f81965df12be7e21bJack He sResult = NOT_SET; 199eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_cleanup(kTestUuid2); 200eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_cleanup(kTestUuid1); 201eb50aa96ca050bb76636401f81965df12be7e21bJack He btif_queue_connect_next(); 202eb50aa96ca050bb76636401f81965df12be7e21bJack He EXPECT_EQ(sResult, NOT_SET); 203eb50aa96ca050bb76636401f81965df12be7e21bJack He} 204