multidevice_setup_service_unittest.cc 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  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 <memory>
  5. #include "ash/components/multidevice/remote_device_test_util.h"
  6. #include "ash/services/device_sync/public/cpp/fake_device_sync_client.h"
  7. #include "ash/services/device_sync/public/cpp/fake_gcm_device_info_provider.h"
  8. #include "ash/services/multidevice_setup/fake_account_status_change_delegate.h"
  9. #include "ash/services/multidevice_setup/fake_feature_state_observer.h"
  10. #include "ash/services/multidevice_setup/fake_host_status_observer.h"
  11. #include "ash/services/multidevice_setup/multidevice_setup_impl.h"
  12. #include "ash/services/multidevice_setup/multidevice_setup_service.h"
  13. #include "ash/services/multidevice_setup/public/cpp/fake_android_sms_app_helper_delegate.h"
  14. #include "ash/services/multidevice_setup/public/cpp/fake_android_sms_pairing_state_tracker.h"
  15. #include "ash/services/multidevice_setup/public/cpp/fake_auth_token_validator.h"
  16. #include "ash/services/multidevice_setup/public/cpp/fake_multidevice_setup.h"
  17. #include "ash/services/multidevice_setup/public/cpp/oobe_completion_tracker.h"
  18. #include "ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
  19. #include "base/bind.h"
  20. #include "base/callback_helpers.h"
  21. #include "base/run_loop.h"
  22. #include "base/test/task_environment.h"
  23. #include "components/sync_preferences/testing_pref_service_syncable.h"
  24. #include "mojo/public/cpp/bindings/remote.h"
  25. #include "testing/gtest/include/gtest/gtest.h"
  26. namespace ash {
  27. namespace multidevice_setup {
  28. namespace {
  29. const size_t kNumTestDevices = 3;
  30. class FakeMultiDeviceSetupFactory : public MultiDeviceSetupImpl::Factory {
  31. public:
  32. FakeMultiDeviceSetupFactory(
  33. sync_preferences::TestingPrefServiceSyncable*
  34. expected_testing_pref_service,
  35. device_sync::FakeDeviceSyncClient* expected_device_sync_client,
  36. FakeAuthTokenValidator* expected_auth_token_validator,
  37. OobeCompletionTracker* expected_oobe_completion_tracker,
  38. FakeAndroidSmsAppHelperDelegate* expected_android_sms_app_helper_delegate,
  39. FakeAndroidSmsPairingStateTracker*
  40. expected_android_sms_pairing_state_tracker,
  41. const device_sync::FakeGcmDeviceInfoProvider*
  42. expected_gcm_device_info_provider,
  43. bool expected_is_secondary_user)
  44. : expected_testing_pref_service_(expected_testing_pref_service),
  45. expected_device_sync_client_(expected_device_sync_client),
  46. expected_auth_token_validator_(expected_auth_token_validator),
  47. expected_oobe_completion_tracker_(expected_oobe_completion_tracker),
  48. expected_android_sms_app_helper_delegate_(
  49. expected_android_sms_app_helper_delegate),
  50. expected_android_sms_pairing_state_tracker_(
  51. expected_android_sms_pairing_state_tracker),
  52. expected_gcm_device_info_provider_(expected_gcm_device_info_provider),
  53. expected_is_secondary_user_(expected_is_secondary_user) {}
  54. FakeMultiDeviceSetupFactory(const FakeMultiDeviceSetupFactory&) = delete;
  55. FakeMultiDeviceSetupFactory& operator=(const FakeMultiDeviceSetupFactory&) =
  56. delete;
  57. ~FakeMultiDeviceSetupFactory() override = default;
  58. FakeMultiDeviceSetup* instance() { return instance_; }
  59. private:
  60. std::unique_ptr<MultiDeviceSetupBase> CreateInstance(
  61. PrefService* pref_service,
  62. device_sync::DeviceSyncClient* device_sync_client,
  63. AuthTokenValidator* auth_token_validator,
  64. OobeCompletionTracker* oobe_completion_tracker,
  65. AndroidSmsAppHelperDelegate* android_sms_app_helper_delegate,
  66. AndroidSmsPairingStateTracker* android_sms_pairing_state_tracker,
  67. const device_sync::GcmDeviceInfoProvider* gcm_device_info_provider,
  68. bool is_secondary_user) override {
  69. EXPECT_FALSE(instance_);
  70. EXPECT_EQ(expected_testing_pref_service_, pref_service);
  71. EXPECT_EQ(expected_device_sync_client_, device_sync_client);
  72. EXPECT_EQ(expected_auth_token_validator_, auth_token_validator);
  73. EXPECT_EQ(expected_oobe_completion_tracker_, oobe_completion_tracker);
  74. EXPECT_EQ(expected_android_sms_app_helper_delegate_,
  75. android_sms_app_helper_delegate);
  76. EXPECT_EQ(expected_android_sms_pairing_state_tracker_,
  77. android_sms_pairing_state_tracker);
  78. EXPECT_EQ(expected_gcm_device_info_provider_, gcm_device_info_provider);
  79. EXPECT_EQ(expected_is_secondary_user_, is_secondary_user);
  80. auto instance = std::make_unique<FakeMultiDeviceSetup>();
  81. instance_ = instance.get();
  82. return instance;
  83. }
  84. sync_preferences::TestingPrefServiceSyncable* expected_testing_pref_service_;
  85. device_sync::FakeDeviceSyncClient* expected_device_sync_client_;
  86. FakeAuthTokenValidator* expected_auth_token_validator_;
  87. OobeCompletionTracker* expected_oobe_completion_tracker_;
  88. FakeAndroidSmsAppHelperDelegate* expected_android_sms_app_helper_delegate_;
  89. FakeAndroidSmsPairingStateTracker*
  90. expected_android_sms_pairing_state_tracker_;
  91. const device_sync::FakeGcmDeviceInfoProvider*
  92. expected_gcm_device_info_provider_;
  93. bool expected_is_secondary_user_;
  94. FakeMultiDeviceSetup* instance_ = nullptr;
  95. };
  96. } // namespace
  97. class MultiDeviceSetupServiceTest : public testing::Test {
  98. public:
  99. MultiDeviceSetupServiceTest(const MultiDeviceSetupServiceTest&) = delete;
  100. MultiDeviceSetupServiceTest& operator=(const MultiDeviceSetupServiceTest&) =
  101. delete;
  102. protected:
  103. MultiDeviceSetupServiceTest()
  104. : test_devices_(
  105. multidevice::CreateRemoteDeviceRefListForTest(kNumTestDevices)) {}
  106. ~MultiDeviceSetupServiceTest() override = default;
  107. // testing::Test:
  108. void SetUp() override {
  109. test_pref_service_ =
  110. std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
  111. fake_device_sync_client_ =
  112. std::make_unique<device_sync::FakeDeviceSyncClient>();
  113. fake_auth_token_validator_ = std::make_unique<FakeAuthTokenValidator>();
  114. fake_oobe_completion_tracker_ = std::make_unique<OobeCompletionTracker>();
  115. fake_android_sms_app_helper_delegate_ =
  116. std::make_unique<FakeAndroidSmsAppHelperDelegate>();
  117. fake_android_sms_pairing_state_tracker_ =
  118. std::make_unique<FakeAndroidSmsPairingStateTracker>();
  119. fake_gcm_device_info_provider_ =
  120. std::make_unique<device_sync::FakeGcmDeviceInfoProvider>(
  121. cryptauth::GcmDeviceInfo());
  122. fake_multidevice_setup_factory_ =
  123. std::make_unique<FakeMultiDeviceSetupFactory>(
  124. test_pref_service_.get(), fake_device_sync_client_.get(),
  125. fake_auth_token_validator_.get(),
  126. fake_oobe_completion_tracker_.get(),
  127. fake_android_sms_app_helper_delegate_.get(),
  128. fake_android_sms_pairing_state_tracker_.get(),
  129. fake_gcm_device_info_provider_.get(), is_secondary_user_);
  130. MultiDeviceSetupImpl::Factory::SetFactoryForTesting(
  131. fake_multidevice_setup_factory_.get());
  132. service_ = std::make_unique<MultiDeviceSetupService>(
  133. test_pref_service_.get(), fake_device_sync_client_.get(),
  134. fake_auth_token_validator_.get(), fake_oobe_completion_tracker_.get(),
  135. fake_android_sms_app_helper_delegate_.get(),
  136. fake_android_sms_pairing_state_tracker_.get(),
  137. fake_gcm_device_info_provider_.get(), is_secondary_user_);
  138. service_->BindMultiDeviceSetup(
  139. multidevice_setup_remote_.BindNewPipeAndPassReceiver());
  140. service_->BindPrivilegedHostDeviceSetter(
  141. privileged_host_device_setter_remote_.BindNewPipeAndPassReceiver());
  142. }
  143. void TearDown() override {
  144. MultiDeviceSetupImpl::Factory::SetFactoryForTesting(nullptr);
  145. }
  146. void CallTriggerEventForDebuggingBeforeInitializationComplete(
  147. mojom::EventTypeForDebugging type) {
  148. EXPECT_FALSE(last_debug_event_success_);
  149. base::RunLoop run_loop;
  150. multidevice_setup_remote_->TriggerEventForDebugging(
  151. type,
  152. base::BindOnce(&MultiDeviceSetupServiceTest::OnDebugEventTriggered,
  153. base::Unretained(this), run_loop.QuitClosure()));
  154. run_loop.Run();
  155. // Always expected to fail before initialization completes.
  156. EXPECT_FALSE(*last_debug_event_success_);
  157. last_debug_event_success_.reset();
  158. }
  159. void FinishInitialization() {
  160. EXPECT_FALSE(fake_multidevice_setup());
  161. fake_device_sync_client_->set_local_device_metadata(test_devices_[0]);
  162. fake_device_sync_client_->NotifyReady();
  163. EXPECT_TRUE(fake_multidevice_setup());
  164. }
  165. FakeMultiDeviceSetup* fake_multidevice_setup() {
  166. return fake_multidevice_setup_factory_->instance();
  167. }
  168. mojo::Remote<mojom::MultiDeviceSetup>& multidevice_setup_remote() {
  169. return multidevice_setup_remote_;
  170. }
  171. mojo::Remote<mojom::PrivilegedHostDeviceSetter>&
  172. privileged_host_device_setter_remote() {
  173. return privileged_host_device_setter_remote_;
  174. }
  175. private:
  176. void OnDebugEventTriggered(base::OnceClosure quit_closure, bool success) {
  177. last_debug_event_success_ = success;
  178. std::move(quit_closure).Run();
  179. }
  180. base::test::TaskEnvironment task_environment_;
  181. const multidevice::RemoteDeviceRefList test_devices_;
  182. std::unique_ptr<sync_preferences::TestingPrefServiceSyncable>
  183. test_pref_service_;
  184. std::unique_ptr<device_sync::FakeDeviceSyncClient> fake_device_sync_client_;
  185. std::unique_ptr<FakeAuthTokenValidator> fake_auth_token_validator_;
  186. std::unique_ptr<OobeCompletionTracker> fake_oobe_completion_tracker_;
  187. std::unique_ptr<FakeAndroidSmsAppHelperDelegate>
  188. fake_android_sms_app_helper_delegate_;
  189. std::unique_ptr<FakeAndroidSmsPairingStateTracker>
  190. fake_android_sms_pairing_state_tracker_;
  191. std::unique_ptr<device_sync::FakeGcmDeviceInfoProvider>
  192. fake_gcm_device_info_provider_;
  193. bool is_secondary_user_ = false;
  194. std::unique_ptr<FakeMultiDeviceSetupFactory> fake_multidevice_setup_factory_;
  195. std::unique_ptr<MultiDeviceSetupService> service_;
  196. absl::optional<bool> last_debug_event_success_;
  197. mojo::Remote<mojom::MultiDeviceSetup> multidevice_setup_remote_;
  198. mojo::Remote<mojom::PrivilegedHostDeviceSetter>
  199. privileged_host_device_setter_remote_;
  200. };
  201. TEST_F(MultiDeviceSetupServiceTest,
  202. TriggerEventForDebuggingBeforeInitialization) {
  203. CallTriggerEventForDebuggingBeforeInitializationComplete(
  204. mojom::EventTypeForDebugging::kNewUserPotentialHostExists);
  205. CallTriggerEventForDebuggingBeforeInitializationComplete(
  206. mojom::EventTypeForDebugging::kExistingUserConnectedHostSwitched);
  207. CallTriggerEventForDebuggingBeforeInitializationComplete(
  208. mojom::EventTypeForDebugging::kExistingUserNewChromebookAdded);
  209. }
  210. TEST_F(MultiDeviceSetupServiceTest, CallFunctionsBeforeInitialization) {
  211. // SetAccountStatusChangeDelegate().
  212. auto fake_account_status_change_delegate =
  213. std::make_unique<FakeAccountStatusChangeDelegate>();
  214. multidevice_setup_remote()->SetAccountStatusChangeDelegate(
  215. fake_account_status_change_delegate->GenerateRemote());
  216. multidevice_setup_remote().FlushForTesting();
  217. // AddHostStatusObserver().
  218. auto fake_host_status_observer = std::make_unique<FakeHostStatusObserver>();
  219. multidevice_setup_remote()->AddHostStatusObserver(
  220. fake_host_status_observer->GenerateRemote());
  221. multidevice_setup_remote().FlushForTesting();
  222. // AddFeatureStateObserver().
  223. auto fake_feature_state_observer =
  224. std::make_unique<FakeFeatureStateObserver>();
  225. multidevice_setup_remote()->AddFeatureStateObserver(
  226. fake_feature_state_observer->GenerateRemote());
  227. multidevice_setup_remote().FlushForTesting();
  228. // GetEligibleHostDevices().
  229. multidevice_setup_remote()->GetEligibleHostDevices(base::DoNothing());
  230. multidevice_setup_remote().FlushForTesting();
  231. // GetHostStatus().
  232. multidevice_setup_remote()->GetHostStatus(base::DoNothing());
  233. multidevice_setup_remote().FlushForTesting();
  234. // SetFeatureEnabledState().
  235. multidevice_setup_remote()->SetFeatureEnabledState(
  236. mojom::Feature::kBetterTogetherSuite, true /* enabled */, "authToken",
  237. base::DoNothing());
  238. multidevice_setup_remote().FlushForTesting();
  239. // GetFeatureStates().
  240. multidevice_setup_remote()->GetFeatureStates(base::DoNothing());
  241. multidevice_setup_remote().FlushForTesting();
  242. // RetrySetHostNow().
  243. multidevice_setup_remote()->RetrySetHostNow(base::DoNothing());
  244. multidevice_setup_remote().FlushForTesting();
  245. // None of these requests should have been processed yet, since initialization
  246. // was not complete.
  247. EXPECT_FALSE(fake_multidevice_setup());
  248. // Finish initialization; all of the pending calls should have been forwarded.
  249. FinishInitialization();
  250. EXPECT_TRUE(fake_multidevice_setup()->delegate());
  251. EXPECT_TRUE(fake_multidevice_setup()->HasAtLeastOneHostStatusObserver());
  252. EXPECT_TRUE(fake_multidevice_setup()->HasAtLeastOneFeatureStateObserver());
  253. EXPECT_EQ(1u, fake_multidevice_setup()->get_eligible_hosts_args().size());
  254. EXPECT_EQ(1u, fake_multidevice_setup()->get_host_args().size());
  255. EXPECT_EQ(1u, fake_multidevice_setup()->set_feature_enabled_args().size());
  256. EXPECT_EQ(1u, fake_multidevice_setup()->get_feature_states_args().size());
  257. EXPECT_EQ(1u, fake_multidevice_setup()->retry_set_host_now_args().size());
  258. }
  259. TEST_F(MultiDeviceSetupServiceTest, SetThenRemoveBeforeInitialization) {
  260. multidevice_setup_remote()->SetHostDevice("id1", "authToken",
  261. base::DoNothing());
  262. multidevice_setup_remote().FlushForTesting();
  263. privileged_host_device_setter_remote()->SetHostDevice("id2",
  264. base::DoNothing());
  265. privileged_host_device_setter_remote().FlushForTesting();
  266. multidevice_setup_remote()->RemoveHostDevice();
  267. multidevice_setup_remote().FlushForTesting();
  268. EXPECT_FALSE(fake_multidevice_setup());
  269. // Finish initialization; since the SetHostDevice() call was followed by a
  270. // RemoveHostDevice() call, only the RemoveHostDevice() call should have been
  271. // forwarded.
  272. FinishInitialization();
  273. EXPECT_TRUE(fake_multidevice_setup()->set_host_args().empty());
  274. EXPECT_TRUE(fake_multidevice_setup()->set_host_without_auth_args().empty());
  275. EXPECT_EQ(1u, fake_multidevice_setup()->num_remove_host_calls());
  276. }
  277. TEST_F(MultiDeviceSetupServiceTest, RemoveThenSetThenSetBeforeInitialization) {
  278. multidevice_setup_remote()->RemoveHostDevice();
  279. multidevice_setup_remote().FlushForTesting();
  280. privileged_host_device_setter_remote()->SetHostDevice("id1",
  281. base::DoNothing());
  282. privileged_host_device_setter_remote().FlushForTesting();
  283. multidevice_setup_remote()->SetHostDevice("id2", "authToken2",
  284. base::DoNothing());
  285. multidevice_setup_remote().FlushForTesting();
  286. multidevice_setup_remote()->SetHostDevice("id3", "authToken3",
  287. base::DoNothing());
  288. multidevice_setup_remote().FlushForTesting();
  289. EXPECT_FALSE(fake_multidevice_setup());
  290. // Finish initialization; only the second SetHostDevice() call should have
  291. // been forwarded.
  292. FinishInitialization();
  293. EXPECT_EQ(0u, fake_multidevice_setup()->num_remove_host_calls());
  294. EXPECT_TRUE(fake_multidevice_setup()->set_host_without_auth_args().empty());
  295. EXPECT_EQ(1u, fake_multidevice_setup()->set_host_args().size());
  296. EXPECT_EQ("id3", std::get<0>(fake_multidevice_setup()->set_host_args()[0]));
  297. EXPECT_EQ("authToken3",
  298. std::get<1>(fake_multidevice_setup()->set_host_args()[0]));
  299. }
  300. TEST_F(MultiDeviceSetupServiceTest,
  301. RemoveThenSetThenSetBeforeInitialization_NoAuthToken) {
  302. multidevice_setup_remote()->RemoveHostDevice();
  303. multidevice_setup_remote().FlushForTesting();
  304. multidevice_setup_remote()->SetHostDevice("id1", "authToken1",
  305. base::DoNothing());
  306. multidevice_setup_remote().FlushForTesting();
  307. multidevice_setup_remote()->SetHostDevice("id2", "authToken2",
  308. base::DoNothing());
  309. multidevice_setup_remote().FlushForTesting();
  310. privileged_host_device_setter_remote()->SetHostDevice("id3",
  311. base::DoNothing());
  312. privileged_host_device_setter_remote().FlushForTesting();
  313. EXPECT_FALSE(fake_multidevice_setup());
  314. // Finish initialization; only the second SetHostDevice() call should have
  315. // been forwarded.
  316. FinishInitialization();
  317. EXPECT_EQ(0u, fake_multidevice_setup()->num_remove_host_calls());
  318. EXPECT_TRUE(fake_multidevice_setup()->set_host_args().empty());
  319. EXPECT_EQ(1u, fake_multidevice_setup()->set_host_without_auth_args().size());
  320. EXPECT_EQ("id3",
  321. fake_multidevice_setup()->set_host_without_auth_args()[0].first);
  322. }
  323. TEST_F(MultiDeviceSetupServiceTest, FinishInitializationFirst) {
  324. // Finish initialization before calling anything; this should result in
  325. // the calls being forwarded immediately.
  326. FinishInitialization();
  327. // SetAccountStatusChangeDelegate().
  328. auto fake_account_status_change_delegate =
  329. std::make_unique<FakeAccountStatusChangeDelegate>();
  330. multidevice_setup_remote()->SetAccountStatusChangeDelegate(
  331. fake_account_status_change_delegate->GenerateRemote());
  332. multidevice_setup_remote().FlushForTesting();
  333. EXPECT_TRUE(fake_multidevice_setup()->delegate());
  334. // AddHostStatusObserver().
  335. auto fake_host_status_observer = std::make_unique<FakeHostStatusObserver>();
  336. multidevice_setup_remote()->AddHostStatusObserver(
  337. fake_host_status_observer->GenerateRemote());
  338. multidevice_setup_remote().FlushForTesting();
  339. EXPECT_TRUE(fake_multidevice_setup()->HasAtLeastOneHostStatusObserver());
  340. // AddFeatureStateObserver().
  341. auto fake_feature_state_observer =
  342. std::make_unique<FakeFeatureStateObserver>();
  343. multidevice_setup_remote()->AddFeatureStateObserver(
  344. fake_feature_state_observer->GenerateRemote());
  345. multidevice_setup_remote().FlushForTesting();
  346. EXPECT_TRUE(fake_multidevice_setup()->HasAtLeastOneFeatureStateObserver());
  347. // GetEligibleHostDevices().
  348. multidevice_setup_remote()->GetEligibleHostDevices(base::DoNothing());
  349. multidevice_setup_remote().FlushForTesting();
  350. EXPECT_EQ(1u, fake_multidevice_setup()->get_eligible_hosts_args().size());
  351. // SetHostDevice().
  352. multidevice_setup_remote()->SetHostDevice("id", "authToken",
  353. base::DoNothing());
  354. multidevice_setup_remote().FlushForTesting();
  355. EXPECT_EQ(1u, fake_multidevice_setup()->set_host_args().size());
  356. // RemoveHostDevice().
  357. multidevice_setup_remote()->RemoveHostDevice();
  358. multidevice_setup_remote().FlushForTesting();
  359. EXPECT_EQ(1u, fake_multidevice_setup()->num_remove_host_calls());
  360. // GetHostStatus().
  361. multidevice_setup_remote()->GetHostStatus(base::DoNothing());
  362. multidevice_setup_remote().FlushForTesting();
  363. EXPECT_EQ(1u, fake_multidevice_setup()->get_host_args().size());
  364. // SetFeatureEnabledState().
  365. multidevice_setup_remote()->SetFeatureEnabledState(
  366. mojom::Feature::kBetterTogetherSuite, true /* enabled */, "authToken",
  367. base::DoNothing());
  368. multidevice_setup_remote().FlushForTesting();
  369. EXPECT_EQ(1u, fake_multidevice_setup()->set_feature_enabled_args().size());
  370. // GetFeatureStates().
  371. multidevice_setup_remote()->GetFeatureStates(base::DoNothing());
  372. multidevice_setup_remote().FlushForTesting();
  373. EXPECT_EQ(1u, fake_multidevice_setup()->get_feature_states_args().size());
  374. // RetrySetHostNow().
  375. multidevice_setup_remote()->RetrySetHostNow(base::DoNothing());
  376. multidevice_setup_remote().FlushForTesting();
  377. EXPECT_EQ(1u, fake_multidevice_setup()->retry_set_host_now_args().size());
  378. // SetHostDevice(), without an auth token.
  379. privileged_host_device_setter_remote()->SetHostDevice("id",
  380. base::DoNothing());
  381. privileged_host_device_setter_remote().FlushForTesting();
  382. EXPECT_EQ(1u, fake_multidevice_setup()->set_host_without_auth_args().size());
  383. }
  384. } // namespace multidevice_setup
  385. } // namespace ash