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