OLD | NEW |
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/optional.h" |
13 #include "base/test/histogram_tester.h" | 14 #include "base/test/histogram_tester.h" |
14 #include "base/test/simple_test_tick_clock.h" | 15 #include "base/test/simple_test_tick_clock.h" |
15 #include "base/test/test_simple_task_runner.h" | 16 #include "base/test/test_simple_task_runner.h" |
16 #include "base/thread_task_runner_handle.h" | 17 #include "base/thread_task_runner_handle.h" |
17 #include "base/time/time.h" | 18 #include "base/time/time.h" |
18 #include "components/proximity_auth/logging/logging.h" | 19 #include "components/proximity_auth/logging/logging.h" |
19 #include "components/proximity_auth/proximity_monitor_observer.h" | 20 #include "components/proximity_auth/proximity_monitor_observer.h" |
20 #include "components/proximity_auth/remote_device.h" | 21 #include "components/proximity_auth/remote_device.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" |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 EXPECT_TRUE(monitor_.IsUnlockAllowed()); | 230 EXPECT_TRUE(monitor_.IsUnlockAllowed()); |
230 EXPECT_TRUE(monitor_.IsInRssiRange()); | 231 EXPECT_TRUE(monitor_.IsInRssiRange()); |
231 } | 232 } |
232 | 233 |
233 TEST_F(ProximityAuthProximityMonitorImplTest, | 234 TEST_F(ProximityAuthProximityMonitorImplTest, |
234 ProximityState_CheckRssi_UnknownRssi) { | 235 ProximityState_CheckRssi_UnknownRssi) { |
235 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI); | 236 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI); |
236 monitor_.Start(); | 237 monitor_.Start(); |
237 | 238 |
238 ProvideConnectionInfo({0, 0, 4}); | 239 ProvideConnectionInfo({0, 0, 4}); |
239 ProvideConnectionInfo({BluetoothDevice::kUnknownPower, 0, 4}); | 240 ProvideConnectionInfo({base::nullopt, 0, 4}); |
240 | 241 |
241 EXPECT_FALSE(monitor_.IsUnlockAllowed()); | 242 EXPECT_FALSE(monitor_.IsUnlockAllowed()); |
242 EXPECT_FALSE(monitor_.IsInRssiRange()); | 243 EXPECT_FALSE(monitor_.IsInRssiRange()); |
243 } | 244 } |
244 | 245 |
245 TEST_F(ProximityAuthProximityMonitorImplTest, | 246 TEST_F(ProximityAuthProximityMonitorImplTest, |
246 ProximityState_CheckRssi_UnknownTxPower) { | 247 ProximityState_CheckRssi_UnknownTxPower) { |
247 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI); | 248 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI); |
248 monitor_.Start(); | 249 monitor_.Start(); |
249 | 250 |
250 ProvideConnectionInfo({0, 0, 4}); | 251 ProvideConnectionInfo({0, 0, 4}); |
251 ProvideConnectionInfo({0, BluetoothDevice::kUnknownPower, 4}); | 252 ProvideConnectionInfo({0, base::nullopt, 4}); |
252 | 253 |
253 EXPECT_FALSE(monitor_.IsUnlockAllowed()); | 254 EXPECT_FALSE(monitor_.IsUnlockAllowed()); |
254 EXPECT_FALSE(monitor_.IsInRssiRange()); | 255 EXPECT_FALSE(monitor_.IsInRssiRange()); |
255 } | 256 } |
256 | 257 |
257 TEST_F(ProximityAuthProximityMonitorImplTest, | 258 TEST_F(ProximityAuthProximityMonitorImplTest, |
258 ProximityState_CheckRssi_UnknownMaxTxPower) { | 259 ProximityState_CheckRssi_UnknownMaxTxPower) { |
259 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI); | 260 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI); |
260 monitor_.Start(); | 261 monitor_.Start(); |
261 | 262 |
262 ProvideConnectionInfo({0, 0, 4}); | 263 ProvideConnectionInfo({0, 0, 4}); |
263 ProvideConnectionInfo({0, 0, BluetoothDevice::kUnknownPower}); | 264 ProvideConnectionInfo({0, 0, base::nullopt}); |
264 | 265 |
265 EXPECT_FALSE(monitor_.IsUnlockAllowed()); | 266 EXPECT_FALSE(monitor_.IsUnlockAllowed()); |
266 EXPECT_FALSE(monitor_.IsInRssiRange()); | 267 EXPECT_FALSE(monitor_.IsInRssiRange()); |
267 } | 268 } |
268 | 269 |
269 TEST_F(ProximityAuthProximityMonitorImplTest, | 270 TEST_F(ProximityAuthProximityMonitorImplTest, |
270 ProximityState_CheckTxPower_RssiIndicatesProximity_TxPowerDoesNot) { | 271 ProximityState_CheckTxPower_RssiIndicatesProximity_TxPowerDoesNot) { |
271 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER); | 272 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER); |
272 monitor_.Start(); | 273 monitor_.Start(); |
273 | 274 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 EXPECT_TRUE(monitor_.IsUnlockAllowed()); | 310 EXPECT_TRUE(monitor_.IsUnlockAllowed()); |
310 EXPECT_TRUE(monitor_.IsInRssiRange()); | 311 EXPECT_TRUE(monitor_.IsInRssiRange()); |
311 } | 312 } |
312 | 313 |
313 TEST_F(ProximityAuthProximityMonitorImplTest, | 314 TEST_F(ProximityAuthProximityMonitorImplTest, |
314 ProximityState_CheckTxPower_UnknownRssi) { | 315 ProximityState_CheckTxPower_UnknownRssi) { |
315 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER); | 316 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER); |
316 monitor_.Start(); | 317 monitor_.Start(); |
317 | 318 |
318 ProvideConnectionInfo({0, 0, 4}); | 319 ProvideConnectionInfo({0, 0, 4}); |
319 ProvideConnectionInfo({BluetoothDevice::kUnknownPower, 0, 4}); | 320 ProvideConnectionInfo({base::nullopt, 0, 4}); |
320 | 321 |
321 EXPECT_FALSE(monitor_.IsUnlockAllowed()); | 322 EXPECT_FALSE(monitor_.IsUnlockAllowed()); |
322 EXPECT_FALSE(monitor_.IsInRssiRange()); | 323 EXPECT_FALSE(monitor_.IsInRssiRange()); |
323 } | 324 } |
324 | 325 |
325 TEST_F(ProximityAuthProximityMonitorImplTest, | 326 TEST_F(ProximityAuthProximityMonitorImplTest, |
326 ProximityState_CheckTxPower_UnknownTxPower) { | 327 ProximityState_CheckTxPower_UnknownTxPower) { |
327 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER); | 328 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER); |
328 monitor_.Start(); | 329 monitor_.Start(); |
329 | 330 |
330 ProvideConnectionInfo({0, 0, 4}); | 331 ProvideConnectionInfo({0, 0, 4}); |
331 ProvideConnectionInfo({0, BluetoothDevice::kUnknownPower, 4}); | 332 ProvideConnectionInfo({0, base::nullopt, 4}); |
332 | 333 |
333 EXPECT_FALSE(monitor_.IsUnlockAllowed()); | 334 EXPECT_FALSE(monitor_.IsUnlockAllowed()); |
334 EXPECT_FALSE(monitor_.IsInRssiRange()); | 335 EXPECT_FALSE(monitor_.IsInRssiRange()); |
335 } | 336 } |
336 | 337 |
337 TEST_F(ProximityAuthProximityMonitorImplTest, | 338 TEST_F(ProximityAuthProximityMonitorImplTest, |
338 ProximityState_CheckTxPower_UnknownMaxTxPower) { | 339 ProximityState_CheckTxPower_UnknownMaxTxPower) { |
339 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER); | 340 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_TRANSMIT_POWER); |
340 monitor_.Start(); | 341 monitor_.Start(); |
341 | 342 |
342 ProvideConnectionInfo({0, 0, 4}); | 343 ProvideConnectionInfo({0, 0, 4}); |
343 ProvideConnectionInfo({0, 0, BluetoothDevice::kUnknownPower}); | 344 ProvideConnectionInfo({0, 0, base::nullopt}); |
344 | 345 |
345 EXPECT_FALSE(monitor_.IsUnlockAllowed()); | 346 EXPECT_FALSE(monitor_.IsUnlockAllowed()); |
346 EXPECT_FALSE(monitor_.IsInRssiRange()); | 347 EXPECT_FALSE(monitor_.IsInRssiRange()); |
347 } | 348 } |
348 | 349 |
349 TEST_F(ProximityAuthProximityMonitorImplTest, ProximityState_StartThenStop) { | 350 TEST_F(ProximityAuthProximityMonitorImplTest, ProximityState_StartThenStop) { |
350 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI); | 351 monitor_.SetStrategy(ProximityMonitor::Strategy::CHECK_RSSI); |
351 | 352 |
352 monitor_.Start(); | 353 monitor_.Start(); |
353 ProvideConnectionInfo({0, 0, 4}); | 354 ProvideConnectionInfo({0, 0, 4}); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 histogram_tester.ExpectUniqueSample( | 518 histogram_tester.ExpectUniqueSample( |
518 "EasyUnlock.AuthProximity.TransmitPowerDelta", -1, 1); | 519 "EasyUnlock.AuthProximity.TransmitPowerDelta", -1, 1); |
519 histogram_tester.ExpectUniqueSample( | 520 histogram_tester.ExpectUniqueSample( |
520 "EasyUnlock.AuthProximity.TimeSinceLastZeroRssi", 304, 1); | 521 "EasyUnlock.AuthProximity.TimeSinceLastZeroRssi", 304, 1); |
521 histogram_tester.ExpectUniqueSample( | 522 histogram_tester.ExpectUniqueSample( |
522 "EasyUnlock.AuthProximity.RemoteDeviceModelHash", | 523 "EasyUnlock.AuthProximity.RemoteDeviceModelHash", |
523 1881443083 /* hash of "LGE Nexus 5" */, 1); | 524 1881443083 /* hash of "LGE Nexus 5" */, 1); |
524 } | 525 } |
525 | 526 |
526 TEST_F(ProximityAuthProximityMonitorImplTest, | 527 TEST_F(ProximityAuthProximityMonitorImplTest, |
527 RecordProximityMetricsOnAuthSuccess_ClampedValues) { | 528 RecordProximityMetricsOnAuthSuccess_ClampedValues_LowerThreshold) { |
| 529 // Tests that we clamp values lower than -100 before histograming. |
| 530 |
| 531 int8_t rssi = -128; |
| 532 int8_t tx_power = -128; |
| 533 int8_t max_tx_power = 0; |
| 534 // The resulting TransmitPowerDelta that we try to record is -128. |
| 535 |
528 monitor_.Start(); | 536 monitor_.Start(); |
529 ProvideConnectionInfo({-99999, 99999, 12345}); | 537 ProvideConnectionInfo({rssi, tx_power, max_tx_power}); |
530 | 538 |
531 base::HistogramTester histogram_tester; | 539 base::HistogramTester histogram_tester; |
532 monitor_.RecordProximityMetricsOnAuthSuccess(); | 540 monitor_.RecordProximityMetricsOnAuthSuccess(); |
533 histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi", | 541 histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi", |
534 -100, 1); | 542 -100, 1); |
535 histogram_tester.ExpectUniqueSample( | 543 histogram_tester.ExpectUniqueSample( |
| 544 "EasyUnlock.AuthProximity.TransmitPowerDelta", -100, 1); |
| 545 } |
| 546 |
| 547 TEST_F(ProximityAuthProximityMonitorImplTest, |
| 548 RecordProximityMetricsOnAuthSuccess_ClampedValues_UpperThreshold) { |
| 549 // Tests that we clamp values larger than 50 before histograming. |
| 550 |
| 551 int8_t rssi = 126; |
| 552 int8_t tx_power = 126; |
| 553 int8_t max_tx_power = 0; |
| 554 // The resulting TransmitPowerDelta that we try to record is 126. |
| 555 |
| 556 monitor_.Start(); |
| 557 ProvideConnectionInfo({rssi, tx_power, max_tx_power}); |
| 558 |
| 559 base::HistogramTester histogram_tester; |
| 560 monitor_.RecordProximityMetricsOnAuthSuccess(); |
| 561 histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi", |
| 562 50, 1); |
| 563 histogram_tester.ExpectUniqueSample( |
536 "EasyUnlock.AuthProximity.TransmitPowerDelta", 50, 1); | 564 "EasyUnlock.AuthProximity.TransmitPowerDelta", 50, 1); |
537 } | 565 } |
538 | 566 |
539 TEST_F(ProximityAuthProximityMonitorImplTest, | 567 TEST_F(ProximityAuthProximityMonitorImplTest, |
540 RecordProximityMetricsOnAuthSuccess_UnknownValues) { | 568 RecordProximityMetricsOnAuthSuccess_UnknownValues) { |
541 // Note: A device without a recorded name will have its Bluetooth address as | 569 // Note: A device without a recorded name will have its Bluetooth address as |
542 // its name. | 570 // its name. |
543 RemoteDevice unnamed_remote_device( | 571 RemoteDevice unnamed_remote_device( |
544 kRemoteDeviceUserId, kBluetoothAddress, kRemoteDevicePublicKey, | 572 kRemoteDeviceUserId, kBluetoothAddress, kRemoteDevicePublicKey, |
545 RemoteDevice::BLUETOOTH_CLASSIC, kBluetoothAddress, | 573 RemoteDevice::BLUETOOTH_CLASSIC, kBluetoothAddress, |
546 kPersistentSymmetricKey, std::string()); | 574 kPersistentSymmetricKey, std::string()); |
547 | 575 |
548 std::unique_ptr<base::TickClock> clock(new base::SimpleTestTickClock()); | 576 std::unique_ptr<base::TickClock> clock(new base::SimpleTestTickClock()); |
549 ProximityMonitorImpl monitor(unnamed_remote_device, std::move(clock)); | 577 ProximityMonitorImpl monitor(unnamed_remote_device, std::move(clock)); |
550 monitor.AddObserver(&observer_); | 578 monitor.AddObserver(&observer_); |
551 monitor.Start(); | 579 monitor.Start(); |
552 ProvideConnectionInfo({127, 127, 127}); | 580 ProvideConnectionInfo({base::nullopt, base::nullopt, base::nullopt}); |
553 | 581 |
554 base::HistogramTester histogram_tester; | 582 base::HistogramTester histogram_tester; |
555 monitor.RecordProximityMetricsOnAuthSuccess(); | 583 monitor.RecordProximityMetricsOnAuthSuccess(); |
556 histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi", | 584 histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi", |
557 127, 1); | 585 127, 1); |
558 histogram_tester.ExpectUniqueSample( | 586 histogram_tester.ExpectUniqueSample( |
559 "EasyUnlock.AuthProximity.TransmitPowerDelta", 127, 1); | 587 "EasyUnlock.AuthProximity.TransmitPowerDelta", 127, 1); |
560 histogram_tester.ExpectUniqueSample( | 588 histogram_tester.ExpectUniqueSample( |
561 "EasyUnlock.AuthProximity.TimeSinceLastZeroRssi", | 589 "EasyUnlock.AuthProximity.TimeSinceLastZeroRssi", |
562 base::TimeDelta::FromSeconds(10).InMilliseconds(), 1); | 590 base::TimeDelta::FromSeconds(10).InMilliseconds(), 1); |
563 histogram_tester.ExpectUniqueSample( | 591 histogram_tester.ExpectUniqueSample( |
564 "EasyUnlock.AuthProximity.RemoteDeviceModelHash", | 592 "EasyUnlock.AuthProximity.RemoteDeviceModelHash", |
565 -1808066424 /* hash of "Unknown" */, 1); | 593 -1808066424 /* hash of "Unknown" */, 1); |
566 } | 594 } |
567 | 595 |
568 } // namespace proximity_auth | 596 } // namespace proximity_auth |
OLD | NEW |