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
5 #include <algorithm>
6 #include <memory>
7 #include <vector>
8
9 #include "base/bind.h"
10 #include "base/run_loop.h"
11 #include "base/test/scoped_feature_list.h"
12 #include "base/test/task_environment.h"
13 #include "chromeos/components/multidevice/remote_device_test_util.h"
14 #include "chromeos/constants/chromeos_features.h"
15 #include "chromeos/services/device_sync/public/cpp/fake_device_sync_client.h"
16 #include "chromeos/services/device_sync/public/cpp/fake_gcm_device_info_provider.h"
17 #include "chromeos/services/multidevice_setup/account_status_change_delegate_notifier_impl.h"
18 #include "chromeos/services/multidevice_setup/android_sms_app_installing_status_observer.h"
19 #include "chromeos/services/multidevice_setup/device_reenroller.h"
20 #include "chromeos/services/multidevice_setup/eligible_host_devices_provider_impl.h"
21 #include "chromeos/services/multidevice_setup/fake_account_status_change_delegate.h"
22 #include "chromeos/services/multidevice_setup/fake_account_status_change_delegate_notifier.h"
23 #include "chromeos/services/multidevice_setup/fake_eligible_host_devices_provider.h"
24 #include "chromeos/services/multidevice_setup/fake_feature_state_manager.h"
25 #include "chromeos/services/multidevice_setup/fake_feature_state_observer.h"
26 #include "chromeos/services/multidevice_setup/fake_host_backend_delegate.h"
27 #include "chromeos/services/multidevice_setup/fake_host_device_timestamp_manager.h"
28 #include "chromeos/services/multidevice_setup/fake_host_status_observer.h"
29 #include "chromeos/services/multidevice_setup/fake_host_status_provider.h"
30 #include "chromeos/services/multidevice_setup/fake_host_verifier.h"
31 #include "chromeos/services/multidevice_setup/fake_wifi_sync_feature_manager.h"
32 #include "chromeos/services/multidevice_setup/feature_state_manager_impl.h"
33 #include "chromeos/services/multidevice_setup/grandfathered_easy_unlock_host_disabler.h"
34 #include "chromeos/services/multidevice_setup/host_backend_delegate_impl.h"
35 #include "chromeos/services/multidevice_setup/host_device_timestamp_manager_impl.h"
36 #include "chromeos/services/multidevice_setup/host_status_provider_impl.h"
37 #include "chromeos/services/multidevice_setup/host_verifier_impl.h"
38 #include "chromeos/services/multidevice_setup/multidevice_setup_impl.h"
39 #include "chromeos/services/multidevice_setup/public/cpp/fake_android_sms_app_helper_delegate.h"
40 #include "chromeos/services/multidevice_setup/public/cpp/fake_android_sms_pairing_state_tracker.h"
41 #include "chromeos/services/multidevice_setup/public/cpp/fake_auth_token_validator.h"
42 #include "chromeos/services/multidevice_setup/public/cpp/oobe_completion_tracker.h"
43 #include "chromeos/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
44 #include "chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl.h"
45 #include "components/sync_preferences/testing_pref_service_syncable.h"
46 #include "testing/gtest/include/gtest/gtest.h"
47
48 namespace chromeos {
49
50 namespace multidevice_setup {
51
52 namespace {
53
54 const size_t kNumTestDevices = 3;
55
56 const char kValidAuthToken[] = "validAuthToken";
57
RefListToRawList(const multidevice::RemoteDeviceRefList & ref_list)58 multidevice::RemoteDeviceList RefListToRawList(
59 const multidevice::RemoteDeviceRefList& ref_list) {
60 multidevice::RemoteDeviceList raw_list;
61 std::transform(ref_list.begin(), ref_list.end(), std::back_inserter(raw_list),
62 [](const multidevice::RemoteDeviceRef ref) {
63 return *GetMutableRemoteDevice(ref);
64 });
65 return raw_list;
66 }
67
RefToRaw(const base::Optional<multidevice::RemoteDeviceRef> & ref)68 base::Optional<multidevice::RemoteDevice> RefToRaw(
69 const base::Optional<multidevice::RemoteDeviceRef>& ref) {
70 if (!ref)
71 return base::nullopt;
72
73 return *GetMutableRemoteDevice(*ref);
74 }
75
76 class FakeEligibleHostDevicesProviderFactory
77 : public EligibleHostDevicesProviderImpl::Factory {
78 public:
FakeEligibleHostDevicesProviderFactory(device_sync::FakeDeviceSyncClient * expected_device_sync_client)79 FakeEligibleHostDevicesProviderFactory(
80 device_sync::FakeDeviceSyncClient* expected_device_sync_client)
81 : expected_device_sync_client_(expected_device_sync_client) {}
82
83 ~FakeEligibleHostDevicesProviderFactory() override = default;
84
instance()85 FakeEligibleHostDevicesProvider* instance() { return instance_; }
86
87 private:
88 // EligibleHostDevicesProviderImpl::Factory:
CreateInstance(device_sync::DeviceSyncClient * device_sync_client)89 std::unique_ptr<EligibleHostDevicesProvider> CreateInstance(
90 device_sync::DeviceSyncClient* device_sync_client) override {
91 EXPECT_FALSE(instance_);
92 EXPECT_EQ(expected_device_sync_client_, device_sync_client);
93
94 auto instance = std::make_unique<FakeEligibleHostDevicesProvider>();
95 instance_ = instance.get();
96 return instance;
97 }
98
99 device_sync::FakeDeviceSyncClient* expected_device_sync_client_;
100
101 FakeEligibleHostDevicesProvider* instance_ = nullptr;
102
103 DISALLOW_COPY_AND_ASSIGN(FakeEligibleHostDevicesProviderFactory);
104 };
105
106 class FakeHostBackendDelegateFactory : public HostBackendDelegateImpl::Factory {
107 public:
FakeHostBackendDelegateFactory(FakeEligibleHostDevicesProviderFactory * fake_eligible_host_devices_provider_factory,sync_preferences::TestingPrefServiceSyncable * expected_testing_pref_service,device_sync::FakeDeviceSyncClient * expected_device_sync_client)108 FakeHostBackendDelegateFactory(
109 FakeEligibleHostDevicesProviderFactory*
110 fake_eligible_host_devices_provider_factory,
111 sync_preferences::TestingPrefServiceSyncable*
112 expected_testing_pref_service,
113 device_sync::FakeDeviceSyncClient* expected_device_sync_client)
114 : fake_eligible_host_devices_provider_factory_(
115 fake_eligible_host_devices_provider_factory),
116 expected_testing_pref_service_(expected_testing_pref_service),
117 expected_device_sync_client_(expected_device_sync_client) {}
118
119 ~FakeHostBackendDelegateFactory() override = default;
120
instance()121 FakeHostBackendDelegate* instance() { return instance_; }
122
123 private:
124 // HostBackendDelegateImpl::Factory:
CreateInstance(EligibleHostDevicesProvider * eligible_host_devices_provider,PrefService * pref_service,device_sync::DeviceSyncClient * device_sync_client,std::unique_ptr<base::OneShotTimer> timer)125 std::unique_ptr<HostBackendDelegate> CreateInstance(
126 EligibleHostDevicesProvider* eligible_host_devices_provider,
127 PrefService* pref_service,
128 device_sync::DeviceSyncClient* device_sync_client,
129 std::unique_ptr<base::OneShotTimer> timer) override {
130 EXPECT_FALSE(instance_);
131 EXPECT_EQ(fake_eligible_host_devices_provider_factory_->instance(),
132 eligible_host_devices_provider);
133 EXPECT_EQ(expected_testing_pref_service_, pref_service);
134 EXPECT_EQ(expected_device_sync_client_, device_sync_client);
135
136 auto instance = std::make_unique<FakeHostBackendDelegate>();
137 instance_ = instance.get();
138 return instance;
139 }
140
141 FakeEligibleHostDevicesProviderFactory*
142 fake_eligible_host_devices_provider_factory_;
143 sync_preferences::TestingPrefServiceSyncable* expected_testing_pref_service_;
144 device_sync::FakeDeviceSyncClient* expected_device_sync_client_;
145
146 FakeHostBackendDelegate* instance_ = nullptr;
147
148 DISALLOW_COPY_AND_ASSIGN(FakeHostBackendDelegateFactory);
149 };
150
151 class FakeHostVerifierFactory : public HostVerifierImpl::Factory {
152 public:
FakeHostVerifierFactory(FakeHostBackendDelegateFactory * fake_host_backend_delegate_factory,device_sync::FakeDeviceSyncClient * expected_device_sync_client,sync_preferences::TestingPrefServiceSyncable * expected_testing_pref_service)153 FakeHostVerifierFactory(
154 FakeHostBackendDelegateFactory* fake_host_backend_delegate_factory,
155 device_sync::FakeDeviceSyncClient* expected_device_sync_client,
156 sync_preferences::TestingPrefServiceSyncable*
157 expected_testing_pref_service)
158 : fake_host_backend_delegate_factory_(fake_host_backend_delegate_factory),
159 expected_device_sync_client_(expected_device_sync_client),
160 expected_testing_pref_service_(expected_testing_pref_service) {}
161
162 ~FakeHostVerifierFactory() override = default;
163
instance()164 FakeHostVerifier* instance() { return instance_; }
165
166 private:
167 // HostVerifierImpl::Factory:
CreateInstance(HostBackendDelegate * host_backend_delegate,device_sync::DeviceSyncClient * device_sync_client,PrefService * pref_service,base::Clock * clock,std::unique_ptr<base::OneShotTimer> retry_timer,std::unique_ptr<base::OneShotTimer> sync_timer)168 std::unique_ptr<HostVerifier> CreateInstance(
169 HostBackendDelegate* host_backend_delegate,
170 device_sync::DeviceSyncClient* device_sync_client,
171 PrefService* pref_service,
172 base::Clock* clock,
173 std::unique_ptr<base::OneShotTimer> retry_timer,
174 std::unique_ptr<base::OneShotTimer> sync_timer) override {
175 EXPECT_FALSE(instance_);
176 EXPECT_EQ(fake_host_backend_delegate_factory_->instance(),
177 host_backend_delegate);
178 EXPECT_EQ(expected_device_sync_client_, device_sync_client);
179 EXPECT_EQ(expected_testing_pref_service_, pref_service);
180
181 auto instance = std::make_unique<FakeHostVerifier>();
182 instance_ = instance.get();
183 return instance;
184 }
185
186 FakeHostBackendDelegateFactory* fake_host_backend_delegate_factory_;
187 device_sync::FakeDeviceSyncClient* expected_device_sync_client_;
188 sync_preferences::TestingPrefServiceSyncable* expected_testing_pref_service_;
189
190 FakeHostVerifier* instance_ = nullptr;
191
192 DISALLOW_COPY_AND_ASSIGN(FakeHostVerifierFactory);
193 };
194
195 class FakeHostStatusProviderFactory : public HostStatusProviderImpl::Factory {
196 public:
FakeHostStatusProviderFactory(FakeEligibleHostDevicesProviderFactory * fake_eligible_host_devices_provider_factory,FakeHostBackendDelegateFactory * fake_host_backend_delegate_factory,FakeHostVerifierFactory * fake_host_verifier_factory,device_sync::FakeDeviceSyncClient * expected_device_sync_client)197 FakeHostStatusProviderFactory(
198 FakeEligibleHostDevicesProviderFactory*
199 fake_eligible_host_devices_provider_factory,
200 FakeHostBackendDelegateFactory* fake_host_backend_delegate_factory,
201 FakeHostVerifierFactory* fake_host_verifier_factory,
202 device_sync::FakeDeviceSyncClient* expected_device_sync_client)
203 : fake_eligible_host_devices_provider_factory_(
204 fake_eligible_host_devices_provider_factory),
205 fake_host_backend_delegate_factory_(fake_host_backend_delegate_factory),
206 fake_host_verifier_factory_(fake_host_verifier_factory),
207 expected_device_sync_client_(expected_device_sync_client) {}
208
209 ~FakeHostStatusProviderFactory() override = default;
210
instance()211 FakeHostStatusProvider* instance() { return instance_; }
212
213 private:
214 // HostStatusProviderImpl::Factory:
CreateInstance(EligibleHostDevicesProvider * eligible_host_devices_provider,HostBackendDelegate * host_backend_delegate,HostVerifier * host_verifier,device_sync::DeviceSyncClient * device_sync_client)215 std::unique_ptr<HostStatusProvider> CreateInstance(
216 EligibleHostDevicesProvider* eligible_host_devices_provider,
217 HostBackendDelegate* host_backend_delegate,
218 HostVerifier* host_verifier,
219 device_sync::DeviceSyncClient* device_sync_client) override {
220 EXPECT_FALSE(instance_);
221 EXPECT_EQ(fake_eligible_host_devices_provider_factory_->instance(),
222 eligible_host_devices_provider);
223 EXPECT_EQ(fake_host_backend_delegate_factory_->instance(),
224 host_backend_delegate);
225 EXPECT_EQ(fake_host_verifier_factory_->instance(), host_verifier);
226 EXPECT_EQ(expected_device_sync_client_, device_sync_client);
227
228 auto instance = std::make_unique<FakeHostStatusProvider>();
229 instance_ = instance.get();
230 return instance;
231 }
232
233 FakeEligibleHostDevicesProviderFactory*
234 fake_eligible_host_devices_provider_factory_;
235 FakeHostBackendDelegateFactory* fake_host_backend_delegate_factory_;
236 FakeHostVerifierFactory* fake_host_verifier_factory_;
237 device_sync::FakeDeviceSyncClient* expected_device_sync_client_;
238
239 FakeHostStatusProvider* instance_ = nullptr;
240
241 DISALLOW_COPY_AND_ASSIGN(FakeHostStatusProviderFactory);
242 };
243
244 class FakeWifiSyncFeatureManagerFactory
245 : public WifiSyncFeatureManagerImpl::Factory {
246 public:
FakeWifiSyncFeatureManagerFactory(FakeHostStatusProviderFactory * fake_host_status_provider_factory,sync_preferences::TestingPrefServiceSyncable * expected_testing_pref_service,device_sync::FakeDeviceSyncClient * expected_device_sync_client)247 FakeWifiSyncFeatureManagerFactory(
248 FakeHostStatusProviderFactory* fake_host_status_provider_factory,
249 sync_preferences::TestingPrefServiceSyncable*
250 expected_testing_pref_service,
251 device_sync::FakeDeviceSyncClient* expected_device_sync_client)
252 : fake_host_status_provider_factory_(fake_host_status_provider_factory),
253 expected_testing_pref_service_(expected_testing_pref_service),
254 expected_device_sync_client_(expected_device_sync_client) {}
255
256 ~FakeWifiSyncFeatureManagerFactory() override = default;
257
instance()258 FakeWifiSyncFeatureManager* instance() { return instance_; }
259
260 private:
261 // WifiSyncFeatureManagerImpl::Factory:
CreateInstance(HostStatusProvider * host_status_provider,PrefService * pref_service,device_sync::DeviceSyncClient * device_sync_client,std::unique_ptr<base::OneShotTimer> timer)262 std::unique_ptr<WifiSyncFeatureManager> CreateInstance(
263 HostStatusProvider* host_status_provider,
264 PrefService* pref_service,
265 device_sync::DeviceSyncClient* device_sync_client,
266 std::unique_ptr<base::OneShotTimer> timer) override {
267 EXPECT_FALSE(instance_);
268 EXPECT_EQ(fake_host_status_provider_factory_->instance(),
269 host_status_provider);
270 EXPECT_EQ(expected_testing_pref_service_, pref_service);
271 EXPECT_EQ(expected_device_sync_client_, device_sync_client);
272
273 auto instance = std::make_unique<FakeWifiSyncFeatureManager>();
274 instance_ = instance.get();
275 return instance;
276 }
277
278 FakeHostStatusProviderFactory* fake_host_status_provider_factory_;
279 sync_preferences::TestingPrefServiceSyncable* expected_testing_pref_service_;
280 device_sync::FakeDeviceSyncClient* expected_device_sync_client_;
281
282 FakeWifiSyncFeatureManager* instance_ = nullptr;
283
284 DISALLOW_COPY_AND_ASSIGN(FakeWifiSyncFeatureManagerFactory);
285 };
286
287 class FakeGrandfatheredEasyUnlockHostDisablerFactory
288 : public GrandfatheredEasyUnlockHostDisabler::Factory {
289 public:
FakeGrandfatheredEasyUnlockHostDisablerFactory(FakeHostBackendDelegateFactory * fake_host_backend_delegate_factory,device_sync::FakeDeviceSyncClient * expected_device_sync_client,sync_preferences::TestingPrefServiceSyncable * expected_testing_pref_service)290 FakeGrandfatheredEasyUnlockHostDisablerFactory(
291 FakeHostBackendDelegateFactory* fake_host_backend_delegate_factory,
292 device_sync::FakeDeviceSyncClient* expected_device_sync_client,
293 sync_preferences::TestingPrefServiceSyncable*
294 expected_testing_pref_service)
295 : fake_host_backend_delegate_factory_(fake_host_backend_delegate_factory),
296 expected_device_sync_client_(expected_device_sync_client),
297 expected_testing_pref_service_(expected_testing_pref_service) {}
298
299 ~FakeGrandfatheredEasyUnlockHostDisablerFactory() override = default;
300
301 private:
302 // GrandfatheredEasyUnlockHostDisabler::Factory:
CreateInstance(HostBackendDelegate * host_backend_delegate,device_sync::DeviceSyncClient * device_sync_client,PrefService * pref_service,std::unique_ptr<base::OneShotTimer> timer)303 std::unique_ptr<GrandfatheredEasyUnlockHostDisabler> CreateInstance(
304 HostBackendDelegate* host_backend_delegate,
305 device_sync::DeviceSyncClient* device_sync_client,
306 PrefService* pref_service,
307 std::unique_ptr<base::OneShotTimer> timer) override {
308 EXPECT_EQ(fake_host_backend_delegate_factory_->instance(),
309 host_backend_delegate);
310 EXPECT_EQ(expected_device_sync_client_, device_sync_client);
311 EXPECT_EQ(expected_testing_pref_service_, pref_service);
312 // Only check inputs and return nullptr. We do not want to trigger any logic
313 // in these unit tests.
314 return nullptr;
315 }
316
317 FakeHostBackendDelegateFactory* fake_host_backend_delegate_factory_;
318 device_sync::FakeDeviceSyncClient* expected_device_sync_client_;
319 sync_preferences::TestingPrefServiceSyncable* expected_testing_pref_service_;
320
321 DISALLOW_COPY_AND_ASSIGN(FakeGrandfatheredEasyUnlockHostDisablerFactory);
322 };
323
324 class FakeFeatureStateManagerFactory : public FeatureStateManagerImpl::Factory {
325 public:
FakeFeatureStateManagerFactory(sync_preferences::TestingPrefServiceSyncable * expected_testing_pref_service,FakeHostStatusProviderFactory * fake_host_status_provider_factory,device_sync::FakeDeviceSyncClient * expected_device_sync_client,FakeAndroidSmsPairingStateTracker * expected_android_sms_pairing_state_tracker)326 FakeFeatureStateManagerFactory(
327 sync_preferences::TestingPrefServiceSyncable*
328 expected_testing_pref_service,
329 FakeHostStatusProviderFactory* fake_host_status_provider_factory,
330 device_sync::FakeDeviceSyncClient* expected_device_sync_client,
331 FakeAndroidSmsPairingStateTracker*
332 expected_android_sms_pairing_state_tracker)
333 : expected_testing_pref_service_(expected_testing_pref_service),
334 fake_host_status_provider_factory_(fake_host_status_provider_factory),
335 expected_device_sync_client_(expected_device_sync_client),
336 expected_android_sms_pairing_state_tracker_(
337 expected_android_sms_pairing_state_tracker) {}
338
339 ~FakeFeatureStateManagerFactory() override = default;
340
instance()341 FakeFeatureStateManager* instance() { return instance_; }
342
343 private:
344 // FeatureStateManagerImpl::Factory:
CreateInstance(PrefService * pref_service,HostStatusProvider * host_status_provider,device_sync::DeviceSyncClient * device_sync_client,AndroidSmsPairingStateTracker * android_sms_pairing_state_tracker,WifiSyncFeatureManager * wifi_sync_feature_manager)345 std::unique_ptr<FeatureStateManager> CreateInstance(
346 PrefService* pref_service,
347 HostStatusProvider* host_status_provider,
348 device_sync::DeviceSyncClient* device_sync_client,
349 AndroidSmsPairingStateTracker* android_sms_pairing_state_tracker,
350 WifiSyncFeatureManager* wifi_sync_feature_manager) override {
351 EXPECT_FALSE(instance_);
352 EXPECT_EQ(expected_testing_pref_service_, pref_service);
353 EXPECT_EQ(fake_host_status_provider_factory_->instance(),
354 host_status_provider);
355 EXPECT_EQ(expected_device_sync_client_, device_sync_client);
356 EXPECT_EQ(expected_android_sms_pairing_state_tracker_,
357 android_sms_pairing_state_tracker);
358
359 auto instance = std::make_unique<FakeFeatureStateManager>();
360 instance_ = instance.get();
361 return instance;
362 }
363
364 sync_preferences::TestingPrefServiceSyncable* expected_testing_pref_service_;
365 FakeHostStatusProviderFactory* fake_host_status_provider_factory_;
366 device_sync::FakeDeviceSyncClient* expected_device_sync_client_;
367 FakeAndroidSmsPairingStateTracker*
368 expected_android_sms_pairing_state_tracker_;
369
370 FakeFeatureStateManager* instance_ = nullptr;
371
372 DISALLOW_COPY_AND_ASSIGN(FakeFeatureStateManagerFactory);
373 };
374
375 class FakeHostDeviceTimestampManagerFactory
376 : public HostDeviceTimestampManagerImpl::Factory {
377 public:
FakeHostDeviceTimestampManagerFactory(FakeHostStatusProviderFactory * fake_host_status_provider_factory,sync_preferences::TestingPrefServiceSyncable * expected_testing_pref_service)378 FakeHostDeviceTimestampManagerFactory(
379 FakeHostStatusProviderFactory* fake_host_status_provider_factory,
380 sync_preferences::TestingPrefServiceSyncable*
381 expected_testing_pref_service)
382 : fake_host_status_provider_factory_(fake_host_status_provider_factory),
383 expected_testing_pref_service_(expected_testing_pref_service) {}
384
385 ~FakeHostDeviceTimestampManagerFactory() override = default;
386
instance()387 FakeHostDeviceTimestampManager* instance() { return instance_; }
388
389 private:
390 // HostDeviceTimestampManagerImpl::Factory:
CreateInstance(HostStatusProvider * host_status_provider,PrefService * pref_service,base::Clock * clock)391 std::unique_ptr<HostDeviceTimestampManager> CreateInstance(
392 HostStatusProvider* host_status_provider,
393 PrefService* pref_service,
394 base::Clock* clock) override {
395 EXPECT_FALSE(instance_);
396 EXPECT_EQ(fake_host_status_provider_factory_->instance(),
397 host_status_provider);
398 EXPECT_EQ(expected_testing_pref_service_, pref_service);
399
400 auto instance = std::make_unique<FakeHostDeviceTimestampManager>();
401 instance_ = instance.get();
402 return instance;
403 }
404
405 FakeHostStatusProviderFactory* fake_host_status_provider_factory_;
406 sync_preferences::TestingPrefServiceSyncable* expected_testing_pref_service_;
407
408 FakeHostDeviceTimestampManager* instance_ = nullptr;
409
410 DISALLOW_COPY_AND_ASSIGN(FakeHostDeviceTimestampManagerFactory);
411 };
412
413 class FakeAccountStatusChangeDelegateNotifierFactory
414 : public AccountStatusChangeDelegateNotifierImpl::Factory {
415 public:
FakeAccountStatusChangeDelegateNotifierFactory(FakeHostStatusProviderFactory * fake_host_status_provider_factory,sync_preferences::TestingPrefServiceSyncable * expected_testing_pref_service,FakeHostDeviceTimestampManagerFactory * fake_host_device_timestamp_manager_factory,OobeCompletionTracker * expected_oobe_completion_tracker)416 FakeAccountStatusChangeDelegateNotifierFactory(
417 FakeHostStatusProviderFactory* fake_host_status_provider_factory,
418 sync_preferences::TestingPrefServiceSyncable*
419 expected_testing_pref_service,
420 FakeHostDeviceTimestampManagerFactory*
421 fake_host_device_timestamp_manager_factory,
422 OobeCompletionTracker* expected_oobe_completion_tracker)
423 : fake_host_status_provider_factory_(fake_host_status_provider_factory),
424 expected_testing_pref_service_(expected_testing_pref_service),
425 fake_host_device_timestamp_manager_factory_(
426 fake_host_device_timestamp_manager_factory),
427 expected_oobe_completion_tracker_(expected_oobe_completion_tracker) {}
428
429 ~FakeAccountStatusChangeDelegateNotifierFactory() override = default;
430
instance()431 FakeAccountStatusChangeDelegateNotifier* instance() { return instance_; }
432
433 private:
434 // AccountStatusChangeDelegateNotifierImpl::Factory:
CreateInstance(HostStatusProvider * host_status_provider,PrefService * pref_service,HostDeviceTimestampManager * host_device_timestamp_manager,OobeCompletionTracker * oobe_completion_tracker,base::Clock * clock)435 std::unique_ptr<AccountStatusChangeDelegateNotifier> CreateInstance(
436 HostStatusProvider* host_status_provider,
437 PrefService* pref_service,
438 HostDeviceTimestampManager* host_device_timestamp_manager,
439 OobeCompletionTracker* oobe_completion_tracker,
440 base::Clock* clock) override {
441 EXPECT_FALSE(instance_);
442 EXPECT_EQ(fake_host_status_provider_factory_->instance(),
443 host_status_provider);
444 EXPECT_EQ(expected_testing_pref_service_, pref_service);
445 EXPECT_EQ(fake_host_device_timestamp_manager_factory_->instance(),
446 host_device_timestamp_manager);
447 EXPECT_EQ(expected_oobe_completion_tracker_, oobe_completion_tracker);
448
449 auto instance = std::make_unique<FakeAccountStatusChangeDelegateNotifier>();
450 instance_ = instance.get();
451 return instance;
452 }
453
454 FakeHostStatusProviderFactory* fake_host_status_provider_factory_;
455 sync_preferences::TestingPrefServiceSyncable* expected_testing_pref_service_;
456 FakeHostDeviceTimestampManagerFactory*
457 fake_host_device_timestamp_manager_factory_;
458 OobeCompletionTracker* expected_oobe_completion_tracker_;
459
460 FakeAccountStatusChangeDelegateNotifier* instance_ = nullptr;
461
462 DISALLOW_COPY_AND_ASSIGN(FakeAccountStatusChangeDelegateNotifierFactory);
463 };
464
465 class FakeDeviceReenrollerFactory : public DeviceReenroller::Factory {
466 public:
FakeDeviceReenrollerFactory(device_sync::FakeDeviceSyncClient * expected_device_sync_client,const device_sync::FakeGcmDeviceInfoProvider * expected_gcm_device_info_provider)467 FakeDeviceReenrollerFactory(
468 device_sync::FakeDeviceSyncClient* expected_device_sync_client,
469 const device_sync::FakeGcmDeviceInfoProvider*
470 expected_gcm_device_info_provider)
471 : expected_device_sync_client_(expected_device_sync_client),
472 expected_gcm_device_info_provider_(expected_gcm_device_info_provider) {}
473
474 ~FakeDeviceReenrollerFactory() override = default;
475
476 private:
477 // DeviceReenroller::Factory:
CreateInstance(device_sync::DeviceSyncClient * device_sync_client,const device_sync::GcmDeviceInfoProvider * gcm_device_info_provider,std::unique_ptr<base::OneShotTimer> timer)478 std::unique_ptr<DeviceReenroller> CreateInstance(
479 device_sync::DeviceSyncClient* device_sync_client,
480 const device_sync::GcmDeviceInfoProvider* gcm_device_info_provider,
481 std::unique_ptr<base::OneShotTimer> timer) override {
482 EXPECT_EQ(expected_device_sync_client_, device_sync_client);
483 EXPECT_EQ(expected_gcm_device_info_provider_, gcm_device_info_provider);
484 // Only check inputs and return nullptr. We do not want to trigger the
485 // DeviceReenroller logic in these unit tests.
486 return nullptr;
487 }
488
489 device_sync::FakeDeviceSyncClient* expected_device_sync_client_;
490 const device_sync::GcmDeviceInfoProvider* expected_gcm_device_info_provider_;
491
492 DISALLOW_COPY_AND_ASSIGN(FakeDeviceReenrollerFactory);
493 };
494
495 class FakeAndroidSmsAppInstallingStatusObserverFactory
496 : public AndroidSmsAppInstallingStatusObserver::Factory {
497 public:
FakeAndroidSmsAppInstallingStatusObserverFactory(FakeHostStatusProviderFactory * fake_host_status_provider_factory,FakeFeatureStateManagerFactory * fake_feature_state_manager_factory,AndroidSmsAppHelperDelegate * expected_android_sms_app_helper_delegate)498 FakeAndroidSmsAppInstallingStatusObserverFactory(
499 FakeHostStatusProviderFactory* fake_host_status_provider_factory,
500 FakeFeatureStateManagerFactory* fake_feature_state_manager_factory,
501 AndroidSmsAppHelperDelegate* expected_android_sms_app_helper_delegate)
502 : fake_host_status_provider_factory_(fake_host_status_provider_factory),
503 fake_feature_state_manager_factory_(fake_feature_state_manager_factory),
504 expected_android_sms_app_helper_delegate_(
505 expected_android_sms_app_helper_delegate) {}
506
507 ~FakeAndroidSmsAppInstallingStatusObserverFactory() override = default;
508
509 private:
510 // AndroidSmsAppInstallingStatusObserver::Factory:
CreateInstance(HostStatusProvider * host_status_provider,FeatureStateManager * feature_state_manager,AndroidSmsAppHelperDelegate * android_sms_app_helper_delegate)511 std::unique_ptr<AndroidSmsAppInstallingStatusObserver> CreateInstance(
512 HostStatusProvider* host_status_provider,
513 FeatureStateManager* feature_state_manager,
514 AndroidSmsAppHelperDelegate* android_sms_app_helper_delegate) override {
515 EXPECT_EQ(fake_host_status_provider_factory_->instance(),
516 host_status_provider);
517 EXPECT_EQ(fake_feature_state_manager_factory_->instance(),
518 feature_state_manager);
519 EXPECT_EQ(expected_android_sms_app_helper_delegate_,
520 android_sms_app_helper_delegate);
521 // Only check inputs and return nullptr. We do not want to trigger the
522 // AndroidSmsAppInstallingStatusObserver logic in these unit tests.
523 return nullptr;
524 }
525
526 FakeHostStatusProviderFactory* fake_host_status_provider_factory_;
527 FakeFeatureStateManagerFactory* fake_feature_state_manager_factory_;
528 AndroidSmsAppHelperDelegate* expected_android_sms_app_helper_delegate_;
529
530 DISALLOW_COPY_AND_ASSIGN(FakeAndroidSmsAppInstallingStatusObserverFactory);
531 };
532
533 } // namespace
534
535 class MultiDeviceSetupImplTest : public ::testing::TestWithParam<bool> {
536 protected:
MultiDeviceSetupImplTest()537 MultiDeviceSetupImplTest()
538 : test_devices_(
539 multidevice::CreateRemoteDeviceRefListForTest(kNumTestDevices)) {}
540 ~MultiDeviceSetupImplTest() override = default;
541
SetUp()542 void SetUp() override {
543 SetDeviceSyncFeatureFlags(IsV1DeviceSyncEnabled());
544
545 test_pref_service_ =
546 std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
547 fake_device_sync_client_ =
548 std::make_unique<device_sync::FakeDeviceSyncClient>();
549
550 fake_auth_token_validator_ = std::make_unique<FakeAuthTokenValidator>();
551 fake_auth_token_validator_->set_expected_auth_token(kValidAuthToken);
552
553 fake_oobe_completion_tracker_ = std::make_unique<OobeCompletionTracker>();
554
555 fake_android_sms_app_helper_delegate_ =
556 std::make_unique<FakeAndroidSmsAppHelperDelegate>();
557
558 fake_android_sms_pairing_state_tracker_ =
559 std::make_unique<FakeAndroidSmsPairingStateTracker>();
560
561 fake_gcm_device_info_provider_ =
562 std::make_unique<device_sync::FakeGcmDeviceInfoProvider>(
563 cryptauth::GcmDeviceInfo());
564
565 fake_eligible_host_devices_provider_factory_ =
566 std::make_unique<FakeEligibleHostDevicesProviderFactory>(
567 fake_device_sync_client_.get());
568 EligibleHostDevicesProviderImpl::Factory::SetFactoryForTesting(
569 fake_eligible_host_devices_provider_factory_.get());
570
571 fake_host_backend_delegate_factory_ =
572 std::make_unique<FakeHostBackendDelegateFactory>(
573 fake_eligible_host_devices_provider_factory_.get(),
574 test_pref_service_.get(), fake_device_sync_client_.get());
575 HostBackendDelegateImpl::Factory::SetFactoryForTesting(
576 fake_host_backend_delegate_factory_.get());
577
578 fake_host_verifier_factory_ = std::make_unique<FakeHostVerifierFactory>(
579 fake_host_backend_delegate_factory_.get(),
580 fake_device_sync_client_.get(), test_pref_service_.get());
581 HostVerifierImpl::Factory::SetFactoryForTesting(
582 fake_host_verifier_factory_.get());
583
584 fake_host_status_provider_factory_ =
585 std::make_unique<FakeHostStatusProviderFactory>(
586 fake_eligible_host_devices_provider_factory_.get(),
587 fake_host_backend_delegate_factory_.get(),
588 fake_host_verifier_factory_.get(), fake_device_sync_client_.get());
589 HostStatusProviderImpl::Factory::SetFactoryForTesting(
590 fake_host_status_provider_factory_.get());
591
592 fake_wifi_sync_feature_manager_factory_ =
593 std::make_unique<FakeWifiSyncFeatureManagerFactory>(
594 fake_host_status_provider_factory_.get(), test_pref_service_.get(),
595 fake_device_sync_client_.get());
596 WifiSyncFeatureManagerImpl::Factory::SetFactoryForTesting(
597 fake_wifi_sync_feature_manager_factory_.get());
598
599 fake_grandfathered_easy_unlock_host_disabler_factory_ =
600 std::make_unique<FakeGrandfatheredEasyUnlockHostDisablerFactory>(
601 fake_host_backend_delegate_factory_.get(),
602 fake_device_sync_client_.get(), test_pref_service_.get());
603 GrandfatheredEasyUnlockHostDisabler::Factory::SetFactoryForTesting(
604 fake_grandfathered_easy_unlock_host_disabler_factory_.get());
605
606 fake_feature_state_manager_factory_ =
607 std::make_unique<FakeFeatureStateManagerFactory>(
608 test_pref_service_.get(), fake_host_status_provider_factory_.get(),
609 fake_device_sync_client_.get(),
610 fake_android_sms_pairing_state_tracker_.get());
611 FeatureStateManagerImpl::Factory::SetFactoryForTesting(
612 fake_feature_state_manager_factory_.get());
613
614 fake_host_device_timestamp_manager_factory_ =
615 std::make_unique<FakeHostDeviceTimestampManagerFactory>(
616 fake_host_status_provider_factory_.get(), test_pref_service_.get());
617 HostDeviceTimestampManagerImpl::Factory::SetFactoryForTesting(
618 fake_host_device_timestamp_manager_factory_.get());
619
620 fake_account_status_change_delegate_notifier_factory_ =
621 std::make_unique<FakeAccountStatusChangeDelegateNotifierFactory>(
622 fake_host_status_provider_factory_.get(), test_pref_service_.get(),
623 fake_host_device_timestamp_manager_factory_.get(),
624 fake_oobe_completion_tracker_.get());
625 AccountStatusChangeDelegateNotifierImpl::Factory::SetFactoryForTesting(
626 fake_account_status_change_delegate_notifier_factory_.get());
627
628 fake_device_reenroller_factory_ =
629 std::make_unique<FakeDeviceReenrollerFactory>(
630 fake_device_sync_client_.get(),
631 fake_gcm_device_info_provider_.get());
632 DeviceReenroller::Factory::SetFactoryForTesting(
633 fake_device_reenroller_factory_.get());
634
635 fake_android_sms_app_installing_status_observer_factory_ =
636 std::make_unique<FakeAndroidSmsAppInstallingStatusObserverFactory>(
637 fake_host_status_provider_factory_.get(),
638 fake_feature_state_manager_factory_.get(),
639 fake_android_sms_app_helper_delegate_.get());
640 AndroidSmsAppInstallingStatusObserver::Factory::SetFactoryForTesting(
641 fake_android_sms_app_installing_status_observer_factory_.get());
642
643 multidevice_setup_ = MultiDeviceSetupImpl::Factory::Create(
644 test_pref_service_.get(), fake_device_sync_client_.get(),
645 fake_auth_token_validator_.get(), fake_oobe_completion_tracker_.get(),
646 fake_android_sms_app_helper_delegate_.get(),
647 fake_android_sms_pairing_state_tracker_.get(),
648 fake_gcm_device_info_provider_.get());
649 }
650
TearDown()651 void TearDown() override {
652 EligibleHostDevicesProviderImpl::Factory::SetFactoryForTesting(nullptr);
653 HostBackendDelegateImpl::Factory::SetFactoryForTesting(nullptr);
654 HostVerifierImpl::Factory::SetFactoryForTesting(nullptr);
655 HostStatusProviderImpl::Factory::SetFactoryForTesting(nullptr);
656 GrandfatheredEasyUnlockHostDisabler::Factory::SetFactoryForTesting(nullptr);
657 FeatureStateManagerImpl::Factory::SetFactoryForTesting(nullptr);
658 HostDeviceTimestampManagerImpl::Factory::SetFactoryForTesting(nullptr);
659 AccountStatusChangeDelegateNotifierImpl::Factory::SetFactoryForTesting(
660 nullptr);
661 DeviceReenroller::Factory::SetFactoryForTesting(nullptr);
662 AndroidSmsAppInstallingStatusObserver::Factory::SetFactoryForTesting(
663 nullptr);
664 WifiSyncFeatureManagerImpl::Factory::SetFactoryForTesting(nullptr);
665 }
666
IsV1DeviceSyncEnabled()667 bool IsV1DeviceSyncEnabled() { return GetParam(); }
668
CallSetAccountStatusChangeDelegate()669 void CallSetAccountStatusChangeDelegate() {
670 EXPECT_FALSE(fake_account_status_change_delegate_);
671
672 fake_account_status_change_delegate_ =
673 std::make_unique<FakeAccountStatusChangeDelegate>();
674
675 EXPECT_FALSE(fake_account_status_change_delegate_notifier()->delegate());
676 multidevice_setup_->SetAccountStatusChangeDelegate(
677 fake_account_status_change_delegate_->GenerateRemote());
678 EXPECT_TRUE(fake_account_status_change_delegate_notifier()->delegate());
679 }
680
CallGetEligibleHostDevices()681 multidevice::RemoteDeviceList CallGetEligibleHostDevices() {
682 base::RunLoop run_loop;
683 multidevice_setup_->GetEligibleHostDevices(
684 base::BindOnce(&MultiDeviceSetupImplTest::OnEligibleDevicesFetched,
685 base::Unretained(this), run_loop.QuitClosure()));
686 run_loop.Run();
687
688 multidevice::RemoteDeviceList eligible_devices_list =
689 *last_eligible_devices_list_;
690 last_eligible_devices_list_.reset();
691
692 return eligible_devices_list;
693 }
694
CallGetEligibleActiveHostDevices()695 std::vector<mojom::HostDevicePtr> CallGetEligibleActiveHostDevices() {
696 base::RunLoop run_loop;
697 multidevice_setup_->GetEligibleActiveHostDevices(base::BindOnce(
698 &MultiDeviceSetupImplTest::OnEligibleActiveHostDevicesFetched,
699 base::Unretained(this), run_loop.QuitClosure()));
700 run_loop.Run();
701
702 std::vector<mojom::HostDevicePtr> eligible_devices_list =
703 std::move(*last_eligible_active_devices_list_);
704 last_eligible_active_devices_list_.reset();
705
706 return eligible_devices_list;
707 }
708
CallSetHostDevice(const std::string & host_instance_id_or_legacy_device_id,const std::string & auth_token)709 bool CallSetHostDevice(
710 const std::string& host_instance_id_or_legacy_device_id,
711 const std::string& auth_token) {
712 base::RunLoop run_loop;
713 multidevice_setup_->SetHostDevice(
714 host_instance_id_or_legacy_device_id, auth_token,
715 base::BindOnce(&MultiDeviceSetupImplTest::OnSetHostDeviceResult,
716 base::Unretained(this), run_loop.QuitClosure()));
717 run_loop.Run();
718
719 bool success = *last_set_host_success_;
720 last_set_host_success_.reset();
721
722 return success;
723 }
724
CallSetHostDeviceWithoutAuth(const std::string & host_instance_id_or_legacy_device_id)725 bool CallSetHostDeviceWithoutAuth(
726 const std::string& host_instance_id_or_legacy_device_id) {
727 base::RunLoop run_loop;
728 multidevice_setup_->SetHostDeviceWithoutAuthToken(
729 host_instance_id_or_legacy_device_id,
730 base::BindOnce(
731 &MultiDeviceSetupImplTest::OnSetHostDeviceWithoutAuthResult,
732 base::Unretained(this), run_loop.QuitClosure()));
733 run_loop.Run();
734
735 bool success = *last_set_host_without_auth_success_;
736 last_set_host_without_auth_success_.reset();
737
738 return success;
739 }
740
741 std::pair<mojom::HostStatus, base::Optional<multidevice::RemoteDevice>>
CallGetHostStatus()742 CallGetHostStatus() {
743 base::RunLoop run_loop;
744 multidevice_setup_->GetHostStatus(
745 base::BindOnce(&MultiDeviceSetupImplTest::OnHostStatusReceived,
746 base::Unretained(this), run_loop.QuitClosure()));
747 run_loop.Run();
748
749 std::pair<mojom::HostStatus, base::Optional<multidevice::RemoteDevice>>
750 host_status_update = *last_host_status_;
751 last_host_status_.reset();
752
753 return host_status_update;
754 }
755
CallSetFeatureEnabledState(mojom::Feature feature,bool enabled,const base::Optional<std::string> & auth_token)756 bool CallSetFeatureEnabledState(
757 mojom::Feature feature,
758 bool enabled,
759 const base::Optional<std::string>& auth_token) {
760 base::RunLoop run_loop;
761 multidevice_setup_->SetFeatureEnabledState(
762 feature, enabled, auth_token,
763 base::BindOnce(&MultiDeviceSetupImplTest::OnSetFeatureEnabled,
764 base::Unretained(this), run_loop.QuitClosure()));
765 run_loop.Run();
766
767 bool success = *last_set_feature_enabled_state_success_;
768 last_set_feature_enabled_state_success_.reset();
769
770 return success;
771 }
772
CallGetFeatureStates()773 base::flat_map<mojom::Feature, mojom::FeatureState> CallGetFeatureStates() {
774 base::RunLoop run_loop;
775 multidevice_setup_->GetFeatureStates(
776 base::BindOnce(&MultiDeviceSetupImplTest::OnGetFeatureStates,
777 base::Unretained(this), run_loop.QuitClosure()));
778 run_loop.Run();
779
780 base::flat_map<mojom::Feature, mojom::FeatureState> feature_states_map =
781 *last_get_feature_states_result_;
782 last_get_feature_states_result_.reset();
783
784 return feature_states_map;
785 }
786
CallRetrySetHostNow()787 bool CallRetrySetHostNow() {
788 base::RunLoop run_loop;
789 multidevice_setup_->RetrySetHostNow(
790 base::BindOnce(&MultiDeviceSetupImplTest::OnHostRetried,
791 base::Unretained(this), run_loop.QuitClosure()));
792 run_loop.Run();
793
794 bool success = *last_retry_success_;
795 last_retry_success_.reset();
796
797 return success;
798 }
799
CallTriggerEventForDebugging(mojom::EventTypeForDebugging type)800 bool CallTriggerEventForDebugging(mojom::EventTypeForDebugging type) {
801 base::RunLoop run_loop;
802 multidevice_setup_->TriggerEventForDebugging(
803 type, base::BindOnce(&MultiDeviceSetupImplTest::OnDebugEventTriggered,
804 base::Unretained(this), run_loop.QuitClosure()));
805 run_loop.Run();
806
807 bool success = *last_debug_event_success_;
808 last_debug_event_success_.reset();
809
810 // If the delegate was set, fire off any pending Mojo messages.
811 if (success)
812 fake_account_status_change_delegate_notifier()->FlushForTesting();
813
814 return success;
815 }
816
VerifyCurrentHostStatus(mojom::HostStatus host_status,const base::Optional<multidevice::RemoteDeviceRef> & host_device,FakeHostStatusObserver * observer=nullptr,size_t expected_observer_index=0u)817 void VerifyCurrentHostStatus(
818 mojom::HostStatus host_status,
819 const base::Optional<multidevice::RemoteDeviceRef>& host_device,
820 FakeHostStatusObserver* observer = nullptr,
821 size_t expected_observer_index = 0u) {
822 std::pair<mojom::HostStatus, base::Optional<multidevice::RemoteDevice>>
823 host_status_and_device = CallGetHostStatus();
824 EXPECT_EQ(host_status, host_status_and_device.first);
825 EXPECT_EQ(RefToRaw(host_device), host_status_and_device.second);
826
827 if (!observer)
828 return;
829
830 EXPECT_EQ(host_status,
831 observer->host_status_updates()[expected_observer_index].first);
832 EXPECT_EQ(RefToRaw(host_device),
833 observer->host_status_updates()[expected_observer_index].second);
834 }
835
SendPendingObserverMessages()836 void SendPendingObserverMessages() {
837 MultiDeviceSetupImpl* derived_ptr =
838 static_cast<MultiDeviceSetupImpl*>(multidevice_setup_.get());
839 derived_ptr->FlushForTesting();
840 }
841
fake_account_status_change_delegate()842 FakeAccountStatusChangeDelegate* fake_account_status_change_delegate() {
843 return fake_account_status_change_delegate_.get();
844 }
845
fake_eligible_host_devices_provider()846 FakeEligibleHostDevicesProvider* fake_eligible_host_devices_provider() {
847 return fake_eligible_host_devices_provider_factory_->instance();
848 }
849
fake_host_backend_delegate()850 FakeHostBackendDelegate* fake_host_backend_delegate() {
851 return fake_host_backend_delegate_factory_->instance();
852 }
853
fake_host_verifier()854 FakeHostVerifier* fake_host_verifier() {
855 return fake_host_verifier_factory_->instance();
856 }
857
fake_host_status_provider()858 FakeHostStatusProvider* fake_host_status_provider() {
859 return fake_host_status_provider_factory_->instance();
860 }
861
fake_feature_state_manager()862 FakeFeatureStateManager* fake_feature_state_manager() {
863 return fake_feature_state_manager_factory_->instance();
864 }
865
fake_host_device_timestamp_manager()866 FakeHostDeviceTimestampManager* fake_host_device_timestamp_manager() {
867 return fake_host_device_timestamp_manager_factory_->instance();
868 }
869
870 FakeAccountStatusChangeDelegateNotifier*
fake_account_status_change_delegate_notifier()871 fake_account_status_change_delegate_notifier() {
872 return fake_account_status_change_delegate_notifier_factory_->instance();
873 }
874
test_devices()875 multidevice::RemoteDeviceRefList& test_devices() { return test_devices_; }
876
multidevice_setup()877 MultiDeviceSetupBase* multidevice_setup() { return multidevice_setup_.get(); }
878
879 private:
SetDeviceSyncFeatureFlags(bool use_v1)880 void SetDeviceSyncFeatureFlags(bool use_v1) {
881 std::vector<base::Feature> enabled_features;
882 std::vector<base::Feature> disabled_features;
883
884 // These flags have no direct effect; however, v2 Enrollment and v2
885 // DeviceSync are prerequisites for disabling v1 DeviceSync.
886 enabled_features.push_back(chromeos::features::kCryptAuthV2Enrollment);
887 enabled_features.push_back(chromeos::features::kCryptAuthV2DeviceSync);
888
889 if (use_v1) {
890 disabled_features.push_back(
891 chromeos::features::kDisableCryptAuthV1DeviceSync);
892 } else {
893 enabled_features.push_back(
894 chromeos::features::kDisableCryptAuthV1DeviceSync);
895 }
896
897 scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features);
898 }
899
OnEligibleDevicesFetched(base::OnceClosure quit_closure,const multidevice::RemoteDeviceList & eligible_devices_list)900 void OnEligibleDevicesFetched(
901 base::OnceClosure quit_closure,
902 const multidevice::RemoteDeviceList& eligible_devices_list) {
903 EXPECT_FALSE(last_eligible_devices_list_);
904 last_eligible_devices_list_ = eligible_devices_list;
905 std::move(quit_closure).Run();
906 }
907
OnEligibleActiveHostDevicesFetched(base::OnceClosure quit_closure,std::vector<mojom::HostDevicePtr> eligible_active_devices_list)908 void OnEligibleActiveHostDevicesFetched(
909 base::OnceClosure quit_closure,
910 std::vector<mojom::HostDevicePtr> eligible_active_devices_list) {
911 EXPECT_FALSE(last_eligible_active_devices_list_);
912 last_eligible_active_devices_list_ =
913 std::move(eligible_active_devices_list);
914 std::move(quit_closure).Run();
915 }
916
OnSetHostDeviceResult(base::OnceClosure quit_closure,bool success)917 void OnSetHostDeviceResult(base::OnceClosure quit_closure, bool success) {
918 EXPECT_FALSE(last_set_host_success_);
919 last_set_host_success_ = success;
920 std::move(quit_closure).Run();
921 }
922
OnSetHostDeviceWithoutAuthResult(base::OnceClosure quit_closure,bool success)923 void OnSetHostDeviceWithoutAuthResult(base::OnceClosure quit_closure,
924 bool success) {
925 EXPECT_FALSE(last_set_host_without_auth_success_);
926 last_set_host_without_auth_success_ = success;
927 std::move(quit_closure).Run();
928 }
929
OnHostStatusReceived(base::OnceClosure quit_closure,mojom::HostStatus host_status,const base::Optional<multidevice::RemoteDevice> & host_device)930 void OnHostStatusReceived(
931 base::OnceClosure quit_closure,
932 mojom::HostStatus host_status,
933 const base::Optional<multidevice::RemoteDevice>& host_device) {
934 EXPECT_FALSE(last_host_status_);
935 last_host_status_ = std::make_pair(host_status, host_device);
936 std::move(quit_closure).Run();
937 }
938
OnSetFeatureEnabled(base::OnceClosure quit_closure,bool success)939 void OnSetFeatureEnabled(base::OnceClosure quit_closure, bool success) {
940 EXPECT_FALSE(last_set_feature_enabled_state_success_);
941 last_set_feature_enabled_state_success_ = success;
942 std::move(quit_closure).Run();
943 }
944
OnGetFeatureStates(base::OnceClosure quit_closure,const base::flat_map<mojom::Feature,mojom::FeatureState> & feature_states_map)945 void OnGetFeatureStates(
946 base::OnceClosure quit_closure,
947 const base::flat_map<mojom::Feature, mojom::FeatureState>&
948 feature_states_map) {
949 EXPECT_FALSE(last_get_feature_states_result_);
950 last_get_feature_states_result_ = feature_states_map;
951 std::move(quit_closure).Run();
952 }
953
OnHostRetried(base::OnceClosure quit_closure,bool success)954 void OnHostRetried(base::OnceClosure quit_closure, bool success) {
955 EXPECT_FALSE(last_retry_success_);
956 last_retry_success_ = success;
957 std::move(quit_closure).Run();
958 }
959
OnDebugEventTriggered(base::OnceClosure quit_closure,bool success)960 void OnDebugEventTriggered(base::OnceClosure quit_closure, bool success) {
961 EXPECT_FALSE(last_debug_event_success_);
962 last_debug_event_success_ = success;
963 std::move(quit_closure).Run();
964 }
965
966 base::test::TaskEnvironment task_environment_;
967
968 multidevice::RemoteDeviceRefList test_devices_;
969
970 std::unique_ptr<sync_preferences::TestingPrefServiceSyncable>
971 test_pref_service_;
972 std::unique_ptr<device_sync::FakeDeviceSyncClient> fake_device_sync_client_;
973 std::unique_ptr<FakeAuthTokenValidator> fake_auth_token_validator_;
974 std::unique_ptr<OobeCompletionTracker> fake_oobe_completion_tracker_;
975 std::unique_ptr<device_sync::FakeGcmDeviceInfoProvider>
976 fake_gcm_device_info_provider_;
977
978 std::unique_ptr<FakeEligibleHostDevicesProviderFactory>
979 fake_eligible_host_devices_provider_factory_;
980 std::unique_ptr<FakeHostBackendDelegateFactory>
981 fake_host_backend_delegate_factory_;
982 std::unique_ptr<FakeHostVerifierFactory> fake_host_verifier_factory_;
983 std::unique_ptr<FakeHostStatusProviderFactory>
984 fake_host_status_provider_factory_;
985 std::unique_ptr<FakeWifiSyncFeatureManagerFactory>
986 fake_wifi_sync_feature_manager_factory_;
987 std::unique_ptr<FakeGrandfatheredEasyUnlockHostDisablerFactory>
988 fake_grandfathered_easy_unlock_host_disabler_factory_;
989 std::unique_ptr<FakeFeatureStateManagerFactory>
990 fake_feature_state_manager_factory_;
991 std::unique_ptr<FakeHostDeviceTimestampManagerFactory>
992 fake_host_device_timestamp_manager_factory_;
993 std::unique_ptr<FakeAccountStatusChangeDelegateNotifierFactory>
994 fake_account_status_change_delegate_notifier_factory_;
995 std::unique_ptr<FakeDeviceReenrollerFactory> fake_device_reenroller_factory_;
996 std::unique_ptr<FakeAndroidSmsAppInstallingStatusObserverFactory>
997 fake_android_sms_app_installing_status_observer_factory_;
998 std::unique_ptr<FakeAndroidSmsAppHelperDelegate>
999 fake_android_sms_app_helper_delegate_;
1000 std::unique_ptr<FakeAndroidSmsPairingStateTracker>
1001 fake_android_sms_pairing_state_tracker_;
1002
1003 std::unique_ptr<FakeAccountStatusChangeDelegate>
1004 fake_account_status_change_delegate_;
1005
1006 base::test::ScopedFeatureList scoped_feature_list_;
1007
1008 base::Optional<bool> last_debug_event_success_;
1009 base::Optional<multidevice::RemoteDeviceList> last_eligible_devices_list_;
1010 base::Optional<std::vector<mojom::HostDevicePtr>>
1011 last_eligible_active_devices_list_;
1012 base::Optional<bool> last_set_host_success_;
1013 base::Optional<bool> last_set_host_without_auth_success_;
1014 base::Optional<
1015 std::pair<mojom::HostStatus, base::Optional<multidevice::RemoteDevice>>>
1016 last_host_status_;
1017 base::Optional<bool> last_set_feature_enabled_state_success_;
1018 base::Optional<base::flat_map<mojom::Feature, mojom::FeatureState>>
1019 last_get_feature_states_result_;
1020 base::Optional<bool> last_retry_success_;
1021
1022 std::unique_ptr<MultiDeviceSetupBase> multidevice_setup_;
1023
1024 DISALLOW_COPY_AND_ASSIGN(MultiDeviceSetupImplTest);
1025 };
1026
TEST_P(MultiDeviceSetupImplTest,AccountStatusChangeDelegate)1027 TEST_P(MultiDeviceSetupImplTest, AccountStatusChangeDelegate) {
1028 // All requests to trigger debug events should fail before the delegate has
1029 // been set.
1030 EXPECT_FALSE(CallTriggerEventForDebugging(
1031 mojom::EventTypeForDebugging::kNewUserPotentialHostExists));
1032 EXPECT_FALSE(CallTriggerEventForDebugging(
1033 mojom::EventTypeForDebugging::kExistingUserConnectedHostSwitched));
1034 EXPECT_FALSE(CallTriggerEventForDebugging(
1035 mojom::EventTypeForDebugging::kExistingUserNewChromebookAdded));
1036
1037 CallSetAccountStatusChangeDelegate();
1038
1039 // All debug trigger events should now succeed.
1040 EXPECT_TRUE(CallTriggerEventForDebugging(
1041 mojom::EventTypeForDebugging::kNewUserPotentialHostExists));
1042 EXPECT_EQ(1u, fake_account_status_change_delegate()
1043 ->num_new_user_potential_host_events_handled());
1044
1045 EXPECT_TRUE(CallTriggerEventForDebugging(
1046 mojom::EventTypeForDebugging::kExistingUserConnectedHostSwitched));
1047 EXPECT_EQ(1u, fake_account_status_change_delegate()
1048 ->num_existing_user_host_switched_events_handled());
1049
1050 EXPECT_TRUE(CallTriggerEventForDebugging(
1051 mojom::EventTypeForDebugging::kExistingUserNewChromebookAdded));
1052 EXPECT_EQ(1u, fake_account_status_change_delegate()
1053 ->num_existing_user_chromebook_added_events_handled());
1054 }
1055
1056 // The feature mojom::Feature::kInstantTethering is used throughout this test
1057 // because it never requires authentication for either enabling or disabling.
TEST_P(MultiDeviceSetupImplTest,FeatureStateChanges_NoAuthTokenRequired)1058 TEST_P(MultiDeviceSetupImplTest, FeatureStateChanges_NoAuthTokenRequired) {
1059 auto observer = std::make_unique<FakeFeatureStateObserver>();
1060 multidevice_setup()->AddFeatureStateObserver(observer->GenerateRemote());
1061
1062 EXPECT_EQ(mojom::FeatureState::kUnavailableNoVerifiedHost,
1063 CallGetFeatureStates()[mojom::Feature::kInstantTethering]);
1064
1065 fake_feature_state_manager()->SetFeatureState(
1066 mojom::Feature::kInstantTethering,
1067 mojom::FeatureState::kNotSupportedByChromebook);
1068 SendPendingObserverMessages();
1069 EXPECT_EQ(mojom::FeatureState::kNotSupportedByChromebook,
1070 CallGetFeatureStates()[mojom::Feature::kInstantTethering]);
1071 EXPECT_EQ(1u, observer->feature_state_updates().size());
1072
1073 fake_feature_state_manager()->SetFeatureState(
1074 mojom::Feature::kInstantTethering, mojom::FeatureState::kEnabledByUser);
1075 SendPendingObserverMessages();
1076 EXPECT_EQ(mojom::FeatureState::kEnabledByUser,
1077 CallGetFeatureStates()[mojom::Feature::kInstantTethering]);
1078 EXPECT_EQ(2u, observer->feature_state_updates().size());
1079
1080 EXPECT_TRUE(CallSetFeatureEnabledState(mojom::Feature::kInstantTethering,
1081 false /* enabled */,
1082 base::nullopt /* auth_token */));
1083 SendPendingObserverMessages();
1084 EXPECT_EQ(mojom::FeatureState::kDisabledByUser,
1085 CallGetFeatureStates()[mojom::Feature::kInstantTethering]);
1086 EXPECT_EQ(3u, observer->feature_state_updates().size());
1087 }
1088
1089 // mojom::Feature::kSmartLock requires authentication when attempting to enable.
TEST_P(MultiDeviceSetupImplTest,FeatureStateChanges_AuthTokenRequired_SmartLock)1090 TEST_P(MultiDeviceSetupImplTest,
1091 FeatureStateChanges_AuthTokenRequired_SmartLock) {
1092 auto observer = std::make_unique<FakeFeatureStateObserver>();
1093 multidevice_setup()->AddFeatureStateObserver(observer->GenerateRemote());
1094
1095 EXPECT_EQ(mojom::FeatureState::kUnavailableNoVerifiedHost,
1096 CallGetFeatureStates()[mojom::Feature::kSmartLock]);
1097
1098 fake_feature_state_manager()->SetFeatureState(
1099 mojom::Feature::kSmartLock, mojom::FeatureState::kEnabledByUser);
1100 SendPendingObserverMessages();
1101 EXPECT_EQ(mojom::FeatureState::kEnabledByUser,
1102 CallGetFeatureStates()[mojom::Feature::kSmartLock]);
1103 EXPECT_EQ(1u, observer->feature_state_updates().size());
1104
1105 // No authentication is required to disable the feature.
1106 EXPECT_TRUE(CallSetFeatureEnabledState(mojom::Feature::kSmartLock,
1107 false /* enabled */,
1108 base::nullopt /* auth_token */));
1109 SendPendingObserverMessages();
1110 EXPECT_EQ(mojom::FeatureState::kDisabledByUser,
1111 CallGetFeatureStates()[mojom::Feature::kSmartLock]);
1112 EXPECT_EQ(2u, observer->feature_state_updates().size());
1113
1114 // However, authentication is required to enable the feature.
1115 EXPECT_FALSE(CallSetFeatureEnabledState(
1116 mojom::Feature::kSmartLock, true /* enabled */, "invalidAuthToken"));
1117 SendPendingObserverMessages();
1118 EXPECT_EQ(mojom::FeatureState::kDisabledByUser,
1119 CallGetFeatureStates()[mojom::Feature::kSmartLock]);
1120 EXPECT_EQ(2u, observer->feature_state_updates().size());
1121
1122 // Now, send a valid auth token; it should successfully enable.
1123 EXPECT_TRUE(CallSetFeatureEnabledState(mojom::Feature::kSmartLock,
1124 true /* enabled */, kValidAuthToken));
1125 SendPendingObserverMessages();
1126 EXPECT_EQ(mojom::FeatureState::kEnabledByUser,
1127 CallGetFeatureStates()[mojom::Feature::kSmartLock]);
1128 EXPECT_EQ(3u, observer->feature_state_updates().size());
1129 }
1130
1131 // mojom::Feature::kBetterTogetherSuite requires authentication when attempting
1132 // to enable, but only if the Smart Lock pref is enabled.
TEST_P(MultiDeviceSetupImplTest,FeatureStateChanges_AuthTokenRequired_BetterTogetherSuite)1133 TEST_P(MultiDeviceSetupImplTest,
1134 FeatureStateChanges_AuthTokenRequired_BetterTogetherSuite) {
1135 auto observer = std::make_unique<FakeFeatureStateObserver>();
1136 multidevice_setup()->AddFeatureStateObserver(observer->GenerateRemote());
1137
1138 EXPECT_EQ(mojom::FeatureState::kUnavailableNoVerifiedHost,
1139 CallGetFeatureStates()[mojom::Feature::kBetterTogetherSuite]);
1140
1141 fake_feature_state_manager()->SetFeatureState(
1142 mojom::Feature::kBetterTogetherSuite,
1143 mojom::FeatureState::kEnabledByUser);
1144 SendPendingObserverMessages();
1145 EXPECT_EQ(mojom::FeatureState::kEnabledByUser,
1146 CallGetFeatureStates()[mojom::Feature::kBetterTogetherSuite]);
1147 EXPECT_EQ(1u, observer->feature_state_updates().size());
1148
1149 // No authentication is required to disable the feature.
1150 EXPECT_TRUE(CallSetFeatureEnabledState(mojom::Feature::kBetterTogetherSuite,
1151 false /* enabled */,
1152 base::nullopt /* auth_token */));
1153 SendPendingObserverMessages();
1154 EXPECT_EQ(mojom::FeatureState::kDisabledByUser,
1155 CallGetFeatureStates()[mojom::Feature::kBetterTogetherSuite]);
1156 EXPECT_EQ(2u, observer->feature_state_updates().size());
1157
1158 // Authentication is required to enable the feature if SmartLock's state is
1159 // kUnavailableInsufficientSecurity.
1160 fake_feature_state_manager()->SetFeatureState(
1161 mojom::Feature::kSmartLock,
1162 mojom::FeatureState::kUnavailableInsufficientSecurity);
1163 EXPECT_FALSE(CallSetFeatureEnabledState(mojom::Feature::kBetterTogetherSuite,
1164 true /* enabled */,
1165 "invalidAuthToken"));
1166 SendPendingObserverMessages();
1167 EXPECT_EQ(mojom::FeatureState::kDisabledByUser,
1168 CallGetFeatureStates()[mojom::Feature::kBetterTogetherSuite]);
1169 EXPECT_EQ(3u, observer->feature_state_updates().size());
1170
1171 // Now, send a valid auth token; it should successfully enable.
1172 EXPECT_TRUE(CallSetFeatureEnabledState(mojom::Feature::kBetterTogetherSuite,
1173 true /* enabled */, kValidAuthToken));
1174 SendPendingObserverMessages();
1175 EXPECT_EQ(mojom::FeatureState::kEnabledByUser,
1176 CallGetFeatureStates()[mojom::Feature::kBetterTogetherSuite]);
1177 EXPECT_EQ(4u, observer->feature_state_updates().size());
1178
1179 // Disable one more time.
1180 EXPECT_TRUE(CallSetFeatureEnabledState(mojom::Feature::kBetterTogetherSuite,
1181 false /* enabled */,
1182 base::nullopt /* auth_token */));
1183 SendPendingObserverMessages();
1184 EXPECT_EQ(mojom::FeatureState::kDisabledByUser,
1185 CallGetFeatureStates()[mojom::Feature::kBetterTogetherSuite]);
1186 EXPECT_EQ(5u, observer->feature_state_updates().size());
1187
1188 // Authentication is required to enable the feature if SmartLock's state is
1189 // kUnavailableSuiteDisabled.
1190 fake_feature_state_manager()->SetFeatureState(
1191 mojom::Feature::kSmartLock,
1192 mojom::FeatureState::kUnavailableSuiteDisabled);
1193 EXPECT_FALSE(CallSetFeatureEnabledState(mojom::Feature::kBetterTogetherSuite,
1194 true /* enabled */,
1195 "invalidAuthToken"));
1196 SendPendingObserverMessages();
1197 EXPECT_EQ(mojom::FeatureState::kDisabledByUser,
1198 CallGetFeatureStates()[mojom::Feature::kBetterTogetherSuite]);
1199 EXPECT_EQ(6u, observer->feature_state_updates().size());
1200
1201 // Now, send a valid auth token; it should successfully enable.
1202 EXPECT_TRUE(CallSetFeatureEnabledState(mojom::Feature::kBetterTogetherSuite,
1203 true /* enabled */, kValidAuthToken));
1204 SendPendingObserverMessages();
1205 EXPECT_EQ(mojom::FeatureState::kEnabledByUser,
1206 CallGetFeatureStates()[mojom::Feature::kBetterTogetherSuite]);
1207 EXPECT_EQ(7u, observer->feature_state_updates().size());
1208 }
1209
TEST_P(MultiDeviceSetupImplTest,ComprehensiveHostTest)1210 TEST_P(MultiDeviceSetupImplTest, ComprehensiveHostTest) {
1211 // Start with no eligible devices.
1212 EXPECT_TRUE(CallGetEligibleHostDevices().empty());
1213 VerifyCurrentHostStatus(mojom::HostStatus::kNoEligibleHosts,
1214 base::nullopt /* host_device */);
1215
1216 // Cannot retry without a host.
1217 EXPECT_FALSE(CallRetrySetHostNow());
1218
1219 // Add a status observer.
1220 auto observer = std::make_unique<FakeHostStatusObserver>();
1221 multidevice_setup()->AddHostStatusObserver(observer->GenerateRemote());
1222
1223 // Simulate a sync occurring; now, all of the test devices are eligible hosts.
1224 fake_eligible_host_devices_provider()->set_eligible_host_devices(
1225 test_devices());
1226 EXPECT_EQ(RefListToRawList(test_devices()), CallGetEligibleHostDevices());
1227 fake_host_status_provider()->SetHostWithStatus(
1228 mojom::HostStatus::kEligibleHostExistsButNoHostSet,
1229 base::nullopt /* host_device */);
1230 SendPendingObserverMessages();
1231 VerifyCurrentHostStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
1232 base::nullopt /* host_device */, observer.get(),
1233 0u /* expected_observer_index */);
1234
1235 // There are eligible hosts, but none is set; thus, cannot retry.
1236 EXPECT_FALSE(CallRetrySetHostNow());
1237
1238 // Set an invalid host as the host device; this should fail.
1239 EXPECT_FALSE(CallSetHostDevice("invalidHostDeviceId", kValidAuthToken));
1240 EXPECT_FALSE(fake_host_backend_delegate()->HasPendingHostRequest());
1241
1242 // Set device 0 as the host; this should succeed.
1243 std::string host_id = IsV1DeviceSyncEnabled()
1244 ? test_devices()[0].GetDeviceId()
1245 : test_devices()[0].instance_id();
1246 EXPECT_TRUE(CallSetHostDevice(host_id, kValidAuthToken));
1247 EXPECT_TRUE(fake_host_backend_delegate()->HasPendingHostRequest());
1248 EXPECT_EQ(test_devices()[0],
1249 fake_host_backend_delegate()->GetPendingHostRequest());
1250 fake_host_status_provider()->SetHostWithStatus(
1251 mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation,
1252 test_devices()[0]);
1253 SendPendingObserverMessages();
1254 VerifyCurrentHostStatus(
1255 mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation,
1256 test_devices()[0], observer.get(), 1u /* expected_observer_index */);
1257
1258 // It should now be possible to retry.
1259 EXPECT_TRUE(CallRetrySetHostNow());
1260
1261 // Simulate the retry succeeding and the host being set on the back-end.
1262 fake_host_backend_delegate()->NotifyHostChangedOnBackend(test_devices()[0]);
1263 fake_host_status_provider()->SetHostWithStatus(
1264 mojom::HostStatus::kHostSetButNotYetVerified, test_devices()[0]);
1265 SendPendingObserverMessages();
1266 VerifyCurrentHostStatus(mojom::HostStatus::kHostSetButNotYetVerified,
1267 test_devices()[0], observer.get(),
1268 2u /* expected_observer_index */);
1269
1270 // It should still be possible to retry (this time, retrying verification).
1271 EXPECT_TRUE(CallRetrySetHostNow());
1272
1273 // Simulate verification succeeding.
1274 fake_host_verifier()->set_is_host_verified(true);
1275 fake_host_status_provider()->SetHostWithStatus(
1276 mojom::HostStatus::kHostVerified, test_devices()[0]);
1277 SendPendingObserverMessages();
1278 VerifyCurrentHostStatus(mojom::HostStatus::kHostVerified, test_devices()[0],
1279 observer.get(), 3u /* expected_observer_index */);
1280
1281 // Remove the host.
1282 multidevice_setup()->RemoveHostDevice();
1283 fake_host_verifier()->set_is_host_verified(false);
1284 fake_host_status_provider()->SetHostWithStatus(
1285 mojom::HostStatus::kEligibleHostExistsButNoHostSet,
1286 base::nullopt /* host_device */);
1287 SendPendingObserverMessages();
1288 VerifyCurrentHostStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
1289 base::nullopt /* host_device */, observer.get(),
1290 4u /* expected_observer_index */);
1291
1292 // Simulate the host being removed on the back-end.
1293 fake_host_backend_delegate()->NotifyHostChangedOnBackend(base::nullopt);
1294 }
1295
TEST_P(MultiDeviceSetupImplTest,TestGetEligibleActiveHosts)1296 TEST_P(MultiDeviceSetupImplTest, TestGetEligibleActiveHosts) {
1297 // Start with no eligible devices.
1298 EXPECT_TRUE(CallGetEligibleActiveHostDevices().empty());
1299
1300 multidevice::DeviceWithConnectivityStatusList host_device_list;
1301 for (auto remote_device_ref : test_devices()) {
1302 host_device_list.emplace_back(multidevice::DeviceWithConnectivityStatus(
1303 remote_device_ref, cryptauthv2::ConnectivityStatus::ONLINE));
1304 }
1305 // Simulate a sync occurring; now, all of the test devices are eligible hosts.
1306 fake_eligible_host_devices_provider()->set_eligible_active_host_devices(
1307 host_device_list);
1308
1309 std::vector<mojom::HostDevicePtr> result_hosts =
1310 CallGetEligibleActiveHostDevices();
1311 for (size_t i = 0; i < kNumTestDevices; i++) {
1312 EXPECT_EQ(*GetMutableRemoteDevice(test_devices()[i]),
1313 result_hosts[i]->remote_device);
1314 EXPECT_EQ(cryptauthv2::ConnectivityStatus::ONLINE,
1315 result_hosts[i]->connectivity_status);
1316 }
1317 }
1318
TEST_P(MultiDeviceSetupImplTest,TestSetHostDevice_InvalidAuthToken)1319 TEST_P(MultiDeviceSetupImplTest, TestSetHostDevice_InvalidAuthToken) {
1320 // Start valid eligible host devices.
1321 fake_eligible_host_devices_provider()->set_eligible_host_devices(
1322 test_devices());
1323 EXPECT_EQ(RefListToRawList(test_devices()), CallGetEligibleHostDevices());
1324 fake_host_status_provider()->SetHostWithStatus(
1325 mojom::HostStatus::kEligibleHostExistsButNoHostSet,
1326 base::nullopt /* host_device */);
1327
1328 // Set a valid host as the host device, but pass an invalid token.
1329 std::string host_id = IsV1DeviceSyncEnabled()
1330 ? test_devices()[0].GetDeviceId()
1331 : test_devices()[0].instance_id();
1332 EXPECT_FALSE(CallSetHostDevice(host_id, "invalidAuthToken"));
1333 EXPECT_FALSE(fake_host_backend_delegate()->HasPendingHostRequest());
1334 }
1335
TEST_P(MultiDeviceSetupImplTest,TestSetHostDeviceWithoutAuthToken)1336 TEST_P(MultiDeviceSetupImplTest, TestSetHostDeviceWithoutAuthToken) {
1337 // Add a status observer.
1338 auto observer = std::make_unique<FakeHostStatusObserver>();
1339 multidevice_setup()->AddHostStatusObserver(observer->GenerateRemote());
1340
1341 // Start valid eligible host devices.
1342 fake_eligible_host_devices_provider()->set_eligible_host_devices(
1343 test_devices());
1344 EXPECT_EQ(RefListToRawList(test_devices()), CallGetEligibleHostDevices());
1345 fake_host_status_provider()->SetHostWithStatus(
1346 mojom::HostStatus::kEligibleHostExistsButNoHostSet,
1347 base::nullopt /* host_device */);
1348 SendPendingObserverMessages();
1349 VerifyCurrentHostStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
1350 base::nullopt /* host_device */, observer.get(),
1351 0u /* expected_observer_index */);
1352
1353 // Set a valid host as the host device without an auth token.
1354 std::string host_id = IsV1DeviceSyncEnabled()
1355 ? test_devices()[0].GetDeviceId()
1356 : test_devices()[0].instance_id();
1357 EXPECT_TRUE(CallSetHostDeviceWithoutAuth(host_id));
1358 EXPECT_TRUE(fake_host_backend_delegate()->HasPendingHostRequest());
1359 EXPECT_EQ(test_devices()[0],
1360 fake_host_backend_delegate()->GetPendingHostRequest());
1361 fake_host_status_provider()->SetHostWithStatus(
1362 mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation,
1363 test_devices()[0]);
1364 SendPendingObserverMessages();
1365 VerifyCurrentHostStatus(
1366 mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation,
1367 test_devices()[0], observer.get(), 1u /* expected_observer_index */);
1368 }
1369
TEST_P(MultiDeviceSetupImplTest,TestSetHostDevice_AcceptInstanceIdOrLegacyDeviceId)1370 TEST_P(MultiDeviceSetupImplTest,
1371 TestSetHostDevice_AcceptInstanceIdOrLegacyDeviceId) {
1372 // We can set the host using the legacy device ID or the Instance ID if and
1373 // only if v1 DeviceSync is enabled.
1374 if (!IsV1DeviceSyncEnabled())
1375 return;
1376
1377 // Add a status observer.
1378 auto observer = std::make_unique<FakeHostStatusObserver>();
1379 multidevice_setup()->AddHostStatusObserver(observer->GenerateRemote());
1380
1381 // Start valid eligible host devices.
1382 fake_eligible_host_devices_provider()->set_eligible_host_devices(
1383 test_devices());
1384 EXPECT_EQ(RefListToRawList(test_devices()), CallGetEligibleHostDevices());
1385 fake_host_status_provider()->SetHostWithStatus(
1386 mojom::HostStatus::kEligibleHostExistsButNoHostSet,
1387 base::nullopt /* host_device */);
1388 SendPendingObserverMessages();
1389 VerifyCurrentHostStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
1390 base::nullopt /* host_device */, observer.get(),
1391 0u /* expected_observer_index */);
1392
1393 // Set the host device using its legacy device ID.
1394 EXPECT_TRUE(
1395 CallSetHostDevice(test_devices()[0].GetDeviceId(), kValidAuthToken));
1396 EXPECT_TRUE(fake_host_backend_delegate()->HasPendingHostRequest());
1397 EXPECT_EQ(test_devices()[0],
1398 fake_host_backend_delegate()->GetPendingHostRequest());
1399 fake_host_status_provider()->SetHostWithStatus(
1400 mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation,
1401 test_devices()[0]);
1402 SendPendingObserverMessages();
1403 VerifyCurrentHostStatus(
1404 mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation,
1405 test_devices()[0], observer.get(), 1u /* expected_observer_index */);
1406
1407 // Set the host device using its Instance ID.
1408 EXPECT_TRUE(
1409 CallSetHostDevice(test_devices()[1].instance_id(), kValidAuthToken));
1410 EXPECT_TRUE(fake_host_backend_delegate()->HasPendingHostRequest());
1411 EXPECT_EQ(test_devices()[1],
1412 fake_host_backend_delegate()->GetPendingHostRequest());
1413 fake_host_status_provider()->SetHostWithStatus(
1414 mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation,
1415 test_devices()[1]);
1416 SendPendingObserverMessages();
1417 VerifyCurrentHostStatus(
1418 mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation,
1419 test_devices()[1], observer.get(), 2u /* expected_observer_index */);
1420 }
1421
1422 // Runs tests twice; once with v1 DeviceSync enabled and once with it disabled.
1423 // TODO(https://crbug.com/1019206): Remove when v1 DeviceSync is disabled,
1424 // when all devices should have an Instance ID.
1425 INSTANTIATE_TEST_SUITE_P(All, MultiDeviceSetupImplTest, ::testing::Bool());
1426
1427 } // namespace multidevice_setup
1428
1429 } // namespace chromeos
1430