Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(140)

Side by Side Diff: components/proximity_auth/proximity_monitor_impl_unittest.cc

Issue 2845433003: [EasyUnlock] Update ProximityMonitor to only check for RSSI proximity. (Closed)
Patch Set: [EasyUnlock] Update ProximityMonitor to only check for RSSI proximity. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/proximity_auth/proximity_monitor_impl.h" 5 #include "components/proximity_auth/proximity_monitor_impl.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/macros.h" 10 #include "base/macros.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/memory/ref_counted.h" 12 #include "base/memory/ref_counted.h"
13 #include "base/test/histogram_tester.h" 13 #include "base/test/histogram_tester.h"
14 #include "base/test/simple_test_tick_clock.h" 14 #include "base/test/simple_test_tick_clock.h"
15 #include "base/test/test_simple_task_runner.h" 15 #include "base/test/test_simple_task_runner.h"
16 #include "base/threading/thread_task_runner_handle.h" 16 #include "base/threading/thread_task_runner_handle.h"
17 #include "base/time/time.h" 17 #include "base/time/time.h"
18 #include "components/cryptauth/fake_connection.h"
18 #include "components/cryptauth/remote_device.h" 19 #include "components/cryptauth/remote_device.h"
19 #include "components/proximity_auth/logging/logging.h" 20 #include "components/proximity_auth/logging/logging.h"
20 #include "components/proximity_auth/proximity_monitor_observer.h" 21 #include "components/proximity_auth/proximity_monitor_observer.h"
21 #include "device/bluetooth/bluetooth_adapter_factory.h" 22 #include "device/bluetooth/bluetooth_adapter_factory.h"
22 #include "device/bluetooth/test/mock_bluetooth_adapter.h" 23 #include "device/bluetooth/test/mock_bluetooth_adapter.h"
23 #include "testing/gmock/include/gmock/gmock.h" 24 #include "testing/gmock/include/gmock/gmock.h"
24 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
25 26
26 using device::BluetoothDevice; 27 using device::BluetoothDevice;
27 using testing::_; 28 using testing::_;
28 using testing::NiceMock; 29 using testing::NiceMock;
29 using testing::Return; 30 using testing::Return;
30 using testing::SaveArg; 31 using testing::SaveArg;
31 32
32 namespace proximity_auth { 33 namespace proximity_auth {
33 namespace { 34 namespace {
34 35
35 const char kRemoteDeviceUserId[] = "example@gmail.com"; 36 const char kRemoteDeviceUserId[] = "example@gmail.com";
36 const char kBluetoothAddress[] = "AA:BB:CC:DD:EE:FF";
37 const char kRemoteDevicePublicKey[] = "Remote Public Key"; 37 const char kRemoteDevicePublicKey[] = "Remote Public Key";
38 const char kRemoteDeviceName[] = "LGE Nexus 5"; 38 const char kRemoteDeviceName[] = "LGE Nexus 5";
39 const char kBluetoothAddress[] = "AA:BB:CC:DD:EE:FF";
39 const char kPersistentSymmetricKey[] = "PSK"; 40 const char kPersistentSymmetricKey[] = "PSK";
40 41 const int kRssiThreshold = -45;
41 class TestProximityMonitorImpl : public ProximityMonitorImpl {
42 public:
43 explicit TestProximityMonitorImpl(
44 const cryptauth::RemoteDevice& remote_device,
45 std::unique_ptr<base::TickClock> clock)
46 : ProximityMonitorImpl(remote_device, std::move(clock)) {}
47 ~TestProximityMonitorImpl() override {}
48
49 using ProximityMonitorImpl::SetStrategy;
50
51 private:
52 DISALLOW_COPY_AND_ASSIGN(TestProximityMonitorImpl);
53 };
54 42
55 class MockProximityMonitorObserver : public ProximityMonitorObserver { 43 class MockProximityMonitorObserver : public ProximityMonitorObserver {
56 public: 44 public:
57 MockProximityMonitorObserver() {} 45 MockProximityMonitorObserver() {}
58 ~MockProximityMonitorObserver() override {} 46 ~MockProximityMonitorObserver() override {}
59 47
60 MOCK_METHOD0(OnProximityStateChanged, void()); 48 MOCK_METHOD0(OnProximityStateChanged, void());
61 49
62 private: 50 private:
63 DISALLOW_COPY_AND_ASSIGN(MockProximityMonitorObserver); 51 DISALLOW_COPY_AND_ASSIGN(MockProximityMonitorObserver);
(...skipping 12 matching lines...) Expand all
76 } // namespace 64 } // namespace
77 65
78 class ProximityAuthProximityMonitorImplTest : public testing::Test { 66 class ProximityAuthProximityMonitorImplTest : public testing::Test {
79 public: 67 public:
80 ProximityAuthProximityMonitorImplTest() 68 ProximityAuthProximityMonitorImplTest()
81 : clock_(new base::SimpleTestTickClock()), 69 : clock_(new base::SimpleTestTickClock()),
82 bluetooth_adapter_(CreateAndRegisterMockBluetoothAdapter()), 70 bluetooth_adapter_(CreateAndRegisterMockBluetoothAdapter()),
83 remote_bluetooth_device_(&*bluetooth_adapter_, 71 remote_bluetooth_device_(&*bluetooth_adapter_,
84 0, 72 0,
85 kRemoteDeviceName, 73 kRemoteDeviceName,
86 kBluetoothAddress, 74 "",
87 false /* paired */, 75 false /* paired */,
88 true /* connected */), 76 true /* connected */),
89 monitor_( 77 remote_device_(kRemoteDeviceUserId,
90 cryptauth::RemoteDevice(kRemoteDeviceUserId, 78 kRemoteDeviceName,
91 kRemoteDeviceName, 79 kRemoteDevicePublicKey,
92 kRemoteDevicePublicKey, 80 kBluetoothAddress,
93 kBluetoothAddress, 81 kPersistentSymmetricKey,
94 kPersistentSymmetricKey, 82 std::string()),
95 std::string()), 83 connection_(remote_device_),
96 base::WrapUnique(clock_)), 84 monitor_(&connection_, base::WrapUnique(clock_)),
97 task_runner_(new base::TestSimpleTaskRunner()), 85 task_runner_(new base::TestSimpleTaskRunner()),
98 thread_task_runner_handle_(task_runner_) { 86 thread_task_runner_handle_(task_runner_) {
99 ON_CALL(*bluetooth_adapter_, GetDevice(kBluetoothAddress)) 87 ON_CALL(*bluetooth_adapter_, GetDevice(kBluetoothAddress))
100 .WillByDefault(Return(&remote_bluetooth_device_)); 88 .WillByDefault(Return(&remote_bluetooth_device_));
101 ON_CALL(remote_bluetooth_device_, GetConnectionInfo(_)) 89 ON_CALL(remote_bluetooth_device_, GetConnectionInfo(_))
102 .WillByDefault(SaveArg<0>(&connection_info_callback_)); 90 .WillByDefault(SaveArg<0>(&connection_info_callback_));
103 monitor_.AddObserver(&observer_); 91 monitor_.AddObserver(&observer_);
104 } 92 }
93
105 ~ProximityAuthProximityMonitorImplTest() override {} 94 ~ProximityAuthProximityMonitorImplTest() override {}
106 95
107 void RunPendingTasks() { task_runner_->RunPendingTasks(); } 96 void RunPendingTasks() { task_runner_->RunPendingTasks(); }
108 97
109 void ProvideConnectionInfo( 98 void ProvideConnectionInfo(
110 const BluetoothDevice::ConnectionInfo& connection_info) { 99 const BluetoothDevice::ConnectionInfo& connection_info) {
111 RunPendingTasks(); 100 RunPendingTasks();
112 connection_info_callback_.Run(connection_info); 101 connection_info_callback_.Run(connection_info);
113 102
114 // Reset the callback to ensure that tests correctly only respond at most 103 // Reset the callback to ensure that tests correctly only respond at most
115 // once per call to GetConnectionInfo(). 104 // once per call to GetConnectionInfo().
116 connection_info_callback_ = BluetoothDevice::ConnectionInfoCallback(); 105 connection_info_callback_ = BluetoothDevice::ConnectionInfoCallback();
117 } 106 }
118 107
119 protected: 108 protected:
120 // Mock for verifying interactions with the proximity monitor's observer. 109 // Mock for verifying interactions with the proximity monitor's observer.
121 NiceMock<MockProximityMonitorObserver> observer_; 110 NiceMock<MockProximityMonitorObserver> observer_;
122 111
123 // Clock used for verifying time calculations. Owned by the monitor_. 112 // Clock used for verifying time calculations. Owned by the monitor_.
124 base::SimpleTestTickClock* clock_; 113 base::SimpleTestTickClock* clock_;
125 114
126 // Mocks used for verifying interactions with the Bluetooth subsystem. 115 // Mocks used for verifying interactions with the Bluetooth subsystem.
127 scoped_refptr<device::MockBluetoothAdapter> bluetooth_adapter_; 116 scoped_refptr<device::MockBluetoothAdapter> bluetooth_adapter_;
128 NiceMock<device::MockBluetoothDevice> remote_bluetooth_device_; 117 NiceMock<device::MockBluetoothDevice> remote_bluetooth_device_;
118 cryptauth::RemoteDevice remote_device_;
119 cryptauth::FakeConnection connection_;
129 120
130 // The proximity monitor under test. 121 // The proximity monitor under test.
131 TestProximityMonitorImpl monitor_; 122 ProximityMonitorImpl monitor_;
132 123
133 private: 124 private:
134 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 125 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
135 base::ThreadTaskRunnerHandle thread_task_runner_handle_; 126 base::ThreadTaskRunnerHandle thread_task_runner_handle_;
136 BluetoothDevice::ConnectionInfoCallback connection_info_callback_; 127 BluetoothDevice::ConnectionInfoCallback connection_info_callback_;
137 ScopedDisableLoggingForTesting disable_logging_; 128 ScopedDisableLoggingForTesting disable_logging_;
138 }; 129 };
139 130
140 TEST_F(ProximityAuthProximityMonitorImplTest, GetStrategy) { 131 TEST_F(ProximityAuthProximityMonitorImplTest, IsUnlockAllowed_NeverStarted) {
141 EXPECT_EQ(ProximityMonitor::Strategy::NONE, monitor_.GetStrategy());
142
143 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER);
144 EXPECT_EQ(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER,
145 monitor_.GetStrategy());
146 }
147
148 TEST_F(ProximityAuthProximityMonitorImplTest, ProximityState_StrategyIsNone) {
149 monitor_.SetStrategy(ProximityMonitor::Strategy::NONE);
150
151 EXPECT_TRUE(monitor_.IsUnlockAllowed());
152 EXPECT_FALSE(monitor_.IsInRssiRange());
153 }
154
155 TEST_F(ProximityAuthProximityMonitorImplTest, ProximityState_NeverStarted) {
156 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
157
158 EXPECT_FALSE(monitor_.IsUnlockAllowed());
159 EXPECT_FALSE(monitor_.IsInRssiRange());
160 }
161
162 TEST_F(ProximityAuthProximityMonitorImplTest,
163 ProximityState_Started_NoConnectionInfoReceivedYet) {
164 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
165 monitor_.Start();
166
167 EXPECT_FALSE(monitor_.IsUnlockAllowed());
168 EXPECT_FALSE(monitor_.IsInRssiRange());
169 }
170
171 TEST_F(ProximityAuthProximityMonitorImplTest,
172 ProximityState_InformsObserverOfChanges) {
173 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER);
174
175 // Initially, the device is not in proximity.
176 monitor_.Start();
177 EXPECT_FALSE(monitor_.IsUnlockAllowed());
178
179 // Simulate a reading indicating proximity.
180 EXPECT_CALL(observer_, OnProximityStateChanged()).Times(1);
181 ProvideConnectionInfo({0, 0, 4});
182 EXPECT_TRUE(monitor_.IsUnlockAllowed());
183
184 // Simulate a reading indicating non-proximity.
185 EXPECT_CALL(observer_, OnProximityStateChanged()).Times(1);
186 ProvideConnectionInfo({0, 4, 4});
187 EXPECT_FALSE(monitor_.IsUnlockAllowed()); 132 EXPECT_FALSE(monitor_.IsUnlockAllowed());
188 } 133 }
189 134
190 TEST_F(ProximityAuthProximityMonitorImplTest, 135 TEST_F(ProximityAuthProximityMonitorImplTest,
191 ProximityState_CheckRssi_RssiIndicatesProximity_TxPowerDoesNot) { 136 IsUnlockAllowed_Started_NoConnectionInfoReceivedYet) {
192 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
193 monitor_.Start(); 137 monitor_.Start();
194 138 EXPECT_FALSE(monitor_.IsUnlockAllowed());
195 ProvideConnectionInfo({0, 4, 4});
196
197 EXPECT_TRUE(monitor_.IsUnlockAllowed());
198 EXPECT_TRUE(monitor_.IsInRssiRange());
199 } 139 }
200 140
201 TEST_F(ProximityAuthProximityMonitorImplTest, 141 TEST_F(ProximityAuthProximityMonitorImplTest, IsUnlockAllowed_RssiInRange) {
202 ProximityState_CheckRssi_TxPowerIndicatesProximity_RssiDoesNot) {
203 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
204 monitor_.Start(); 142 monitor_.Start();
205 143 ProvideConnectionInfo({0, 4, 4});
206 ProvideConnectionInfo({-10, 0, 4}); 144 EXPECT_TRUE(monitor_.IsUnlockAllowed());
207
208 EXPECT_FALSE(monitor_.IsUnlockAllowed());
209 EXPECT_FALSE(monitor_.IsInRssiRange());
210 } 145 }
211 146
212 TEST_F(ProximityAuthProximityMonitorImplTest, 147 TEST_F(ProximityAuthProximityMonitorImplTest, IsUnlockAllowed_UnknownRssi) {
213 ProximityState_CheckRssi_NeitherRssiNorTxPowerIndicatesProximity) {
214 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
215 monitor_.Start();
216
217 ProvideConnectionInfo({-10, 4, 4});
218
219 EXPECT_FALSE(monitor_.IsUnlockAllowed());
220 EXPECT_FALSE(monitor_.IsInRssiRange());
221 }
222
223 TEST_F(ProximityAuthProximityMonitorImplTest,
224 ProximityState_CheckRssi_BothRssiAndTxPowerIndicateProximity) {
225 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
226 monitor_.Start();
227
228 ProvideConnectionInfo({0, 0, 4});
229
230 EXPECT_TRUE(monitor_.IsUnlockAllowed());
231 EXPECT_TRUE(monitor_.IsInRssiRange());
232 }
233
234 TEST_F(ProximityAuthProximityMonitorImplTest,
235 ProximityState_CheckRssi_UnknownRssi) {
236 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
237 monitor_.Start(); 148 monitor_.Start();
238 149
239 ProvideConnectionInfo({0, 0, 4}); 150 ProvideConnectionInfo({0, 0, 4});
240 ProvideConnectionInfo({BluetoothDevice::kUnknownPower, 0, 4}); 151 ProvideConnectionInfo({BluetoothDevice::kUnknownPower, 0, 4});
241 152
242 EXPECT_FALSE(monitor_.IsUnlockAllowed()); 153 EXPECT_FALSE(monitor_.IsUnlockAllowed());
243 EXPECT_FALSE(monitor_.IsInRssiRange());
244 } 154 }
245 155
246 TEST_F(ProximityAuthProximityMonitorImplTest, 156 TEST_F(ProximityAuthProximityMonitorImplTest,
247 ProximityState_CheckRssi_UnknownTxPower) { 157 IsUnlockAllowed_InformsObserverOfChanges) {
248 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI); 158 // Initially, the device is not in proximity.
159 monitor_.Start();
160 EXPECT_FALSE(monitor_.IsUnlockAllowed());
161
162 // Simulate receiving an RSSI reading in proximity.
163 EXPECT_CALL(observer_, OnProximityStateChanged()).Times(1);
164 ProvideConnectionInfo({kRssiThreshold / 2, 4, 4});
165 EXPECT_TRUE(monitor_.IsUnlockAllowed());
166
167 // Simulate a reading indicating non-proximity.
168 EXPECT_CALL(observer_, OnProximityStateChanged()).Times(1);
169 ProvideConnectionInfo({2 * kRssiThreshold, 4, 4});
170 ProvideConnectionInfo({2 * kRssiThreshold, 4, 4});
171 EXPECT_FALSE(monitor_.IsUnlockAllowed());
172 }
173
174 TEST_F(ProximityAuthProximityMonitorImplTest, IsUnlockAllowed_StartThenStop) {
249 monitor_.Start(); 175 monitor_.Start();
250 176
251 ProvideConnectionInfo({0, 0, 4}); 177 ProvideConnectionInfo({0, 0, 4});
252 ProvideConnectionInfo({0, BluetoothDevice::kUnknownPower, 4}); 178 EXPECT_TRUE(monitor_.IsUnlockAllowed());
253 179
180 monitor_.Stop();
254 EXPECT_FALSE(monitor_.IsUnlockAllowed()); 181 EXPECT_FALSE(monitor_.IsUnlockAllowed());
255 EXPECT_FALSE(monitor_.IsInRssiRange());
256 } 182 }
257 183
258 TEST_F(ProximityAuthProximityMonitorImplTest, 184 TEST_F(ProximityAuthProximityMonitorImplTest,
259 ProximityState_CheckRssi_UnknownMaxTxPower) { 185 IsUnlockAllowed_StartThenStopThenStartAgain) {
260 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
261 monitor_.Start(); 186 monitor_.Start();
262 187 ProvideConnectionInfo({kRssiThreshold / 2, 4, 4});
263 ProvideConnectionInfo({0, 0, 4}); 188 ProvideConnectionInfo({kRssiThreshold / 2, 4, 4});
264 ProvideConnectionInfo({0, 0, BluetoothDevice::kUnknownPower}); 189 ProvideConnectionInfo({kRssiThreshold / 2, 4, 4});
265 190 ProvideConnectionInfo({kRssiThreshold / 2, 4, 4});
266 EXPECT_FALSE(monitor_.IsUnlockAllowed()); 191 ProvideConnectionInfo({kRssiThreshold / 2, 4, 4});
267 EXPECT_FALSE(monitor_.IsInRssiRange());
268 }
269
270 TEST_F(ProximityAuthProximityMonitorImplTest,
271 ProximityState_CheckTxPower_RssiIndicatesProximity_TxPowerDoesNot) {
272 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER);
273 monitor_.Start();
274
275 ProvideConnectionInfo({0, 4, 4});
276
277 EXPECT_FALSE(monitor_.IsUnlockAllowed());
278 EXPECT_TRUE(monitor_.IsInRssiRange());
279 }
280
281 TEST_F(ProximityAuthProximityMonitorImplTest,
282 ProximityState_CheckTxPower_TxPowerIndicatesProximity_RssiDoesNot) {
283 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER);
284 monitor_.Start();
285
286 ProvideConnectionInfo({-10, 0, 4});
287
288 EXPECT_TRUE(monitor_.IsUnlockAllowed()); 192 EXPECT_TRUE(monitor_.IsUnlockAllowed());
289 EXPECT_FALSE(monitor_.IsInRssiRange());
290 }
291
292 TEST_F(ProximityAuthProximityMonitorImplTest,
293 ProximityState_CheckTxPower_NeitherRssiNorTxPowerIndicatesProximity) {
294 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER);
295 monitor_.Start();
296
297 ProvideConnectionInfo({-10, 4, 4});
298
299 EXPECT_FALSE(monitor_.IsUnlockAllowed());
300 EXPECT_FALSE(monitor_.IsInRssiRange());
301 }
302
303 TEST_F(ProximityAuthProximityMonitorImplTest,
304 ProximityState_CheckTxPower_BothRssiAndTxPowerIndicateProximity) {
305 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER);
306 monitor_.Start();
307
308 ProvideConnectionInfo({0, 0, 4});
309
310 EXPECT_TRUE(monitor_.IsUnlockAllowed());
311 EXPECT_TRUE(monitor_.IsInRssiRange());
312 }
313
314 TEST_F(ProximityAuthProximityMonitorImplTest,
315 ProximityState_CheckTxPower_UnknownRssi) {
316 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER);
317 monitor_.Start();
318
319 ProvideConnectionInfo({0, 0, 4});
320 ProvideConnectionInfo({BluetoothDevice::kUnknownPower, 0, 4});
321
322 EXPECT_FALSE(monitor_.IsUnlockAllowed());
323 EXPECT_FALSE(monitor_.IsInRssiRange());
324 }
325
326 TEST_F(ProximityAuthProximityMonitorImplTest,
327 ProximityState_CheckTxPower_UnknownTxPower) {
328 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER);
329 monitor_.Start();
330
331 ProvideConnectionInfo({0, 0, 4});
332 ProvideConnectionInfo({0, BluetoothDevice::kUnknownPower, 4});
333
334 EXPECT_FALSE(monitor_.IsUnlockAllowed());
335 EXPECT_FALSE(monitor_.IsInRssiRange());
336 }
337
338 TEST_F(ProximityAuthProximityMonitorImplTest,
339 ProximityState_CheckTxPower_UnknownMaxTxPower) {
340 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER);
341 monitor_.Start();
342
343 ProvideConnectionInfo({0, 0, 4});
344 ProvideConnectionInfo({0, 0, BluetoothDevice::kUnknownPower});
345
346 EXPECT_FALSE(monitor_.IsUnlockAllowed());
347 EXPECT_FALSE(monitor_.IsInRssiRange());
348 }
349
350 TEST_F(ProximityAuthProximityMonitorImplTest, ProximityState_StartThenStop) {
351 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
352
353 monitor_.Start();
354 ProvideConnectionInfo({0, 0, 4});
355 monitor_.Stop();
356
357 EXPECT_FALSE(monitor_.IsUnlockAllowed());
358 EXPECT_FALSE(monitor_.IsInRssiRange());
359 }
360
361 TEST_F(ProximityAuthProximityMonitorImplTest,
362 ProximityState_StartThenStopThenStartAgain) {
363 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
364
365 monitor_.Start();
366 ProvideConnectionInfo({-10, 4, 4});
367 ProvideConnectionInfo({-10, 4, 4});
368 ProvideConnectionInfo({-10, 4, 4});
369 ProvideConnectionInfo({-10, 4, 4});
370 ProvideConnectionInfo({-10, 4, 4});
371 monitor_.Stop(); 193 monitor_.Stop();
372 194
373 // Restarting the monitor should immediately reset the proximity state, rather 195 // Restarting the monitor should immediately reset the proximity state, rather
374 // than building on the previous rolling average. 196 // than building on the previous rolling average.
375 monitor_.Start(); 197 monitor_.Start();
376 ProvideConnectionInfo({0, 4, 4}); 198 ProvideConnectionInfo({kRssiThreshold - 1, 4, 4});
377 199
378 EXPECT_TRUE(monitor_.IsUnlockAllowed()); 200 EXPECT_FALSE(monitor_.IsUnlockAllowed());
379 EXPECT_TRUE(monitor_.IsInRssiRange());
380 } 201 }
381 202
382 TEST_F(ProximityAuthProximityMonitorImplTest, 203 TEST_F(ProximityAuthProximityMonitorImplTest,
383 ProximityState_RemoteDeviceRemainsInProximity) { 204 IsUnlockAllowed_RemoteDeviceRemainsInProximity) {
384 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
385
386 monitor_.Start(); 205 monitor_.Start();
387 ProvideConnectionInfo({0, 4, 4}); 206 ProvideConnectionInfo({kRssiThreshold / 2 + 1, 4, 4});
388 ProvideConnectionInfo({-1, 4, 4}); 207 ProvideConnectionInfo({kRssiThreshold / 2 - 1, 4, 4});
389 ProvideConnectionInfo({0, 4, 4}); 208 ProvideConnectionInfo({kRssiThreshold / 2 + 2, 4, 4});
390 ProvideConnectionInfo({-2, 4, 4}); 209 ProvideConnectionInfo({kRssiThreshold / 2 - 3, 4, 4});
391 ProvideConnectionInfo({-1, 4, 4});
392 210
393 EXPECT_TRUE(monitor_.IsUnlockAllowed()); 211 EXPECT_TRUE(monitor_.IsUnlockAllowed());
394 EXPECT_TRUE(monitor_.IsInRssiRange());
395 212
396 // Brief drops in RSSI should be handled by weighted averaging. 213 // Brief drops in RSSI should be handled by weighted averaging.
397 ProvideConnectionInfo({-10, 4, 4}); 214 ProvideConnectionInfo({kRssiThreshold - 5, 4, 4});
398 215
399 EXPECT_TRUE(monitor_.IsUnlockAllowed()); 216 EXPECT_TRUE(monitor_.IsUnlockAllowed());
400 EXPECT_TRUE(monitor_.IsInRssiRange());
401 } 217 }
402 218
403 TEST_F(ProximityAuthProximityMonitorImplTest, 219 TEST_F(ProximityAuthProximityMonitorImplTest,
404 ProximityState_RemoteDeviceLeavesProximity) { 220 IsUnlockAllowed_RemoteDeviceLeavesProximity) {
405 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
406 monitor_.Start(); 221 monitor_.Start();
407 222
408 // Start with a device in proximity. 223 // Start with a device in proximity.
409 ProvideConnectionInfo({0, 4, 4}); 224 ProvideConnectionInfo({0, 4, 4});
410 EXPECT_TRUE(monitor_.IsUnlockAllowed()); 225 EXPECT_TRUE(monitor_.IsUnlockAllowed());
411 EXPECT_TRUE(monitor_.IsInRssiRange());
412 226
413 // Simulate readings for the remote device leaving proximity. 227 // Simulate readings for the remote device leaving proximity.
414 ProvideConnectionInfo({-1, 4, 4}); 228 ProvideConnectionInfo({-1, 4, 4});
415 ProvideConnectionInfo({-4, 4, 4}); 229 ProvideConnectionInfo({-4, 4, 4});
416 ProvideConnectionInfo({0, 4, 4}); 230 ProvideConnectionInfo({0, 4, 4});
417 ProvideConnectionInfo({-10, 4, 4}); 231 ProvideConnectionInfo({-10, 4, 4});
418 ProvideConnectionInfo({-8, 4, 4});
419 ProvideConnectionInfo({-15, 4, 4}); 232 ProvideConnectionInfo({-15, 4, 4});
420 ProvideConnectionInfo({-10, 4, 4}); 233 ProvideConnectionInfo({-20, 4, 4});
421 ProvideConnectionInfo({-10, 4, 4}); 234 ProvideConnectionInfo({kRssiThreshold, 4, 4});
422 ProvideConnectionInfo({-10, 4, 4}); 235 ProvideConnectionInfo({kRssiThreshold - 10, 4, 4});
423 ProvideConnectionInfo({-10, 4, 4}); 236 ProvideConnectionInfo({kRssiThreshold - 20, 4, 4});
237 ProvideConnectionInfo({kRssiThreshold - 20, 4, 4});
424 238
425 EXPECT_FALSE(monitor_.IsUnlockAllowed()); 239 EXPECT_FALSE(monitor_.IsUnlockAllowed());
426 EXPECT_FALSE(monitor_.IsInRssiRange());
427 } 240 }
428 241
429 TEST_F(ProximityAuthProximityMonitorImplTest, 242 TEST_F(ProximityAuthProximityMonitorImplTest,
430 ProximityState_RemoteDeviceEntersProximity) { 243 IsUnlockAllowed_RemoteDeviceEntersProximity) {
431 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
432 monitor_.Start(); 244 monitor_.Start();
433 245
434 // Start with a device in proximity. 246 // Start with a device out of proximity.
435 ProvideConnectionInfo({-20, 4, 4}); 247 ProvideConnectionInfo({2 * kRssiThreshold, 4, 4});
436 EXPECT_FALSE(monitor_.IsUnlockAllowed()); 248 EXPECT_FALSE(monitor_.IsUnlockAllowed());
437 EXPECT_FALSE(monitor_.IsInRssiRange());
438 249
439 // Simulate readings for the remote device entering proximity. 250 // Simulate readings for the remote device entering proximity.
440 ProvideConnectionInfo({-15, 4, 4}); 251 ProvideConnectionInfo({-15, 4, 4});
441 ProvideConnectionInfo({-8, 4, 4}); 252 ProvideConnectionInfo({-8, 4, 4});
442 ProvideConnectionInfo({-12, 4, 4}); 253 ProvideConnectionInfo({-12, 4, 4});
443 ProvideConnectionInfo({-18, 4, 4}); 254 ProvideConnectionInfo({-18, 4, 4});
444 ProvideConnectionInfo({-7, 4, 4}); 255 ProvideConnectionInfo({-7, 4, 4});
445 ProvideConnectionInfo({-3, 4, 4}); 256 ProvideConnectionInfo({-3, 4, 4});
446 ProvideConnectionInfo({-2, 4, 4}); 257 ProvideConnectionInfo({-2, 4, 4});
447 ProvideConnectionInfo({0, 4, 4}); 258 ProvideConnectionInfo({0, 4, 4});
448 ProvideConnectionInfo({0, 4, 4}); 259 ProvideConnectionInfo({0, 4, 4});
449 260
450 EXPECT_TRUE(monitor_.IsUnlockAllowed()); 261 EXPECT_TRUE(monitor_.IsUnlockAllowed());
451 EXPECT_TRUE(monitor_.IsInRssiRange());
452 } 262 }
453 263
454 TEST_F(ProximityAuthProximityMonitorImplTest, 264 TEST_F(ProximityAuthProximityMonitorImplTest,
455 ProximityState_DeviceNotKnownToAdapter) { 265 IsUnlockAllowed_DeviceNotKnownToAdapter) {
456 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
457 monitor_.Start(); 266 monitor_.Start();
458 267
459 // Start with the device known to the adapter and in proximity. 268 // Start with the device known to the adapter and in proximity.
460 ProvideConnectionInfo({0, 4, 4}); 269 ProvideConnectionInfo({0, 4, 4});
461 EXPECT_TRUE(monitor_.IsUnlockAllowed()); 270 EXPECT_TRUE(monitor_.IsUnlockAllowed());
462 EXPECT_TRUE(monitor_.IsInRssiRange());
463 271
464 // Simulate it being forgotten. 272 // Simulate it being forgotten.
465 ON_CALL(*bluetooth_adapter_, GetDevice(kBluetoothAddress)) 273 ON_CALL(*bluetooth_adapter_, GetDevice(kBluetoothAddress))
466 .WillByDefault(Return(nullptr)); 274 .WillByDefault(Return(nullptr));
467 EXPECT_CALL(observer_, OnProximityStateChanged()); 275 EXPECT_CALL(observer_, OnProximityStateChanged());
468 RunPendingTasks(); 276 RunPendingTasks();
469 277
470 EXPECT_FALSE(monitor_.IsUnlockAllowed()); 278 EXPECT_FALSE(monitor_.IsUnlockAllowed());
471 EXPECT_FALSE(monitor_.IsInRssiRange());
472 } 279 }
473 280
474 TEST_F(ProximityAuthProximityMonitorImplTest, 281 TEST_F(ProximityAuthProximityMonitorImplTest,
475 ProximityState_DeviceNotConnected) { 282 IsUnlockAllowed_DeviceNotConnected) {
476 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
477 monitor_.Start(); 283 monitor_.Start();
478 284
479 // Start with the device connected and in proximity. 285 // Start with the device connected and in proximity.
480 ProvideConnectionInfo({0, 4, 4}); 286 ProvideConnectionInfo({0, 4, 4});
481 EXPECT_TRUE(monitor_.IsUnlockAllowed()); 287 EXPECT_TRUE(monitor_.IsUnlockAllowed());
482 EXPECT_TRUE(monitor_.IsInRssiRange());
483 288
484 // Simulate it disconnecting. 289 // Simulate it disconnecting.
485 ON_CALL(remote_bluetooth_device_, IsConnected()).WillByDefault(Return(false)); 290 ON_CALL(remote_bluetooth_device_, IsConnected()).WillByDefault(Return(false));
486 EXPECT_CALL(observer_, OnProximityStateChanged()); 291 EXPECT_CALL(observer_, OnProximityStateChanged());
487 RunPendingTasks(); 292 RunPendingTasks();
488 293
489 EXPECT_FALSE(monitor_.IsUnlockAllowed()); 294 EXPECT_FALSE(monitor_.IsUnlockAllowed());
490 EXPECT_FALSE(monitor_.IsInRssiRange());
491 } 295 }
492 296
493 TEST_F(ProximityAuthProximityMonitorImplTest, 297 TEST_F(ProximityAuthProximityMonitorImplTest,
494 ProximityState_ConnectionInfoReceivedAfterStopping) { 298 IsUnlockAllowed_ConnectionInfoReceivedAfterStopping) {
495 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI);
496
497 monitor_.Start(); 299 monitor_.Start();
498 monitor_.Stop(); 300 monitor_.Stop();
499 ProvideConnectionInfo({0, 4, 4}); 301 ProvideConnectionInfo({0, 4, 4});
500
501 EXPECT_FALSE(monitor_.IsUnlockAllowed()); 302 EXPECT_FALSE(monitor_.IsUnlockAllowed());
502 EXPECT_FALSE(monitor_.IsInRssiRange());
503 } 303 }
504 304
505 TEST_F(ProximityAuthProximityMonitorImplTest, 305 TEST_F(ProximityAuthProximityMonitorImplTest,
506 RecordProximityMetricsOnAuthSuccess_NormalValues) { 306 RecordProximityMetricsOnAuthSuccess_NormalValues) {
507 monitor_.Start(); 307 monitor_.Start();
508 ProvideConnectionInfo({0, 0, 4}); 308 ProvideConnectionInfo({0, 0, 4});
509 309
510 clock_->Advance(base::TimeDelta::FromMilliseconds(101)); 310 clock_->Advance(base::TimeDelta::FromMilliseconds(101));
511 ProvideConnectionInfo({-20, 3, 4}); 311 ProvideConnectionInfo({-20, 3, 4});
512 312
513 clock_->Advance(base::TimeDelta::FromMilliseconds(203)); 313 clock_->Advance(base::TimeDelta::FromMilliseconds(203));
514 base::HistogramTester histogram_tester; 314 base::HistogramTester histogram_tester;
515 monitor_.RecordProximityMetricsOnAuthSuccess(); 315 monitor_.RecordProximityMetricsOnAuthSuccess();
516 histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi", 316 histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi",
517 -6, 1); 317 -6, 1);
518 histogram_tester.ExpectUniqueSample( 318 histogram_tester.ExpectUniqueSample(
519 "EasyUnlock.AuthProximity.TransmitPowerDelta", -1, 1);
520 histogram_tester.ExpectUniqueSample(
521 "EasyUnlock.AuthProximity.TimeSinceLastZeroRssi", 304, 1); 319 "EasyUnlock.AuthProximity.TimeSinceLastZeroRssi", 304, 1);
522 histogram_tester.ExpectUniqueSample( 320 histogram_tester.ExpectUniqueSample(
523 "EasyUnlock.AuthProximity.RemoteDeviceModelHash", 321 "EasyUnlock.AuthProximity.RemoteDeviceModelHash",
524 1881443083 /* hash of "LGE Nexus 5" */, 1); 322 1881443083 /* hash of "LGE Nexus 5" */, 1);
525 } 323 }
526 324
527 TEST_F(ProximityAuthProximityMonitorImplTest, 325 TEST_F(ProximityAuthProximityMonitorImplTest,
528 RecordProximityMetricsOnAuthSuccess_ClampedValues) { 326 RecordProximityMetricsOnAuthSuccess_ClampedValues) {
529 monitor_.Start(); 327 monitor_.Start();
530 ProvideConnectionInfo({-99999, 99999, 12345}); 328 ProvideConnectionInfo({-99999, 99999, 12345});
531 329
532 base::HistogramTester histogram_tester; 330 base::HistogramTester histogram_tester;
533 monitor_.RecordProximityMetricsOnAuthSuccess(); 331 monitor_.RecordProximityMetricsOnAuthSuccess();
534 histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi", 332 histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi",
535 -100, 1); 333 -100, 1);
536 histogram_tester.ExpectUniqueSample(
537 "EasyUnlock.AuthProximity.TransmitPowerDelta", 50, 1);
538 } 334 }
539 335
540 TEST_F(ProximityAuthProximityMonitorImplTest, 336 TEST_F(ProximityAuthProximityMonitorImplTest,
541 RecordProximityMetricsOnAuthSuccess_UnknownValues) { 337 RecordProximityMetricsOnAuthSuccess_UnknownValues) {
542 // Note: A device without a recorded name will have its Bluetooth address as 338 // Note: A device without a recorded name will have "Unknown" as its name.
543 // its name.
544 cryptauth::RemoteDevice unnamed_remote_device( 339 cryptauth::RemoteDevice unnamed_remote_device(
545 kRemoteDeviceUserId, kBluetoothAddress, kRemoteDevicePublicKey, 340 kRemoteDeviceUserId, "" /* name */, kRemoteDevicePublicKey,
546 kBluetoothAddress, kPersistentSymmetricKey, std::string()); 341 kBluetoothAddress, kPersistentSymmetricKey, std::string());
342 cryptauth::FakeConnection connection(unnamed_remote_device);
547 343
548 std::unique_ptr<base::TickClock> clock(new base::SimpleTestTickClock()); 344 std::unique_ptr<base::TickClock> clock(new base::SimpleTestTickClock());
549 ProximityMonitorImpl monitor(unnamed_remote_device, std::move(clock)); 345 ProximityMonitorImpl monitor(&connection, std::move(clock));
550 monitor.AddObserver(&observer_); 346 monitor.AddObserver(&observer_);
551 monitor.Start(); 347 monitor.Start();
552 ProvideConnectionInfo({127, 127, 127}); 348 ProvideConnectionInfo({127, 127, 127});
553 349
554 base::HistogramTester histogram_tester; 350 base::HistogramTester histogram_tester;
555 monitor.RecordProximityMetricsOnAuthSuccess(); 351 monitor.RecordProximityMetricsOnAuthSuccess();
556 histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi", 352 histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi",
557 127, 1); 353 127, 1);
558 histogram_tester.ExpectUniqueSample( 354 histogram_tester.ExpectUniqueSample(
559 "EasyUnlock.AuthProximity.TransmitPowerDelta", 127, 1);
560 histogram_tester.ExpectUniqueSample(
561 "EasyUnlock.AuthProximity.TimeSinceLastZeroRssi", 355 "EasyUnlock.AuthProximity.TimeSinceLastZeroRssi",
562 base::TimeDelta::FromSeconds(10).InMilliseconds(), 1); 356 base::TimeDelta::FromSeconds(10).InMilliseconds(), 1);
563 histogram_tester.ExpectUniqueSample( 357 histogram_tester.ExpectUniqueSample(
564 "EasyUnlock.AuthProximity.RemoteDeviceModelHash", 358 "EasyUnlock.AuthProximity.RemoteDeviceModelHash",
565 -1808066424 /* hash of "Unknown" */, 1); 359 -1808066424 /* hash of "Unknown" */, 1);
566 } 360 }
567 361
568 } // namespace proximity_auth 362 } // namespace proximity_auth
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698