1 /******************************************************************************
2 *
3 * Copyright 2019 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18 #include "device_database.h"
19 #include "classic_device.h"
20
21 #include <gtest/gtest.h>
22
23 using namespace bluetooth::hci;
24
25 namespace bluetooth::hci {
26 namespace {
27
28 Address address({0x01, 0x02, 0x03, 0x04, 0x05, 0x06});
29 std::string address_str = "06:05:04:03:02:01";
30 class DeviceDatabaseTest : public ::testing::Test {
31 protected:
32 DeviceDatabaseTest() = default;
33
SetUp()34 void SetUp() override {}
35
TearDown()36 void TearDown() override {}
37
38 DeviceDatabase device_database_;
39 };
40
TEST_F(DeviceDatabaseTest,create_classic_device)41 TEST_F(DeviceDatabaseTest, create_classic_device) {
42 auto classic_device = device_database_.CreateClassicDevice(address);
43 ASSERT_TRUE(classic_device);
44 ASSERT_EQ(CLASSIC, classic_device->GetDeviceType());
45 ASSERT_EQ(address_str, classic_device->GetUuid());
46 }
47
TEST_F(DeviceDatabaseTest,create_le_device)48 TEST_F(DeviceDatabaseTest, create_le_device) {
49 auto le_device = device_database_.CreateLeDevice(address);
50 ASSERT_TRUE(le_device);
51 ASSERT_EQ(LE, le_device->GetDeviceType());
52 ASSERT_EQ(address_str, le_device->GetUuid());
53 }
54
TEST_F(DeviceDatabaseTest,create_dual_device)55 TEST_F(DeviceDatabaseTest, create_dual_device) {
56 auto dual_device = device_database_.CreateDualDevice(address);
57 ASSERT_TRUE(dual_device);
58 ASSERT_EQ(DUAL, dual_device->GetDeviceType());
59 ASSERT_EQ(DUAL, dual_device->GetClassicDevice()->GetDeviceType());
60 ASSERT_EQ(DUAL, dual_device->GetLeDevice()->GetDeviceType());
61 ASSERT_EQ(address_str, dual_device->GetUuid());
62 }
63
64 // Shouldn't fail when creating twice. Should just get back a s_ptr the same device
TEST_F(DeviceDatabaseTest,create_classic_device_twice)65 TEST_F(DeviceDatabaseTest, create_classic_device_twice) {
66 auto classic_device = device_database_.CreateClassicDevice(address);
67 ASSERT_TRUE(classic_device);
68 ASSERT_EQ(CLASSIC, classic_device->GetDeviceType());
69 ASSERT_EQ(address_str, classic_device->GetUuid());
70 ASSERT_TRUE(device_database_.CreateClassicDevice(address));
71 }
72
TEST_F(DeviceDatabaseTest,create_le_device_twice)73 TEST_F(DeviceDatabaseTest, create_le_device_twice) {
74 auto le_device = device_database_.CreateLeDevice(address);
75 ASSERT_TRUE(le_device);
76 ASSERT_EQ(LE, le_device->GetDeviceType());
77 ASSERT_EQ(address_str, le_device->GetUuid());
78 ASSERT_TRUE(device_database_.CreateLeDevice(address));
79 }
80
TEST_F(DeviceDatabaseTest,create_dual_device_twice)81 TEST_F(DeviceDatabaseTest, create_dual_device_twice) {
82 auto dual_device = device_database_.CreateDualDevice(address);
83 ASSERT_TRUE(dual_device);
84
85 // Dual
86 ASSERT_EQ(DUAL, dual_device->GetDeviceType());
87 ASSERT_EQ(address_str, dual_device->GetUuid());
88
89 // Classic
90 ASSERT_EQ(DUAL, dual_device->GetClassicDevice()->GetDeviceType());
91 ASSERT_EQ(address_str, dual_device->GetClassicDevice()->GetUuid());
92
93 // LE
94 ASSERT_EQ(DUAL, dual_device->GetLeDevice()->GetDeviceType());
95 ASSERT_EQ(address_str, dual_device->GetLeDevice()->GetUuid());
96
97 ASSERT_TRUE(device_database_.CreateDualDevice(address));
98 }
99
TEST_F(DeviceDatabaseTest,remove_device)100 TEST_F(DeviceDatabaseTest, remove_device) {
101 std::shared_ptr<Device> created_device = device_database_.CreateClassicDevice(address);
102 ASSERT_TRUE(created_device);
103 ASSERT_TRUE(device_database_.RemoveDevice(created_device));
104 ASSERT_TRUE(device_database_.CreateClassicDevice(address));
105 }
106
TEST_F(DeviceDatabaseTest,remove_device_twice)107 TEST_F(DeviceDatabaseTest, remove_device_twice) {
108 std::shared_ptr<Device> created_device = device_database_.CreateClassicDevice(address);
109 ASSERT_TRUE(device_database_.RemoveDevice(created_device));
110 ASSERT_FALSE(device_database_.RemoveDevice(created_device));
111 }
112
TEST_F(DeviceDatabaseTest,get_nonexistent_device)113 TEST_F(DeviceDatabaseTest, get_nonexistent_device) {
114 std::shared_ptr<Device> device_ptr = device_database_.GetClassicDevice(address_str);
115 ASSERT_FALSE(device_ptr);
116 }
117
TEST_F(DeviceDatabaseTest,address_modification_check)118 TEST_F(DeviceDatabaseTest, address_modification_check) {
119 std::shared_ptr<Device> created_device = device_database_.CreateClassicDevice(address);
120 std::shared_ptr<Device> gotten_device = device_database_.GetClassicDevice(address.ToString());
121 ASSERT_TRUE(created_device);
122 ASSERT_TRUE(gotten_device);
123 ASSERT_EQ(address_str, created_device->GetAddress().ToString());
124 ASSERT_EQ(address_str, gotten_device->GetAddress().ToString());
125 device_database_.UpdateDeviceAddress(created_device, Address({0x01, 0x01, 0x01, 0x01, 0x01, 0x01}));
126 ASSERT_EQ("01:01:01:01:01:01", created_device->GetAddress().ToString());
127 ASSERT_EQ("01:01:01:01:01:01", gotten_device->GetAddress().ToString());
128 std::shared_ptr<Device> gotten_modified_device = device_database_.GetClassicDevice("01:01:01:01:01:01");
129 ASSERT_TRUE(gotten_modified_device);
130 ASSERT_TRUE(device_database_.RemoveDevice(gotten_modified_device));
131 ASSERT_FALSE(device_database_.GetClassicDevice("01:01:01:01:01:01"));
132 }
133 } // namespace
134 } // namespace bluetooth::hci
135