1 /*
2  * Copyright 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <base/strings/stringprintf.h>
18 #include <gtest/gtest.h>
19 #include <stdlib.h>
20 
21 #include "hci_error_code.h"
22 #include "stack/btm/btm_int_types.h"
23 #include "stack/include/inq_hci_link_interface.h"
24 #include "stack/test/btm/btm_test_fixtures.h"
25 #include "test/fake/fake_looper.h"
26 #include "test/mock/mock_osi_allocator.h"
27 #include "test/mock/mock_osi_thread.h"
28 #include "types/raw_address.h"
29 
30 extern tBTM_CB btm_cb;
31 
32 namespace {
33 const RawAddress kRawAddress = RawAddress({0x11, 0x22, 0x33, 0x44, 0x55, 0x66});
34 const RawAddress kRawAddress2 =
35     RawAddress({0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc});
36 const BD_NAME kBdName = {'A', ' ', 'B', 'd', ' ', 'N', 'a', 'm', 'e', '\0'};
37 const BD_NAME kEmptyName = "";
38 
39 tBTM_REMOTE_DEV_NAME gBTM_REMOTE_DEV_NAME{};
40 bool gBTM_REMOTE_DEV_NAME_sent{false};
41 
42 }  // namespace
43 
44 class BtmInqTest : public BtmWithMocksTest {
45  protected:
SetUp()46   void SetUp() override {
47     BtmWithMocksTest::SetUp();
48     btm_cb = {};
49   }
50 
TearDown()51   void TearDown() override { BtmWithMocksTest::TearDown(); }
52 };
53 
54 class BtmInqActiveTest : public BtmInqTest {
55  protected:
SetUp()56   void SetUp() override {
57     BtmInqTest::SetUp();
58     gBTM_REMOTE_DEV_NAME = {};
59     gBTM_REMOTE_DEV_NAME_sent = false;
60 
61     btm_cb.btm_inq_vars.remname_active = true;
62     btm_cb.btm_inq_vars.remname_bda = kRawAddress;
63     btm_cb.btm_inq_vars.remname_dev_type = BT_DEVICE_TYPE_BREDR;
64     btm_cb.btm_inq_vars.p_remname_cmpl_cb =
65         [](const tBTM_REMOTE_DEV_NAME* name) {
66           gBTM_REMOTE_DEV_NAME = *name;
67           gBTM_REMOTE_DEV_NAME_sent = true;
68         };
69   }
70 
TearDown()71   void TearDown() override { BtmInqTest::TearDown(); }
72 };
73 
TEST_F(BtmInqActiveTest,btm_process_remote_name__typical)74 TEST_F(BtmInqActiveTest, btm_process_remote_name__typical) {
75   btm_process_remote_name(&kRawAddress, kBdName, 0, HCI_SUCCESS);
76   ASSERT_FALSE(btm_cb.btm_inq_vars.p_remname_cmpl_cb);
77   ASSERT_FALSE(btm_cb.btm_inq_vars.remname_active);
78   ASSERT_EQ(btm_cb.btm_inq_vars.remname_bda, RawAddress::kEmpty);
79   ASSERT_EQ(btm_cb.btm_inq_vars.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
80   ASSERT_EQ(1, get_func_call_count("alarm_cancel"));
81 
82   ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
83   ASSERT_EQ(BTM_SUCCESS, gBTM_REMOTE_DEV_NAME.status);
84   ASSERT_EQ(HCI_SUCCESS, gBTM_REMOTE_DEV_NAME.hci_status);
85   ASSERT_EQ(kRawAddress, gBTM_REMOTE_DEV_NAME.bd_addr);
86   ASSERT_STREQ((char*)kBdName, (char*)gBTM_REMOTE_DEV_NAME.remote_bd_name);
87 }
88 
TEST_F(BtmInqActiveTest,btm_process_remote_name__no_name)89 TEST_F(BtmInqActiveTest, btm_process_remote_name__no_name) {
90   btm_process_remote_name(&kRawAddress, nullptr, 0, HCI_SUCCESS);
91   ASSERT_FALSE(btm_cb.btm_inq_vars.p_remname_cmpl_cb);
92   ASSERT_FALSE(btm_cb.btm_inq_vars.remname_active);
93   ASSERT_EQ(btm_cb.btm_inq_vars.remname_bda, RawAddress::kEmpty);
94   ASSERT_EQ(btm_cb.btm_inq_vars.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
95   ASSERT_EQ(1, get_func_call_count("alarm_cancel"));
96 
97   ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
98   ASSERT_EQ(BTM_SUCCESS, gBTM_REMOTE_DEV_NAME.status);
99   ASSERT_EQ(HCI_SUCCESS, gBTM_REMOTE_DEV_NAME.hci_status);
100   ASSERT_EQ(kRawAddress, gBTM_REMOTE_DEV_NAME.bd_addr);
101   ASSERT_STREQ((char*)kEmptyName, (char*)gBTM_REMOTE_DEV_NAME.remote_bd_name);
102 }
103 
TEST_F(BtmInqActiveTest,btm_process_remote_name__bad_status)104 TEST_F(BtmInqActiveTest, btm_process_remote_name__bad_status) {
105   btm_process_remote_name(&kRawAddress, kBdName, 0, HCI_ERR_PAGE_TIMEOUT);
106   ASSERT_FALSE(btm_cb.btm_inq_vars.p_remname_cmpl_cb);
107   ASSERT_FALSE(btm_cb.btm_inq_vars.remname_active);
108   ASSERT_EQ(btm_cb.btm_inq_vars.remname_bda, RawAddress::kEmpty);
109   ASSERT_EQ(btm_cb.btm_inq_vars.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
110   ASSERT_EQ(1, get_func_call_count("alarm_cancel"));
111 
112   ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
113   ASSERT_EQ(BTM_BAD_VALUE_RET, gBTM_REMOTE_DEV_NAME.status);
114   ASSERT_EQ(HCI_ERR_PAGE_TIMEOUT, gBTM_REMOTE_DEV_NAME.hci_status);
115   ASSERT_EQ(kRawAddress, gBTM_REMOTE_DEV_NAME.bd_addr);
116   ASSERT_STREQ((char*)kEmptyName, (char*)gBTM_REMOTE_DEV_NAME.remote_bd_name);
117 }
118 
TEST_F(BtmInqActiveTest,btm_process_remote_name__no_address)119 TEST_F(BtmInqActiveTest, btm_process_remote_name__no_address) {
120   btm_process_remote_name(nullptr, kBdName, 0, HCI_SUCCESS);
121   ASSERT_FALSE(btm_cb.btm_inq_vars.p_remname_cmpl_cb);
122   ASSERT_FALSE(btm_cb.btm_inq_vars.remname_active);
123   ASSERT_EQ(btm_cb.btm_inq_vars.remname_bda, RawAddress::kEmpty);
124   ASSERT_EQ(btm_cb.btm_inq_vars.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
125   ASSERT_EQ(1, get_func_call_count("alarm_cancel"));
126 
127   ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
128   ASSERT_EQ(BTM_SUCCESS, gBTM_REMOTE_DEV_NAME.status);
129   ASSERT_EQ(HCI_SUCCESS, gBTM_REMOTE_DEV_NAME.hci_status);
130   ASSERT_EQ(RawAddress::kEmpty, gBTM_REMOTE_DEV_NAME.bd_addr);
131   ASSERT_STREQ((char*)kBdName, (char*)gBTM_REMOTE_DEV_NAME.remote_bd_name);
132 }
133 
TEST_F(BtmInqActiveTest,btm_process_remote_name__different_address)134 TEST_F(BtmInqActiveTest, btm_process_remote_name__different_address) {
135   btm_cb.btm_inq_vars.remname_bda = kRawAddress2;
136   btm_process_remote_name(&kRawAddress, kBdName, 0, HCI_SUCCESS);
137   ASSERT_TRUE(btm_cb.btm_inq_vars.p_remname_cmpl_cb);
138   ASSERT_TRUE(btm_cb.btm_inq_vars.remname_active);
139   ASSERT_NE(btm_cb.btm_inq_vars.remname_bda, RawAddress::kEmpty);
140   ASSERT_NE(btm_cb.btm_inq_vars.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
141   ASSERT_EQ(0, get_func_call_count("alarm_cancel"));
142 
143   ASSERT_FALSE(gBTM_REMOTE_DEV_NAME_sent);
144 }
145