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