fake_fido_discovery_unittest.cc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "device/fido/fake_fido_discovery.h"
  5. #include <utility>
  6. #include "base/test/bind.h"
  7. #include "base/test/task_environment.h"
  8. #include "base/threading/thread_task_runner_handle.h"
  9. #include "build/build_config.h"
  10. #include "device/fido/fido_discovery_factory.h"
  11. #include "device/fido/fido_test_data.h"
  12. #include "device/fido/mock_fido_device.h"
  13. #include "device/fido/mock_fido_discovery_observer.h"
  14. #include "testing/gmock/include/gmock/gmock.h"
  15. #include "testing/gtest/include/gtest/gtest.h"
  16. namespace device {
  17. namespace test {
  18. using ::testing::_;
  19. class FakeFidoDiscoveryTest : public ::testing::Test {
  20. public:
  21. FakeFidoDiscoveryTest() = default;
  22. FakeFidoDiscoveryTest(const FakeFidoDiscoveryTest&) = delete;
  23. FakeFidoDiscoveryTest& operator=(const FakeFidoDiscoveryTest&) = delete;
  24. ~FakeFidoDiscoveryTest() override = default;
  25. protected:
  26. FakeFidoDiscoveryFactory fake_fido_discovery_factory_;
  27. base::test::TaskEnvironment task_environment_;
  28. };
  29. using FakeFidoDiscoveryFactoryTest = FakeFidoDiscoveryTest;
  30. TEST_F(FakeFidoDiscoveryTest, Transport) {
  31. FakeFidoDiscovery discovery_hid(
  32. FidoTransportProtocol::kUsbHumanInterfaceDevice);
  33. EXPECT_EQ(FidoTransportProtocol::kUsbHumanInterfaceDevice,
  34. discovery_hid.transport());
  35. }
  36. TEST_F(FakeFidoDiscoveryTest, InitialState) {
  37. FakeFidoDiscovery discovery(FidoTransportProtocol::kUsbHumanInterfaceDevice);
  38. ASSERT_FALSE(discovery.is_running());
  39. ASSERT_FALSE(discovery.is_start_requested());
  40. }
  41. TEST_F(FakeFidoDiscoveryTest, StartDiscovery) {
  42. FakeFidoDiscovery discovery(FidoTransportProtocol::kUsbHumanInterfaceDevice);
  43. MockFidoDiscoveryObserver observer;
  44. discovery.set_observer(&observer);
  45. discovery.Start();
  46. ASSERT_TRUE(discovery.is_start_requested());
  47. ASSERT_FALSE(discovery.is_running());
  48. EXPECT_CALL(observer, DiscoveryStarted(&discovery, true,
  49. std::vector<FidoAuthenticator*>()));
  50. discovery.WaitForCallToStartAndSimulateSuccess();
  51. ASSERT_TRUE(discovery.is_running());
  52. ASSERT_TRUE(discovery.is_start_requested());
  53. }
  54. TEST_F(FakeFidoDiscoveryTest, WaitThenStartStopDiscovery) {
  55. FakeFidoDiscovery discovery(FidoTransportProtocol::kUsbHumanInterfaceDevice);
  56. MockFidoDiscoveryObserver observer;
  57. discovery.set_observer(&observer);
  58. base::ThreadTaskRunnerHandle::Get()->PostTask(
  59. FROM_HERE, base::BindLambdaForTesting([&]() { discovery.Start(); }));
  60. discovery.WaitForCallToStart();
  61. ASSERT_FALSE(discovery.is_running());
  62. ASSERT_TRUE(discovery.is_start_requested());
  63. EXPECT_CALL(observer, DiscoveryStarted(&discovery, true,
  64. std::vector<FidoAuthenticator*>()));
  65. discovery.SimulateStarted(true);
  66. ASSERT_TRUE(discovery.is_running());
  67. ASSERT_TRUE(discovery.is_start_requested());
  68. }
  69. // Starting discovery and failing: instance stays in "not running" state
  70. TEST_F(FakeFidoDiscoveryTest, StartFail) {
  71. FakeFidoDiscovery discovery(FidoTransportProtocol::kUsbHumanInterfaceDevice);
  72. MockFidoDiscoveryObserver observer;
  73. discovery.set_observer(&observer);
  74. discovery.Start();
  75. ASSERT_FALSE(discovery.is_running());
  76. ASSERT_TRUE(discovery.is_start_requested());
  77. EXPECT_CALL(observer, DiscoveryStarted(&discovery, false,
  78. std::vector<FidoAuthenticator*>()));
  79. discovery.SimulateStarted(false);
  80. ASSERT_FALSE(discovery.is_running());
  81. ASSERT_TRUE(discovery.is_start_requested());
  82. }
  83. // Adding device is possible both before and after discovery actually starts.
  84. TEST_F(FakeFidoDiscoveryTest, AddDevice) {
  85. FakeFidoDiscovery discovery(FidoTransportProtocol::kUsbHumanInterfaceDevice);
  86. MockFidoDiscoveryObserver observer;
  87. discovery.set_observer(&observer);
  88. discovery.Start();
  89. auto device0 = std::make_unique<MockFidoDevice>();
  90. EXPECT_CALL(*device0, GetId()).WillOnce(::testing::Return("device0"));
  91. base::RunLoop device0_done;
  92. discovery.AddDevice(std::move(device0));
  93. EXPECT_CALL(observer, DiscoveryStarted(&discovery, true, testing::SizeIs(1)))
  94. .WillOnce(testing::InvokeWithoutArgs(
  95. [&device0_done]() { device0_done.Quit(); }));
  96. discovery.SimulateStarted(true);
  97. device0_done.Run();
  98. ::testing::Mock::VerifyAndClearExpectations(&observer);
  99. auto device1 = std::make_unique<MockFidoDevice>();
  100. EXPECT_CALL(*device1, GetId()).WillOnce(::testing::Return("device1"));
  101. base::RunLoop device1_done;
  102. EXPECT_CALL(observer, AuthenticatorAdded(&discovery, _))
  103. .WillOnce(testing::InvokeWithoutArgs(
  104. [&device1_done]() { device1_done.Quit(); }));
  105. discovery.AddDevice(std::move(device1));
  106. device1_done.Run();
  107. ::testing::Mock::VerifyAndClearExpectations(&observer);
  108. }
  109. #if !BUILDFLAG(IS_ANDROID)
  110. TEST_F(FakeFidoDiscoveryFactoryTest, ForgesUsbFactoryFunction) {
  111. auto* injected_fake_discovery =
  112. fake_fido_discovery_factory_.ForgeNextHidDiscovery();
  113. ASSERT_EQ(FidoTransportProtocol::kUsbHumanInterfaceDevice,
  114. injected_fake_discovery->transport());
  115. std::vector<std::unique_ptr<FidoDiscoveryBase>> produced_discoveries =
  116. fake_fido_discovery_factory_.Create(
  117. FidoTransportProtocol::kUsbHumanInterfaceDevice);
  118. ASSERT_EQ(produced_discoveries.size(), 1u);
  119. EXPECT_EQ(injected_fake_discovery, produced_discoveries[0].get());
  120. }
  121. #endif
  122. } // namespace test
  123. } // namespace device