1 /*
2 * Copyright 2022 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 <gtest/gtest.h>
18
19 #include "model/controller/link_layer_controller.h"
20
21 namespace rootcanal {
22
23 using namespace bluetooth::hci;
24
25 class LeCreateConnectionTest : public ::testing::Test {
26 public:
27 LeCreateConnectionTest() = default;
28 ~LeCreateConnectionTest() override = default;
29
30 protected:
31 Address address_{0};
32 ControllerProperties properties_{};
33 LinkLayerController controller_{address_, properties_};
34 };
35
TEST_F(LeCreateConnectionTest,ConnectUsingPublicAddress)36 TEST_F(LeCreateConnectionTest, ConnectUsingPublicAddress) {
37 ASSERT_EQ(controller_.LeCreateConnection(
38 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
39 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
40 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x100, 0x200, 0x010, 0x0c80, 0x0, 0x0),
41 ErrorCode::SUCCESS);
42 }
43
TEST_F(LeCreateConnectionTest,ConnectUsingRandomAddress)44 TEST_F(LeCreateConnectionTest, ConnectUsingRandomAddress) {
45 ASSERT_EQ(controller_.LeSetRandomAddress(Address{1}), ErrorCode::SUCCESS);
46 ASSERT_EQ(controller_.LeCreateConnection(
47 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
48 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
49 OwnAddressType::RANDOM_DEVICE_ADDRESS, 0x100, 0x200, 0x010, 0x0c80, 0x0, 0x0),
50 ErrorCode::SUCCESS);
51 }
52
TEST_F(LeCreateConnectionTest,ConnectUsingResolvableAddress)53 TEST_F(LeCreateConnectionTest, ConnectUsingResolvableAddress) {
54 ASSERT_EQ(controller_.LeSetRandomAddress(Address{1}), ErrorCode::SUCCESS);
55 ASSERT_EQ(controller_.LeCreateConnection(
56 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
57 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
58 OwnAddressType::RESOLVABLE_OR_RANDOM_ADDRESS, 0x100, 0x200, 0x010, 0x0c80, 0x0,
59 0x0),
60 ErrorCode::SUCCESS);
61 }
62
TEST_F(LeCreateConnectionTest,InitiatingActive)63 TEST_F(LeCreateConnectionTest, InitiatingActive) {
64 ASSERT_EQ(controller_.LeCreateConnection(
65 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
66 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
67 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x100, 0x200, 0x010, 0x0c80, 0x0, 0x0),
68 ErrorCode::SUCCESS);
69
70 ASSERT_EQ(controller_.LeCreateConnection(
71 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
72 AddressWithType{Address{2}, AddressType::PUBLIC_DEVICE_ADDRESS},
73 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x100, 0x200, 0x010, 0x0c80, 0x0, 0x0),
74 ErrorCode::COMMAND_DISALLOWED);
75 }
76
TEST_F(LeCreateConnectionTest,InvalidScanInterval)77 TEST_F(LeCreateConnectionTest, InvalidScanInterval) {
78 ASSERT_EQ(controller_.LeCreateConnection(
79 0x3, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
80 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
81 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x100, 0x200, 0x010, 0x0c80, 0x0, 0x0),
82 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
83
84 ASSERT_EQ(controller_.LeCreateConnection(
85 0x4001, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
86 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
87 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x100, 0x200, 0x010, 0x0c80, 0x0, 0x0),
88 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
89 }
90
TEST_F(LeCreateConnectionTest,InvalidScanWindow)91 TEST_F(LeCreateConnectionTest, InvalidScanWindow) {
92 ASSERT_EQ(controller_.LeCreateConnection(
93 0x200, 0x3, InitiatorFilterPolicy::USE_PEER_ADDRESS,
94 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
95 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x100, 0x200, 0x010, 0x0c80, 0x0, 0x0),
96 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
97
98 ASSERT_EQ(controller_.LeCreateConnection(
99 0x200, 0x4001, InitiatorFilterPolicy::USE_PEER_ADDRESS,
100 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
101 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x100, 0x200, 0x010, 0x0c80, 0x0, 0x0),
102 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
103
104 ASSERT_EQ(controller_.LeCreateConnection(
105 0x100, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
106 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
107 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x100, 0x200, 0x010, 0x0c80, 0x0, 0x0),
108 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
109 }
110
TEST_F(LeCreateConnectionTest,InvalidConnectionInterval)111 TEST_F(LeCreateConnectionTest, InvalidConnectionInterval) {
112 ASSERT_EQ(controller_.LeCreateConnection(
113 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
114 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
115 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x5, 0x200, 0x010, 0x0c80, 0x0, 0x0),
116 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
117
118 ASSERT_EQ(controller_.LeCreateConnection(
119 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
120 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
121 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x0c81, 0x200, 0x010, 0x0c80, 0x0, 0x0),
122 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
123
124 ASSERT_EQ(controller_.LeCreateConnection(
125 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
126 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
127 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x200, 0x5, 0x010, 0x0c80, 0x0, 0x0),
128 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
129
130 ASSERT_EQ(controller_.LeCreateConnection(
131 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
132 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
133 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x200, 0x0c81, 0x010, 0x0c80, 0x0, 0x0),
134 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
135
136 ASSERT_EQ(controller_.LeCreateConnection(
137 0x4001, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
138 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
139 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x200, 0x100, 0x010, 0x0c80, 0x0, 0x0),
140 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
141 }
142
TEST_F(LeCreateConnectionTest,InvalidMaxLatency)143 TEST_F(LeCreateConnectionTest, InvalidMaxLatency) {
144 ASSERT_EQ(controller_.LeCreateConnection(
145 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
146 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
147 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x100, 0x200, 0x01f4, 0x0c80, 0x0, 0x0),
148 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
149 }
150
TEST_F(LeCreateConnectionTest,InvalidSupervisionTimeout)151 TEST_F(LeCreateConnectionTest, InvalidSupervisionTimeout) {
152 ASSERT_EQ(controller_.LeCreateConnection(
153 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
154 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
155 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x100, 0x200, 0x010, 0x9, 0x0, 0x0),
156 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
157
158 ASSERT_EQ(controller_.LeCreateConnection(
159 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
160 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
161 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x100, 0x200, 0x010, 0x0c81, 0x0, 0x0),
162 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
163
164 ASSERT_EQ(controller_.LeCreateConnection(
165 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
166 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
167 OwnAddressType::PUBLIC_DEVICE_ADDRESS, 0x100, 0x200, 0x1f3, 0x0c80, 0x0, 0x0),
168 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
169 }
170
TEST_F(LeCreateConnectionTest,NoRandomAddress)171 TEST_F(LeCreateConnectionTest, NoRandomAddress) {
172 ASSERT_EQ(controller_.LeCreateConnection(
173 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
174 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
175 OwnAddressType::RANDOM_DEVICE_ADDRESS, 0x100, 0x200, 0x010, 0x0c80, 0x0, 0x0),
176 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
177
178 ASSERT_EQ(controller_.LeCreateConnection(
179 0x200, 0x200, InitiatorFilterPolicy::USE_PEER_ADDRESS,
180 AddressWithType{Address{1}, AddressType::PUBLIC_DEVICE_ADDRESS},
181 OwnAddressType::RESOLVABLE_OR_RANDOM_ADDRESS, 0x100, 0x200, 0x010, 0x0c80, 0x0,
182 0x0),
183 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
184 }
185
186 } // namespace rootcanal
187