host_status_provider_impl_unittest.cc 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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 "ash/services/multidevice_setup/host_status_provider_impl.h"
  5. #include <memory>
  6. #include "ash/components/multidevice/remote_device_test_util.h"
  7. #include "ash/services/device_sync/public/cpp/fake_device_sync_client.h"
  8. #include "ash/services/multidevice_setup/fake_eligible_host_devices_provider.h"
  9. #include "ash/services/multidevice_setup/fake_host_backend_delegate.h"
  10. #include "ash/services/multidevice_setup/fake_host_status_provider.h"
  11. #include "ash/services/multidevice_setup/fake_host_verifier.h"
  12. #include "ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
  13. #include "base/test/task_environment.h"
  14. #include "testing/gtest/include/gtest/gtest.h"
  15. namespace ash {
  16. namespace multidevice_setup {
  17. namespace {
  18. const size_t kNumTestDevices = 5;
  19. } // namespace
  20. class MultiDeviceSetupHostStatusProviderImplTest : public testing::Test {
  21. public:
  22. MultiDeviceSetupHostStatusProviderImplTest(
  23. const MultiDeviceSetupHostStatusProviderImplTest&) = delete;
  24. MultiDeviceSetupHostStatusProviderImplTest& operator=(
  25. const MultiDeviceSetupHostStatusProviderImplTest&) = delete;
  26. protected:
  27. MultiDeviceSetupHostStatusProviderImplTest()
  28. : test_devices_(
  29. multidevice::CreateRemoteDeviceRefListForTest(kNumTestDevices)) {}
  30. ~MultiDeviceSetupHostStatusProviderImplTest() override = default;
  31. // testing::Test:
  32. void SetUp() override {
  33. fake_eligible_host_devices_provider_ =
  34. std::make_unique<FakeEligibleHostDevicesProvider>();
  35. fake_host_backend_delegate_ = std::make_unique<FakeHostBackendDelegate>();
  36. fake_host_verifier_ = std::make_unique<FakeHostVerifier>();
  37. fake_device_sync_client_ =
  38. std::make_unique<device_sync::FakeDeviceSyncClient>();
  39. fake_device_sync_client_->set_synced_devices(test_devices_);
  40. host_status_provider_ = HostStatusProviderImpl::Factory::Create(
  41. fake_eligible_host_devices_provider_.get(),
  42. fake_host_backend_delegate_.get(), fake_host_verifier_.get(),
  43. fake_device_sync_client_.get());
  44. fake_observer_ = std::make_unique<FakeHostStatusProviderObserver>();
  45. host_status_provider_->AddObserver(fake_observer_.get());
  46. }
  47. void TearDown() override {
  48. host_status_provider_->RemoveObserver(fake_observer_.get());
  49. }
  50. void MakeDevicesEligibleHosts() {
  51. fake_eligible_host_devices_provider_->set_eligible_host_devices(
  52. test_devices_);
  53. fake_device_sync_client_->NotifyNewDevicesSynced();
  54. }
  55. // Verifies the current status and, if |expected_observer_index| is non-null,
  56. // verifies that the observer received that update at the specified index.
  57. void VerifyCurrentStatus(
  58. mojom::HostStatus host_status,
  59. const absl::optional<multidevice::RemoteDeviceRef>& host_device,
  60. const absl::optional<size_t>& expected_observer_index) {
  61. HostStatusProvider::HostStatusWithDevice status_with_device(host_status,
  62. host_device);
  63. EXPECT_EQ(status_with_device, host_status_provider_->GetHostWithStatus());
  64. if (!expected_observer_index)
  65. return;
  66. EXPECT_EQ(status_with_device,
  67. fake_observer_->host_status_updates()[*expected_observer_index]);
  68. }
  69. size_t GetNumChangeEvents() {
  70. return fake_observer_->host_status_updates().size();
  71. }
  72. const multidevice::RemoteDeviceRefList& test_devices() const {
  73. return test_devices_;
  74. }
  75. FakeHostBackendDelegate* fake_host_backend_delegate() {
  76. return fake_host_backend_delegate_.get();
  77. }
  78. FakeHostVerifier* fake_host_verifier() { return fake_host_verifier_.get(); }
  79. device_sync::FakeDeviceSyncClient* fake_device_sync_client() {
  80. return fake_device_sync_client_.get();
  81. }
  82. private:
  83. base::test::TaskEnvironment task_environment_;
  84. multidevice::RemoteDeviceRefList test_devices_;
  85. std::unique_ptr<FakeEligibleHostDevicesProvider>
  86. fake_eligible_host_devices_provider_;
  87. std::unique_ptr<FakeHostBackendDelegate> fake_host_backend_delegate_;
  88. std::unique_ptr<FakeHostVerifier> fake_host_verifier_;
  89. std::unique_ptr<device_sync::FakeDeviceSyncClient> fake_device_sync_client_;
  90. std::unique_ptr<FakeHostStatusProviderObserver> fake_observer_;
  91. std::unique_ptr<HostStatusProvider> host_status_provider_;
  92. };
  93. TEST_F(MultiDeviceSetupHostStatusProviderImplTest,
  94. IncreaseHostState_ThenDecrease) {
  95. VerifyCurrentStatus(mojom::HostStatus::kNoEligibleHosts,
  96. absl::nullopt /* host_device */,
  97. absl::nullopt /* expected_observer_index */);
  98. // Add eligible hosts to the account and verify that the status has been
  99. // updated accordingly.
  100. MakeDevicesEligibleHosts();
  101. EXPECT_EQ(1u, GetNumChangeEvents());
  102. VerifyCurrentStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
  103. absl::nullopt /* host_device */,
  104. 0u /* expected_observer_index */);
  105. // Make a request to set the host, but do not complete it yet.
  106. fake_host_backend_delegate()->AttemptToSetMultiDeviceHostOnBackend(
  107. test_devices()[0]);
  108. EXPECT_EQ(2u, GetNumChangeEvents());
  109. VerifyCurrentStatus(
  110. mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation,
  111. test_devices()[0] /* host_device */, 1u /* expected_observer_index */);
  112. // Successfully set the host on the back-end.
  113. fake_host_backend_delegate()->NotifyHostChangedOnBackend(test_devices()[0]);
  114. EXPECT_EQ(3u, GetNumChangeEvents());
  115. VerifyCurrentStatus(mojom::HostStatus::kHostSetButNotYetVerified,
  116. test_devices()[0] /* host_device */,
  117. 2u /* expected_observer_index */);
  118. // Verify the device.
  119. fake_host_verifier()->set_is_host_verified(true);
  120. fake_host_verifier()->NotifyHostVerified();
  121. EXPECT_EQ(4u, GetNumChangeEvents());
  122. VerifyCurrentStatus(mojom::HostStatus::kHostVerified,
  123. test_devices()[0] /* host_device */,
  124. 3u /* expected_observer_index */);
  125. }
  126. TEST_F(MultiDeviceSetupHostStatusProviderImplTest,
  127. OnNewDevicesSyncedNotifiesHostStatusChange) {
  128. MakeDevicesEligibleHosts();
  129. EXPECT_EQ(1u, GetNumChangeEvents());
  130. fake_device_sync_client()->NotifyNewDevicesSynced();
  131. EXPECT_EQ(2u, GetNumChangeEvents());
  132. }
  133. TEST_F(MultiDeviceSetupHostStatusProviderImplTest, SetHostThenForget) {
  134. MakeDevicesEligibleHosts();
  135. EXPECT_EQ(1u, GetNumChangeEvents());
  136. VerifyCurrentStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
  137. absl::nullopt /* host_device */,
  138. 0u /* expected_observer_index */);
  139. // Without first attempting to set the host on the back-end, set the device.
  140. // This simulates the case where the host is set by another device (e.g., if
  141. // another Chromebook completes the setup flow).
  142. fake_host_backend_delegate()->NotifyHostChangedOnBackend(test_devices()[0]);
  143. EXPECT_EQ(2u, GetNumChangeEvents());
  144. VerifyCurrentStatus(mojom::HostStatus::kHostSetButNotYetVerified,
  145. test_devices()[0] /* host_device */,
  146. 1u /* expected_observer_index */);
  147. // Now, start an attempt to remove the device on the back-end. This simulates
  148. // the user clicking "forget device" in settings.
  149. fake_host_backend_delegate()->AttemptToSetMultiDeviceHostOnBackend(
  150. absl::nullopt /* host_device */);
  151. EXPECT_EQ(3u, GetNumChangeEvents());
  152. VerifyCurrentStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
  153. absl::nullopt /* host_device */,
  154. 2u /* expected_observer_index */);
  155. // Complete the pending back-end request. In this case, the status should stay
  156. // the same, so the observer should not have received an additional event.
  157. fake_host_backend_delegate()->NotifyHostChangedOnBackend(
  158. absl::nullopt /* host_device_on_backend */);
  159. EXPECT_EQ(3u, GetNumChangeEvents());
  160. }
  161. } // namespace multidevice_setup
  162. } // namespace ash