Index: components/sync/engine_impl/model_type_worker_unittest.cc |
diff --git a/components/sync/engine_impl/model_type_worker_unittest.cc b/components/sync/engine_impl/model_type_worker_unittest.cc |
index f9029eda2abd0e8c9745b005919237e854abac35..fccad4fb12fdd01c7569a14e548de7cc35c4f401 100644 |
--- a/components/sync/engine_impl/model_type_worker_unittest.cc |
+++ b/components/sync/engine_impl/model_type_worker_unittest.cc |
@@ -281,11 +281,10 @@ class ModelTypeWorkerTest : public ::testing::Test { |
void TriggerTypeRootUpdateFromServer() { |
sync_pb::SyncEntity entity = mock_server_.TypeRootUpdate(); |
- StatusController dummy_status; |
worker_->ProcessGetUpdatesResponse(mock_server_.GetProgress(), |
mock_server_.GetContext(), {&entity}, |
- &dummy_status); |
- worker_->PassiveApplyUpdates(&dummy_status); |
+ nullptr); |
+ worker_->PassiveApplyUpdates(nullptr); |
} |
void TriggerPartialUpdateFromServer(int64_t version_offset, |
@@ -299,18 +298,16 @@ class ModelTypeWorkerTest : public ::testing::Test { |
entity.mutable_specifics()); |
} |
- StatusController dummy_status; |
worker_->ProcessGetUpdatesResponse(mock_server_.GetProgress(), |
mock_server_.GetContext(), {&entity}, |
- &dummy_status); |
+ nullptr); |
} |
void TriggerUpdateFromServer(int64_t version_offset, |
const std::string& tag, |
const std::string& value) { |
TriggerPartialUpdateFromServer(version_offset, tag, value); |
- StatusController dummy_status; |
- worker_->ApplyUpdates(&dummy_status); |
+ worker_->ApplyUpdates(nullptr); |
} |
void TriggerTombstoneFromServer(int64_t version_offset, |
@@ -323,11 +320,10 @@ class ModelTypeWorkerTest : public ::testing::Test { |
entity.mutable_specifics()); |
} |
- StatusController dummy_status; |
worker_->ProcessGetUpdatesResponse(mock_server_.GetProgress(), |
mock_server_.GetContext(), {&entity}, |
- &dummy_status); |
- worker_->ApplyUpdates(&dummy_status); |
+ nullptr); |
+ worker_->ApplyUpdates(nullptr); |
} |
// Delivers specified protos as updates. |
@@ -336,11 +332,9 @@ class ModelTypeWorkerTest : public ::testing::Test { |
// writing test cases that require entities that don't fit the normal sync |
// protocol. Try to use the other, higher level methods if possible. |
void DeliverRawUpdates(const SyncEntityList& list) { |
- StatusController dummy_status; |
- worker_->ProcessGetUpdatesResponse(mock_server_.GetProgress(), |
- mock_server_.GetContext(), list, |
- &dummy_status); |
- worker_->ApplyUpdates(&dummy_status); |
+ worker_->ProcessGetUpdatesResponse( |
+ mock_server_.GetProgress(), mock_server_.GetContext(), list, nullptr); |
+ worker_->ApplyUpdates(nullptr); |
} |
// By default, this harness behaves as if all tasks posted to the model |
@@ -385,8 +379,7 @@ class ModelTypeWorkerTest : public ::testing::Test { |
sync_pb::ClientToServerResponse response = |
mock_server_.DoSuccessfulCommit(message); |
- StatusController dummy_status; |
- contribution->ProcessCommitResponse(response, &dummy_status); |
+ contribution->ProcessCommitResponse(response, nullptr); |
contribution->CleanUp(); |
} |
@@ -695,6 +688,18 @@ TEST_F(ModelTypeWorkerTest, ReceiveMultiPartUpdates) { |
EXPECT_EQ(GenerateTagHash(kTag3), updates[0].entity->client_tag_hash); |
} |
+// Test that updates with no entities behave correctly. |
+TEST_F(ModelTypeWorkerTest, EmptyUpdates) { |
+ NormalInitialize(); |
+ |
+ server()->SetProgressMarkerToken("token2"); |
+ DeliverRawUpdates(SyncEntityList()); |
+ ASSERT_EQ(1U, processor()->GetNumUpdateResponses()); |
+ ASSERT_EQ( |
+ server()->GetProgress().SerializeAsString(), |
+ processor()->GetNthUpdateState(0).progress_marker().SerializeAsString()); |
+} |
+ |
// Test commit of encrypted updates. |
TEST_F(ModelTypeWorkerTest, EncryptedCommit) { |
NormalInitialize(); |
@@ -728,6 +733,54 @@ TEST_F(ModelTypeWorkerTest, EncryptedCommit) { |
EXPECT_FALSE(tag1_entity.specifics().preference().has_value()); |
} |
+// Test creating multiple encryption keys. Even when if the cryptographer thinks |
+// the world is okay, if we have an entity that is not decryptable, everything |
+// should still be blocked. |
+TEST_F(ModelTypeWorkerTest, MultipleEncryptionKeys) { |
+ NormalInitialize(); |
+ |
+ SetUpdateEncryptionFilter(2); |
+ server()->SetProgressMarkerToken("token2"); |
+ TriggerUpdateFromServer(10, kTag1, kValue1); |
+ ASSERT_EQ(0U, processor()->GetNumUpdateResponses()); |
+ |
+ NewForeignEncryptionKey(); |
+ UpdateLocalCryptographer(); |
+ ASSERT_EQ(0U, processor()->GetNumUpdateResponses()); |
+ |
+ NewForeignEncryptionKey(); |
+ UpdateLocalCryptographer(); |
+ ASSERT_EQ(1U, processor()->GetNumUpdateResponses()); |
+ UpdateResponseDataList updates_list = processor()->GetNthUpdateResponse(0); |
+ EXPECT_EQ(1U, updates_list.size()); |
+ ASSERT_EQ( |
+ server()->GetProgress().SerializeAsString(), |
+ processor()->GetNthUpdateState(0).progress_marker().SerializeAsString()); |
+} |
+ |
+// Test that updates are not delivered to the processor when encryption is |
+// required but unavailable. |
+TEST_F(ModelTypeWorkerTest, EncryptionBlocksUpdates) { |
+ NormalInitialize(); |
+ |
+ // Update encryption key name, should be blocked. |
+ NewForeignEncryptionKey(); |
+ ASSERT_EQ(0U, processor()->GetNumUpdateResponses()); |
+ |
+ // Update progress marker, should be blocked. |
+ server()->SetProgressMarkerToken("token2"); |
+ DeliverRawUpdates(SyncEntityList()); |
+ ASSERT_EQ(0U, processor()->GetNumUpdateResponses()); |
+ |
+ // Update local cryptographer, verify everything is pushed to processor. |
+ UpdateLocalCryptographer(); |
+ ASSERT_EQ(1U, processor()->GetNumUpdateResponses()); |
+ UpdateResponseDataList updates_list = processor()->GetNthUpdateResponse(0); |
+ ASSERT_EQ( |
+ server()->GetProgress().SerializeAsString(), |
+ processor()->GetNthUpdateState(0).progress_marker().SerializeAsString()); |
+} |
+ |
// Test items are not committed when encryption is required but unavailable. |
TEST_F(ModelTypeWorkerTest, EncryptionBlocksCommits) { |
NormalInitialize(); |
@@ -821,11 +874,8 @@ TEST_F(ModelTypeWorkerTest, ReceiveUndecryptableEntries) { |
TriggerUpdateFromServer(10, kTag1, kValue1); |
// At this point, the cryptographer does not have access to the key, so the |
- // updates will be undecryptable. They'll be transfered to the model thread |
- // for safe-keeping as pending updates. |
- ASSERT_EQ(1U, processor()->GetNumUpdateResponses()); |
- UpdateResponseDataList updates_list = processor()->GetNthUpdateResponse(0); |
- EXPECT_EQ(0U, updates_list.size()); |
+ // updates will be undecryptable. This will block all updates. |
+ ASSERT_EQ(0U, processor()->GetNumUpdateResponses()); |
// The update will be delivered as soon as decryption becomes possible. |
UpdateLocalCryptographer(); |
@@ -846,7 +896,9 @@ TEST_F(ModelTypeWorkerTest, EncryptedUpdateOverridesPendingCommit) { |
// Receive an encrypted update for that item. |
SetUpdateEncryptionFilter(1); |
+ NewForeignEncryptionKey(); |
TriggerUpdateFromServer(10, kTag1, kValue1); |
+ UpdateLocalCryptographer(); |
// The pending commit state should be cleared. |
EXPECT_FALSE(WillCommit()); |
@@ -854,7 +906,7 @@ TEST_F(ModelTypeWorkerTest, EncryptedUpdateOverridesPendingCommit) { |
// The encrypted update will be delivered to the model thread. |
ASSERT_EQ(1U, processor()->GetNumUpdateResponses()); |
UpdateResponseDataList updates_list = processor()->GetNthUpdateResponse(0); |
- EXPECT_EQ(0U, updates_list.size()); |
+ EXPECT_EQ(1U, updates_list.size()); |
} |
// Commit twice, both times with the kUncommittedVersion base version. Then |