Commit bb08bbcf authored by Ryan Hansberry's avatar Ryan Hansberry Committed by Commit Bot

[CrOS Multidevice] Make DeviceSyncClientImpl retry GetLocalMetadata() once devices are synced.

R=khorimoto@chromium.org

Bug: 824568, 752273
Change-Id: I686f20e3933d35d58d94a5d83f89d5e171882b70
Reviewed-on: https://chromium-review.googlesource.com/1089373Reviewed-by: default avatarKyle Horimoto <khorimoto@chromium.org>
Commit-Queue: Ryan Hansberry <hansberry@chromium.org>
Cr-Commit-Position: refs/heads/master@{#565015}
parent eb4300c3
...@@ -153,6 +153,11 @@ void DeviceSyncClientImpl::OnGetSyncedDevicesCompleted( ...@@ -153,6 +153,11 @@ void DeviceSyncClientImpl::OnGetSyncedDevicesCompleted(
return; return;
} }
if (waiting_for_local_device_metadata_) {
waiting_for_local_device_metadata_ = false;
LoadLocalDeviceMetadata();
}
expiring_device_cache_->SetRemoteDevicesAndInvalidateOldEntries( expiring_device_cache_->SetRemoteDevicesAndInvalidateOldEntries(
*remote_devices); *remote_devices);
...@@ -165,6 +170,7 @@ void DeviceSyncClientImpl::OnGetLocalDeviceMetadataCompleted( ...@@ -165,6 +170,7 @@ void DeviceSyncClientImpl::OnGetLocalDeviceMetadataCompleted(
PA_LOG(INFO) << "Tried to get local device metadata before service was " PA_LOG(INFO) << "Tried to get local device metadata before service was "
"fully initialized; waiting for enrollment to complete " "fully initialized; waiting for enrollment to complete "
"before continuing."; "before continuing.";
waiting_for_local_device_metadata_ = true;
return; return;
} }
......
...@@ -100,6 +100,8 @@ class DeviceSyncClientImpl : public DeviceSyncClient, ...@@ -100,6 +100,8 @@ class DeviceSyncClientImpl : public DeviceSyncClient,
mojom::DeviceSyncPtr device_sync_ptr_; mojom::DeviceSyncPtr device_sync_ptr_;
mojo::Binding<mojom::DeviceSyncObserver> binding_; mojo::Binding<mojom::DeviceSyncObserver> binding_;
std::unique_ptr<cryptauth::ExpiringRemoteDeviceCache> expiring_device_cache_; std::unique_ptr<cryptauth::ExpiringRemoteDeviceCache> expiring_device_cache_;
bool waiting_for_local_device_metadata_ = false;
base::Optional<std::string> local_device_id_; base::Optional<std::string> local_device_id_;
base::WeakPtrFactory<DeviceSyncClientImpl> weak_ptr_factory_; base::WeakPtrFactory<DeviceSyncClientImpl> weak_ptr_factory_;
......
...@@ -458,6 +458,52 @@ TEST_F(DeviceSyncClientImplTest, ...@@ -458,6 +458,52 @@ TEST_F(DeviceSyncClientImplTest,
InitializeClient(false /* complete_enrollment_before_sync */); InitializeClient(false /* complete_enrollment_before_sync */);
} }
TEST_F(
DeviceSyncClientImplTest,
TestCompleteInitialEnrollmentBeforeInitialSync_WaitForLocalDeviceMetadata) {
client_->AddObserver(test_observer_.get());
SendPendingMojoMessages();
EXPECT_FALSE(client_->GetLocalDeviceMetadata());
EXPECT_EQ(0u, test_observer_->enrollment_finished_count());
// Simulate local device metadata not being ready. It will be ready once
// synced devices are returned, at which point |client_| should call
// GetLocalMetadata() again.
fake_device_sync_->InvokePendingGetLocalDeviceMetadataCallback(base::nullopt);
EXPECT_FALSE(client_->GetLocalDeviceMetadata());
EXPECT_EQ(0u, test_observer_->enrollment_finished_count());
EXPECT_EQ(0u, client_->GetSyncedDevices().size());
EXPECT_EQ(0u, test_observer_->new_devices_synced_count());
base::RunLoop sync_run_loop;
test_observer_->set_closure_for_new_devices_synced(
sync_run_loop.QuitClosure());
fake_device_sync_->InvokePendingGetSyncedDevicesCallback(
test_remote_device_list_);
sync_run_loop.Run();
VerifyRemoteDeviceRefListAndRemoteDeviceListAreEqual(
client_->GetSyncedDevices(), test_remote_device_list_);
EXPECT_EQ(1u, test_observer_->new_devices_synced_count());
SendPendingMojoMessages();
base::RunLoop get_local_metadata_run_loop;
test_observer_->set_closure_for_enrollment_finished(
get_local_metadata_run_loop.QuitClosure());
fake_device_sync_->InvokePendingGetLocalDeviceMetadataCallback(
test_remote_device_list_[0]);
get_local_metadata_run_loop.Run();
EXPECT_EQ(test_remote_device_list_[0].public_key,
client_->GetLocalDeviceMetadata()->public_key());
EXPECT_EQ(1u, test_observer_->enrollment_finished_count());
}
TEST_F(DeviceSyncClientImplTest, TestOnEnrollmentFinished) { TEST_F(DeviceSyncClientImplTest, TestOnEnrollmentFinished) {
EXPECT_EQ(0u, test_observer_->enrollment_finished_count()); EXPECT_EQ(0u, test_observer_->enrollment_finished_count());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment