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 <bluetooth/log.h>
18 #include <gmock/gmock.h>
19 #include <gtest/gtest.h>
20 
21 #include "hci/hci_layer_fake.h"
22 #include "stack/btm/btm_int_types.h"
23 #include "stack/include/hci_error_code.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 // TODO(b/369381361) Enfore -Wmissing-prototypes
31 #pragma GCC diagnostic ignored "-Wmissing-prototypes"
32 
33 extern tBTM_CB btm_cb;
34 
ble_evt_type_is_connectable(uint16_t)35 bool ble_evt_type_is_connectable(uint16_t /* evt_type */) { return true; }
36 
37 tBTM_CB btm_cb;
38 
39 namespace {
40 const RawAddress kRawAddress = RawAddress({0x11, 0x22, 0x33, 0x44, 0x55, 0x66});
41 const RawAddress kRawAddress2 = RawAddress({0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc});
42 const BD_NAME kBdName = {'A', ' ', 'B', 'd', ' ', 'N', 'a', 'm', 'e', '\0'};
43 const BD_NAME kEmptyName = "";
44 
45 tBTM_REMOTE_DEV_NAME gBTM_REMOTE_DEV_NAME{};
46 bool gBTM_REMOTE_DEV_NAME_sent{false};
47 
48 static constexpr uint8_t kNumCommandPackets = 1;
49 
50 }  // namespace
51 
52 class BtmRnrTest : public ::testing::Test {
53 protected:
SetUp()54   void SetUp() override {
55     reset_mock_function_count_map();
56     fake_osi_ = std::make_unique<test::fake::FakeOsi>();
57     btm_cb = {};
58   }
59 
TearDown()60   void TearDown() override { fake_osi_.reset(); }
61 
62   std::unique_ptr<test::fake::FakeOsi> fake_osi_;
63 };
64 
65 class BtmRnrActiveTest : public BtmRnrTest {
66 protected:
SetUp()67   void SetUp() override {
68     BtmRnrTest::SetUp();
69     gBTM_REMOTE_DEV_NAME = {};
70     gBTM_REMOTE_DEV_NAME_sent = false;
71 
72     btm_cb.rnr.remname_active = true;
73     btm_cb.rnr.remname_bda = kRawAddress;
74     btm_cb.rnr.remname_dev_type = BT_DEVICE_TYPE_BREDR;
75     btm_cb.rnr.p_remname_cmpl_cb = [](const tBTM_REMOTE_DEV_NAME* name) {
76       gBTM_REMOTE_DEV_NAME = *name;
77       gBTM_REMOTE_DEV_NAME_sent = true;
78     };
79   }
80 
TearDown()81   void TearDown() override { BtmRnrTest::TearDown(); }
82 };
83 
TEST_F(BtmRnrActiveTest,btm_process_remote_name__typical)84 TEST_F(BtmRnrActiveTest, btm_process_remote_name__typical) {
85   btm_process_remote_name(&kRawAddress, kBdName, 0, HCI_SUCCESS);
86   ASSERT_FALSE(btm_cb.rnr.p_remname_cmpl_cb);
87   ASSERT_FALSE(btm_cb.rnr.remname_active);
88   ASSERT_EQ(btm_cb.rnr.remname_bda, RawAddress::kEmpty);
89   ASSERT_EQ(btm_cb.rnr.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
90   ASSERT_EQ(1, get_func_call_count("alarm_cancel"));
91 
92   ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
93   ASSERT_EQ(tBTM_STATUS::BTM_SUCCESS, gBTM_REMOTE_DEV_NAME.btm_status);
94   ASSERT_EQ(HCI_SUCCESS, gBTM_REMOTE_DEV_NAME.hci_status);
95   ASSERT_EQ(kRawAddress, gBTM_REMOTE_DEV_NAME.bd_addr);
96   ASSERT_STREQ((char*)kBdName, (char*)gBTM_REMOTE_DEV_NAME.remote_bd_name);
97 }
98 
TEST_F(BtmRnrActiveTest,btm_process_remote_name__no_name)99 TEST_F(BtmRnrActiveTest, btm_process_remote_name__no_name) {
100   btm_process_remote_name(&kRawAddress, nullptr, 0, HCI_SUCCESS);
101   ASSERT_FALSE(btm_cb.rnr.p_remname_cmpl_cb);
102   ASSERT_FALSE(btm_cb.rnr.remname_active);
103   ASSERT_EQ(btm_cb.rnr.remname_bda, RawAddress::kEmpty);
104   ASSERT_EQ(btm_cb.rnr.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
105   ASSERT_EQ(1, get_func_call_count("alarm_cancel"));
106 
107   ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
108   ASSERT_EQ(tBTM_STATUS::BTM_SUCCESS, gBTM_REMOTE_DEV_NAME.btm_status);
109   ASSERT_EQ(HCI_SUCCESS, gBTM_REMOTE_DEV_NAME.hci_status);
110   ASSERT_EQ(kRawAddress, gBTM_REMOTE_DEV_NAME.bd_addr);
111   ASSERT_STREQ((char*)kEmptyName, (char*)gBTM_REMOTE_DEV_NAME.remote_bd_name);
112 }
113 
TEST_F(BtmRnrActiveTest,btm_process_remote_name__bad_status)114 TEST_F(BtmRnrActiveTest, btm_process_remote_name__bad_status) {
115   btm_process_remote_name(&kRawAddress, kBdName, 0, HCI_ERR_PAGE_TIMEOUT);
116   ASSERT_FALSE(btm_cb.rnr.p_remname_cmpl_cb);
117   ASSERT_FALSE(btm_cb.rnr.remname_active);
118   ASSERT_EQ(btm_cb.rnr.remname_bda, RawAddress::kEmpty);
119   ASSERT_EQ(btm_cb.rnr.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
120   ASSERT_EQ(1, get_func_call_count("alarm_cancel"));
121 
122   ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
123   ASSERT_EQ(tBTM_STATUS::BTM_BAD_VALUE_RET, gBTM_REMOTE_DEV_NAME.btm_status);
124   ASSERT_EQ(HCI_ERR_PAGE_TIMEOUT, gBTM_REMOTE_DEV_NAME.hci_status);
125   ASSERT_EQ(kRawAddress, gBTM_REMOTE_DEV_NAME.bd_addr);
126   ASSERT_STREQ((char*)kEmptyName, (char*)gBTM_REMOTE_DEV_NAME.remote_bd_name);
127 }
128 
TEST_F(BtmRnrActiveTest,btm_process_remote_name__no_address)129 TEST_F(BtmRnrActiveTest, btm_process_remote_name__no_address) {
130   btm_process_remote_name(nullptr, kBdName, 0, HCI_SUCCESS);
131   ASSERT_FALSE(btm_cb.rnr.p_remname_cmpl_cb);
132   ASSERT_FALSE(btm_cb.rnr.remname_active);
133   ASSERT_EQ(btm_cb.rnr.remname_bda, RawAddress::kEmpty);
134   ASSERT_EQ(btm_cb.rnr.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
135   ASSERT_EQ(1, get_func_call_count("alarm_cancel"));
136 
137   ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
138   ASSERT_EQ(tBTM_STATUS::BTM_SUCCESS, gBTM_REMOTE_DEV_NAME.btm_status);
139   ASSERT_EQ(HCI_SUCCESS, gBTM_REMOTE_DEV_NAME.hci_status);
140   ASSERT_EQ(RawAddress::kEmpty, gBTM_REMOTE_DEV_NAME.bd_addr);
141   ASSERT_STREQ((char*)kBdName, (char*)gBTM_REMOTE_DEV_NAME.remote_bd_name);
142 }
143 
TEST_F(BtmRnrActiveTest,btm_process_remote_name__different_address)144 TEST_F(BtmRnrActiveTest, btm_process_remote_name__different_address) {
145   btm_cb.rnr.remname_bda = kRawAddress2;
146   btm_process_remote_name(&kRawAddress, kBdName, 0, HCI_SUCCESS);
147   ASSERT_TRUE(btm_cb.rnr.p_remname_cmpl_cb);
148   ASSERT_TRUE(btm_cb.rnr.remname_active);
149   ASSERT_NE(btm_cb.rnr.remname_bda, RawAddress::kEmpty);
150   ASSERT_NE(btm_cb.rnr.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
151   ASSERT_EQ(0, get_func_call_count("alarm_cancel"));
152 
153   ASSERT_FALSE(gBTM_REMOTE_DEV_NAME_sent);
154 }
155