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