Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: components/sync/engine_impl/apply_control_data_updates_unittest.cc

Issue 2130453004: [Sync] Move //sync to //components/sync. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "sync/engine/apply_control_data_updates.h" 5 #include "components/sync/engine_impl/apply_control_data_updates.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <memory> 10 #include <memory>
11 #include <string> 11 #include <string>
12 12
13 #include "base/format_macros.h" 13 #include "base/format_macros.h"
14 #include "base/location.h" 14 #include "base/location.h"
15 #include "base/macros.h" 15 #include "base/macros.h"
16 #include "base/message_loop/message_loop.h" 16 #include "base/message_loop/message_loop.h"
17 #include "base/strings/stringprintf.h" 17 #include "base/strings/stringprintf.h"
18 #include "sync/engine/syncer.h" 18 #include "components/sync/base/cryptographer.h"
19 #include "sync/engine/syncer_util.h" 19 #include "components/sync/core/test/test_entry_factory.h"
20 #include "sync/internal_api/public/test/test_entry_factory.h" 20 #include "components/sync/engine_impl/syncer.h"
21 #include "sync/protocol/nigori_specifics.pb.h" 21 #include "components/sync/engine_impl/syncer_util.h"
22 #include "sync/syncable/directory.h" 22 #include "components/sync/protocol/nigori_specifics.pb.h"
23 #include "sync/syncable/mutable_entry.h" 23 #include "components/sync/syncable/directory.h"
24 #include "sync/syncable/nigori_util.h" 24 #include "components/sync/syncable/mutable_entry.h"
25 #include "sync/syncable/syncable_read_transaction.h" 25 #include "components/sync/syncable/nigori_util.h"
26 #include "sync/syncable/syncable_util.h" 26 #include "components/sync/syncable/syncable_read_transaction.h"
27 #include "sync/syncable/syncable_write_transaction.h" 27 #include "components/sync/syncable/syncable_util.h"
28 #include "sync/test/engine/fake_model_worker.h" 28 #include "components/sync/syncable/syncable_write_transaction.h"
29 #include "sync/test/engine/test_directory_setter_upper.h" 29 #include "components/sync/test/engine/fake_model_worker.h"
30 #include "sync/test/engine/test_id_factory.h" 30 #include "components/sync/test/engine/test_directory_setter_upper.h"
31 #include "sync/test/fake_sync_encryption_handler.h" 31 #include "components/sync/test/engine/test_id_factory.h"
32 #include "sync/util/cryptographer.h" 32 #include "components/sync/test/fake_sync_encryption_handler.h"
33 #include "testing/gtest/include/gtest/gtest.h" 33 #include "testing/gtest/include/gtest/gtest.h"
34 34
35 namespace syncer { 35 namespace syncer {
36 36
37 using syncable::MutableEntry; 37 using syncable::MutableEntry;
38 using syncable::UNITTEST; 38 using syncable::UNITTEST;
39 using syncable::Id; 39 using syncable::Id;
40 40
41 class ApplyControlDataUpdatesTest : public ::testing::Test { 41 class ApplyControlDataUpdatesTest : public ::testing::Test {
42 public: 42 public:
43 protected: 43 protected:
44 ApplyControlDataUpdatesTest() {} 44 ApplyControlDataUpdatesTest() {}
45 ~ApplyControlDataUpdatesTest() override {} 45 ~ApplyControlDataUpdatesTest() override {}
46 46
47 void SetUp() override { 47 void SetUp() override {
48 dir_maker_.SetUp(); 48 dir_maker_.SetUp();
49 entry_factory_.reset(new TestEntryFactory(directory())); 49 entry_factory_.reset(new TestEntryFactory(directory()));
50 } 50 }
51 51
52 void TearDown() override { dir_maker_.TearDown(); } 52 void TearDown() override { dir_maker_.TearDown(); }
53 53
54 syncable::Directory* directory() { 54 syncable::Directory* directory() { return dir_maker_.directory(); }
55 return dir_maker_.directory();
56 }
57 55
58 TestIdFactory id_factory_; 56 TestIdFactory id_factory_;
59 std::unique_ptr<TestEntryFactory> entry_factory_; 57 std::unique_ptr<TestEntryFactory> entry_factory_;
60 58
61 private: 59 private:
62 base::MessageLoop loop_; // Needed for directory init. 60 base::MessageLoop loop_; // Needed for directory init.
63 TestDirectorySetterUpper dir_maker_; 61 TestDirectorySetterUpper dir_maker_;
64 62
65 DISALLOW_COPY_AND_ASSIGN(ApplyControlDataUpdatesTest); 63 DISALLOW_COPY_AND_ASSIGN(ApplyControlDataUpdatesTest);
66 }; 64 };
(...skipping 16 matching lines...) Expand all
83 81
84 // Nigori node updates should update the Cryptographer. 82 // Nigori node updates should update the Cryptographer.
85 Cryptographer other_cryptographer(cryptographer->encryptor()); 83 Cryptographer other_cryptographer(cryptographer->encryptor());
86 KeyParams params = {"localhost", "dummy", "foobar"}; 84 KeyParams params = {"localhost", "dummy", "foobar"};
87 other_cryptographer.AddKey(params); 85 other_cryptographer.AddKey(params);
88 86
89 sync_pb::EntitySpecifics specifics; 87 sync_pb::EntitySpecifics specifics;
90 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori(); 88 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
91 other_cryptographer.GetKeys(nigori->mutable_encryption_keybag()); 89 other_cryptographer.GetKeys(nigori->mutable_encryption_keybag());
92 nigori->set_encrypt_everything(true); 90 nigori->set_encrypt_everything(true);
93 entry_factory_->CreateUnappliedNewItem( 91 entry_factory_->CreateUnappliedNewItem(ModelTypeToRootTag(NIGORI), specifics,
94 ModelTypeToRootTag(NIGORI), specifics, true); 92 true);
95 EXPECT_FALSE(cryptographer->has_pending_keys()); 93 EXPECT_FALSE(cryptographer->has_pending_keys());
96 94
97 ApplyControlDataUpdates(directory()); 95 ApplyControlDataUpdates(directory());
98 96
99 EXPECT_FALSE(cryptographer->is_ready()); 97 EXPECT_FALSE(cryptographer->is_ready());
100 EXPECT_TRUE(cryptographer->has_pending_keys()); 98 EXPECT_TRUE(cryptographer->has_pending_keys());
101 { 99 {
102 syncable::ReadTransaction trans(FROM_HERE, directory()); 100 syncable::ReadTransaction trans(FROM_HERE, directory());
103 EXPECT_EQ(ModelTypeSet::All(), 101 EXPECT_EQ(ModelTypeSet::All(),
104 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 102 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 true, BOOKMARKS, NULL); 135 true, BOOKMARKS, NULL);
138 // Next five items are children of the folder 136 // Next five items are children of the folder
139 size_t i; 137 size_t i;
140 size_t batch_s = 5; 138 size_t batch_s = 5;
141 for (i = 0; i < batch_s; ++i) { 139 for (i = 0; i < batch_s; ++i) {
142 entry_factory_->CreateUnsyncedItem(id_factory_.NewLocalId(), folder_id, 140 entry_factory_->CreateUnsyncedItem(id_factory_.NewLocalId(), folder_id,
143 base::StringPrintf("Item %" PRIuS "", i), 141 base::StringPrintf("Item %" PRIuS "", i),
144 false, BOOKMARKS, NULL); 142 false, BOOKMARKS, NULL);
145 } 143 }
146 // Next five items are children of the root. 144 // Next five items are children of the root.
147 for (; i < 2*batch_s; ++i) { 145 for (; i < 2 * batch_s; ++i) {
148 entry_factory_->CreateUnsyncedItem( 146 entry_factory_->CreateUnsyncedItem(
149 id_factory_.NewLocalId(), id_factory_.root(), 147 id_factory_.NewLocalId(), id_factory_.root(),
150 base::StringPrintf("Item %" PRIuS "", i), false, 148 base::StringPrintf("Item %" PRIuS "", i), false, BOOKMARKS, NULL);
151 BOOKMARKS, NULL);
152 } 149 }
153 150
154 KeyParams params = {"localhost", "dummy", "foobar"}; 151 KeyParams params = {"localhost", "dummy", "foobar"};
155 cryptographer->AddKey(params); 152 cryptographer->AddKey(params);
156 sync_pb::EntitySpecifics specifics; 153 sync_pb::EntitySpecifics specifics;
157 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori(); 154 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
158 cryptographer->GetKeys(nigori->mutable_encryption_keybag()); 155 cryptographer->GetKeys(nigori->mutable_encryption_keybag());
159 nigori->set_encrypt_everything(true); 156 nigori->set_encrypt_everything(true);
160 encrypted_types.Put(BOOKMARKS); 157 encrypted_types.Put(BOOKMARKS);
161 entry_factory_->CreateUnappliedNewItem( 158 entry_factory_->CreateUnappliedNewItem(ModelTypeToRootTag(NIGORI), specifics,
162 ModelTypeToRootTag(NIGORI), specifics, true); 159 true);
163 EXPECT_FALSE(cryptographer->has_pending_keys()); 160 EXPECT_FALSE(cryptographer->has_pending_keys());
164 EXPECT_TRUE(cryptographer->is_ready()); 161 EXPECT_TRUE(cryptographer->is_ready());
165 162
166 { 163 {
167 // Ensure we have unsynced nodes that aren't properly encrypted. 164 // Ensure we have unsynced nodes that aren't properly encrypted.
168 syncable::ReadTransaction trans(FROM_HERE, directory()); 165 syncable::ReadTransaction trans(FROM_HERE, directory());
169 EXPECT_FALSE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types)); 166 EXPECT_FALSE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types));
170 167
171 Syncer::UnsyncedMetaHandles handles; 168 Syncer::UnsyncedMetaHandles handles;
172 GetUnsyncedEntries(&trans, &handles); 169 GetUnsyncedEntries(&trans, &handles);
173 EXPECT_EQ(2*batch_s+1, handles.size()); 170 EXPECT_EQ(2 * batch_s + 1, handles.size());
174 } 171 }
175 172
176 ApplyControlDataUpdates(directory()); 173 ApplyControlDataUpdates(directory());
177 174
178 EXPECT_FALSE(cryptographer->has_pending_keys()); 175 EXPECT_FALSE(cryptographer->has_pending_keys());
179 EXPECT_TRUE(cryptographer->is_ready()); 176 EXPECT_TRUE(cryptographer->is_ready());
180 { 177 {
181 syncable::ReadTransaction trans(FROM_HERE, directory()); 178 syncable::ReadTransaction trans(FROM_HERE, directory());
182 179
183 // If ProcessUnsyncedChangesForEncryption worked, all our unsynced changes 180 // If ProcessUnsyncedChangesForEncryption worked, all our unsynced changes
184 // should be encrypted now. 181 // should be encrypted now.
185 EXPECT_EQ(ModelTypeSet::All(), 182 EXPECT_EQ(ModelTypeSet::All(),
186 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 183 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
187 EXPECT_TRUE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types)); 184 EXPECT_TRUE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types));
188 185
189 Syncer::UnsyncedMetaHandles handles; 186 Syncer::UnsyncedMetaHandles handles;
190 GetUnsyncedEntries(&trans, &handles); 187 GetUnsyncedEntries(&trans, &handles);
191 EXPECT_EQ(2*batch_s+1, handles.size()); 188 EXPECT_EQ(2 * batch_s + 1, handles.size());
192 } 189 }
193 190
194 // Simulate another nigori update that doesn't change anything. 191 // Simulate another nigori update that doesn't change anything.
195 { 192 {
196 syncable::WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 193 syncable::WriteTransaction trans(FROM_HERE, UNITTEST, directory());
197 MutableEntry entry(&trans, syncable::GET_TYPE_ROOT, NIGORI); 194 MutableEntry entry(&trans, syncable::GET_TYPE_ROOT, NIGORI);
198 ASSERT_TRUE(entry.good()); 195 ASSERT_TRUE(entry.good());
199 entry.PutServerVersion(entry_factory_->GetNextRevision()); 196 entry.PutServerVersion(entry_factory_->GetNextRevision());
200 entry.PutIsUnappliedUpdate(true); 197 entry.PutIsUnappliedUpdate(true);
201 } 198 }
202 199
203 ApplyControlDataUpdates(directory()); 200 ApplyControlDataUpdates(directory());
204 201
205 EXPECT_FALSE(cryptographer->has_pending_keys()); 202 EXPECT_FALSE(cryptographer->has_pending_keys());
206 EXPECT_TRUE(cryptographer->is_ready()); 203 EXPECT_TRUE(cryptographer->is_ready());
207 { 204 {
208 syncable::ReadTransaction trans(FROM_HERE, directory()); 205 syncable::ReadTransaction trans(FROM_HERE, directory());
209 206
210 // All our changes should still be encrypted. 207 // All our changes should still be encrypted.
211 EXPECT_EQ(ModelTypeSet::All(), 208 EXPECT_EQ(ModelTypeSet::All(),
212 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 209 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
213 EXPECT_TRUE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types)); 210 EXPECT_TRUE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types));
214 211
215 Syncer::UnsyncedMetaHandles handles; 212 Syncer::UnsyncedMetaHandles handles;
216 GetUnsyncedEntries(&trans, &handles); 213 GetUnsyncedEntries(&trans, &handles);
217 EXPECT_EQ(2*batch_s+1, handles.size()); 214 EXPECT_EQ(2 * batch_s + 1, handles.size());
218 } 215 }
219 } 216 }
220 217
221 // Create some local unsynced and unencrypted changes. Receive a new nigori 218 // Create some local unsynced and unencrypted changes. Receive a new nigori
222 // node enabling their encryption but also introducing pending keys. Ensure 219 // node enabling their encryption but also introducing pending keys. Ensure
223 // we apply the update properly without encrypting the unsynced changes or 220 // we apply the update properly without encrypting the unsynced changes or
224 // breaking. 221 // breaking.
225 TEST_F(ApplyControlDataUpdatesTest, CannotEncryptUnsyncedChanges) { 222 TEST_F(ApplyControlDataUpdatesTest, CannotEncryptUnsyncedChanges) {
226 // Storing the cryptographer separately is bad, but for this test we 223 // Storing the cryptographer separately is bad, but for this test we
227 // know it's safe. 224 // know it's safe.
(...skipping 10 matching lines...) Expand all
238 EXPECT_TRUE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types)); 235 EXPECT_TRUE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types));
239 236
240 Syncer::UnsyncedMetaHandles handles; 237 Syncer::UnsyncedMetaHandles handles;
241 GetUnsyncedEntries(&trans, &handles); 238 GetUnsyncedEntries(&trans, &handles);
242 EXPECT_TRUE(handles.empty()); 239 EXPECT_TRUE(handles.empty());
243 } 240 }
244 241
245 // Create unsynced bookmarks without encryption. 242 // Create unsynced bookmarks without encryption.
246 // First item is a folder 243 // First item is a folder
247 Id folder_id = id_factory_.NewLocalId(); 244 Id folder_id = id_factory_.NewLocalId();
248 entry_factory_->CreateUnsyncedItem( 245 entry_factory_->CreateUnsyncedItem(folder_id, id_factory_.root(), "folder",
249 folder_id, id_factory_.root(), "folder", true, 246 true, BOOKMARKS, NULL);
250 BOOKMARKS, NULL);
251 // Next five items are children of the folder 247 // Next five items are children of the folder
252 size_t i; 248 size_t i;
253 size_t batch_s = 5; 249 size_t batch_s = 5;
254 for (i = 0; i < batch_s; ++i) { 250 for (i = 0; i < batch_s; ++i) {
255 entry_factory_->CreateUnsyncedItem(id_factory_.NewLocalId(), folder_id, 251 entry_factory_->CreateUnsyncedItem(id_factory_.NewLocalId(), folder_id,
256 base::StringPrintf("Item %" PRIuS "", i), 252 base::StringPrintf("Item %" PRIuS "", i),
257 false, BOOKMARKS, NULL); 253 false, BOOKMARKS, NULL);
258 } 254 }
259 // Next five items are children of the root. 255 // Next five items are children of the root.
260 for (; i < 2*batch_s; ++i) { 256 for (; i < 2 * batch_s; ++i) {
261 entry_factory_->CreateUnsyncedItem( 257 entry_factory_->CreateUnsyncedItem(
262 id_factory_.NewLocalId(), id_factory_.root(), 258 id_factory_.NewLocalId(), id_factory_.root(),
263 base::StringPrintf("Item %" PRIuS "", i), false, 259 base::StringPrintf("Item %" PRIuS "", i), false, BOOKMARKS, NULL);
264 BOOKMARKS, NULL);
265 } 260 }
266 261
267 // We encrypt with new keys, triggering the local cryptographer to be unready 262 // We encrypt with new keys, triggering the local cryptographer to be unready
268 // and unable to decrypt data (once updated). 263 // and unable to decrypt data (once updated).
269 Cryptographer other_cryptographer(cryptographer->encryptor()); 264 Cryptographer other_cryptographer(cryptographer->encryptor());
270 KeyParams params = {"localhost", "dummy", "foobar"}; 265 KeyParams params = {"localhost", "dummy", "foobar"};
271 other_cryptographer.AddKey(params); 266 other_cryptographer.AddKey(params);
272 sync_pb::EntitySpecifics specifics; 267 sync_pb::EntitySpecifics specifics;
273 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori(); 268 sync_pb::NigoriSpecifics* nigori = specifics.mutable_nigori();
274 other_cryptographer.GetKeys(nigori->mutable_encryption_keybag()); 269 other_cryptographer.GetKeys(nigori->mutable_encryption_keybag());
275 nigori->set_encrypt_everything(true); 270 nigori->set_encrypt_everything(true);
276 encrypted_types.Put(BOOKMARKS); 271 encrypted_types.Put(BOOKMARKS);
277 entry_factory_->CreateUnappliedNewItem( 272 entry_factory_->CreateUnappliedNewItem(ModelTypeToRootTag(NIGORI), specifics,
278 ModelTypeToRootTag(NIGORI), specifics, true); 273 true);
279 EXPECT_FALSE(cryptographer->has_pending_keys()); 274 EXPECT_FALSE(cryptographer->has_pending_keys());
280 275
281 { 276 {
282 // Ensure we have unsynced nodes that aren't properly encrypted. 277 // Ensure we have unsynced nodes that aren't properly encrypted.
283 syncable::ReadTransaction trans(FROM_HERE, directory()); 278 syncable::ReadTransaction trans(FROM_HERE, directory());
284 EXPECT_FALSE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types)); 279 EXPECT_FALSE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types));
285 Syncer::UnsyncedMetaHandles handles; 280 Syncer::UnsyncedMetaHandles handles;
286 GetUnsyncedEntries(&trans, &handles); 281 GetUnsyncedEntries(&trans, &handles);
287 EXPECT_EQ(2*batch_s+1, handles.size()); 282 EXPECT_EQ(2 * batch_s + 1, handles.size());
288 } 283 }
289 284
290 ApplyControlDataUpdates(directory()); 285 ApplyControlDataUpdates(directory());
291 286
292 EXPECT_FALSE(cryptographer->is_ready()); 287 EXPECT_FALSE(cryptographer->is_ready());
293 EXPECT_TRUE(cryptographer->has_pending_keys()); 288 EXPECT_TRUE(cryptographer->has_pending_keys());
294 { 289 {
295 syncable::ReadTransaction trans(FROM_HERE, directory()); 290 syncable::ReadTransaction trans(FROM_HERE, directory());
296 291
297 // Since we have pending keys, we would have failed to encrypt, but the 292 // Since we have pending keys, we would have failed to encrypt, but the
298 // cryptographer should be updated. 293 // cryptographer should be updated.
299 EXPECT_FALSE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types)); 294 EXPECT_FALSE(VerifyUnsyncedChangesAreEncrypted(&trans, encrypted_types));
300 EXPECT_EQ(ModelTypeSet::All(), 295 EXPECT_EQ(ModelTypeSet::All(),
301 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 296 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
302 EXPECT_FALSE(cryptographer->is_ready()); 297 EXPECT_FALSE(cryptographer->is_ready());
303 EXPECT_TRUE(cryptographer->has_pending_keys()); 298 EXPECT_TRUE(cryptographer->has_pending_keys());
304 299
305 Syncer::UnsyncedMetaHandles handles; 300 Syncer::UnsyncedMetaHandles handles;
306 GetUnsyncedEntries(&trans, &handles); 301 GetUnsyncedEntries(&trans, &handles);
307 EXPECT_EQ(2*batch_s+1, handles.size()); 302 EXPECT_EQ(2 * batch_s + 1, handles.size());
308 } 303 }
309 } 304 }
310 305
311 // Verify we handle a nigori node conflict by merging encryption keys and 306 // Verify we handle a nigori node conflict by merging encryption keys and
312 // types, but preserve the custom passphrase state of the server. 307 // types, but preserve the custom passphrase state of the server.
313 // Initial sync ended should be set. 308 // Initial sync ended should be set.
314 TEST_F(ApplyControlDataUpdatesTest, 309 TEST_F(ApplyControlDataUpdatesTest,
315 NigoriConflictPendingKeysServerEncryptEverythingCustom) { 310 NigoriConflictPendingKeysServerEncryptEverythingCustom) {
316 Cryptographer* cryptographer; 311 Cryptographer* cryptographer;
317 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); 312 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes());
(...skipping 24 matching lines...) Expand all
342 cryptographer->AddKey(local_params); 337 cryptographer->AddKey(local_params);
343 EXPECT_TRUE(cryptographer->is_ready()); 338 EXPECT_TRUE(cryptographer->is_ready());
344 339
345 // Set up a local nigori with the local encryption keys and default encrypted 340 // Set up a local nigori with the local encryption keys and default encrypted
346 // types. 341 // types.
347 sync_pb::EntitySpecifics local_specifics; 342 sync_pb::EntitySpecifics local_specifics;
348 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori(); 343 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori();
349 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag()); 344 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag());
350 local_nigori->set_encrypt_everything(false); 345 local_nigori->set_encrypt_everything(false);
351 local_nigori->set_keybag_is_frozen(true); 346 local_nigori->set_keybag_is_frozen(true);
352 ASSERT_TRUE(entry_factory_->SetLocalSpecificsForItem( 347 ASSERT_TRUE(
353 nigori_handle, local_specifics)); 348 entry_factory_->SetLocalSpecificsForItem(nigori_handle, local_specifics));
354 // Apply the update locally so that UpdateFromEncryptedTypes knows what state 349 // Apply the update locally so that UpdateFromEncryptedTypes knows what state
355 // to use. 350 // to use.
356 { 351 {
357 syncable::ReadTransaction trans(FROM_HERE, directory()); 352 syncable::ReadTransaction trans(FROM_HERE, directory());
358 cryptographer = directory()->GetCryptographer(&trans); 353 cryptographer = directory()->GetCryptographer(&trans);
359 directory()->GetNigoriHandler()->ApplyNigoriUpdate( 354 directory()->GetNigoriHandler()->ApplyNigoriUpdate(*local_nigori, &trans);
360 *local_nigori,
361 &trans);
362 } 355 }
363 356
364 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 357 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
365 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 358 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
366 ApplyControlDataUpdates(directory()); 359 ApplyControlDataUpdates(directory());
367 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 360 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
368 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 361 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
369 362
370 EXPECT_FALSE(cryptographer->is_ready()); 363 EXPECT_FALSE(cryptographer->is_ready());
371 EXPECT_TRUE(cryptographer->is_initialized()); 364 EXPECT_TRUE(cryptographer->is_initialized());
372 EXPECT_TRUE(cryptographer->has_pending_keys()); 365 EXPECT_TRUE(cryptographer->has_pending_keys());
373 EXPECT_TRUE(other_cryptographer.CanDecryptUsingDefaultKey( 366 EXPECT_TRUE(other_cryptographer.CanDecryptUsingDefaultKey(
374 entry_factory_->GetLocalSpecificsForItem(nigori_handle). 367 entry_factory_->GetLocalSpecificsForItem(nigori_handle)
375 nigori().encryption_keybag())); 368 .nigori()
376 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 369 .encryption_keybag()));
377 nigori().keybag_is_frozen()); 370 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
378 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 371 .nigori()
379 nigori().encrypt_everything()); 372 .keybag_is_frozen());
373 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
374 .nigori()
375 .encrypt_everything());
380 { 376 {
381 syncable::ReadTransaction trans(FROM_HERE, directory()); 377 syncable::ReadTransaction trans(FROM_HERE, directory());
382 EXPECT_EQ(ModelTypeSet::All(), 378 EXPECT_EQ(ModelTypeSet::All(),
383 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 379 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
384 } 380 }
385 } 381 }
386 382
387 // Verify we handle a nigori node conflict by merging encryption keys and 383 // Verify we handle a nigori node conflict by merging encryption keys and
388 // types, but preserve the custom passphrase state of the server. 384 // types, but preserve the custom passphrase state of the server.
389 // Initial sync ended should be set. 385 // Initial sync ended should be set.
(...skipping 28 matching lines...) Expand all
418 cryptographer->AddKey(local_params); 414 cryptographer->AddKey(local_params);
419 EXPECT_TRUE(cryptographer->is_ready()); 415 EXPECT_TRUE(cryptographer->is_ready());
420 416
421 // Set up a local nigori with the local encryption keys and default encrypted 417 // Set up a local nigori with the local encryption keys and default encrypted
422 // types. 418 // types.
423 sync_pb::EntitySpecifics local_specifics; 419 sync_pb::EntitySpecifics local_specifics;
424 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori(); 420 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori();
425 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag()); 421 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag());
426 local_nigori->set_encrypt_everything(true); 422 local_nigori->set_encrypt_everything(true);
427 local_nigori->set_keybag_is_frozen(true); 423 local_nigori->set_keybag_is_frozen(true);
428 ASSERT_TRUE(entry_factory_->SetLocalSpecificsForItem( 424 ASSERT_TRUE(
429 nigori_handle, local_specifics)); 425 entry_factory_->SetLocalSpecificsForItem(nigori_handle, local_specifics));
430 // Apply the update locally so that UpdateFromEncryptedTypes knows what state 426 // Apply the update locally so that UpdateFromEncryptedTypes knows what state
431 // to use. 427 // to use.
432 { 428 {
433 syncable::ReadTransaction trans(FROM_HERE, directory()); 429 syncable::ReadTransaction trans(FROM_HERE, directory());
434 cryptographer = directory()->GetCryptographer(&trans); 430 cryptographer = directory()->GetCryptographer(&trans);
435 directory()->GetNigoriHandler()->ApplyNigoriUpdate( 431 directory()->GetNigoriHandler()->ApplyNigoriUpdate(*local_nigori, &trans);
436 *local_nigori,
437 &trans);
438 } 432 }
439 433
440 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 434 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
441 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 435 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
442 ApplyControlDataUpdates(directory()); 436 ApplyControlDataUpdates(directory());
443 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 437 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
444 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 438 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
445 439
446 EXPECT_FALSE(cryptographer->is_ready()); 440 EXPECT_FALSE(cryptographer->is_ready());
447 EXPECT_TRUE(cryptographer->is_initialized()); 441 EXPECT_TRUE(cryptographer->is_initialized());
448 EXPECT_TRUE(cryptographer->has_pending_keys()); 442 EXPECT_TRUE(cryptographer->has_pending_keys());
449 EXPECT_TRUE(other_cryptographer.CanDecryptUsingDefaultKey( 443 EXPECT_TRUE(other_cryptographer.CanDecryptUsingDefaultKey(
450 entry_factory_->GetLocalSpecificsForItem(nigori_handle). 444 entry_factory_->GetLocalSpecificsForItem(nigori_handle)
451 nigori().encryption_keybag())); 445 .nigori()
452 EXPECT_FALSE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 446 .encryption_keybag()));
453 nigori().keybag_is_frozen()); 447 EXPECT_FALSE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
454 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 448 .nigori()
455 nigori().encrypt_everything()); 449 .keybag_is_frozen());
450 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
451 .nigori()
452 .encrypt_everything());
456 { 453 {
457 syncable::ReadTransaction trans(FROM_HERE, directory()); 454 syncable::ReadTransaction trans(FROM_HERE, directory());
458 EXPECT_EQ(ModelTypeSet::All(), 455 EXPECT_EQ(ModelTypeSet::All(),
459 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 456 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
460 } 457 }
461 } 458 }
462 459
463 // If the conflicting nigori has a subset of the local keys, the conflict 460 // If the conflicting nigori has a subset of the local keys, the conflict
464 // resolution should preserve the full local keys. Initial sync ended should be 461 // resolution should preserve the full local keys. Initial sync ended should be
465 // set. 462 // set.
466 TEST_F(ApplyControlDataUpdatesTest, 463 TEST_F(ApplyControlDataUpdatesTest, NigoriConflictOldKeys) {
467 NigoriConflictOldKeys) {
468 Cryptographer* cryptographer; 464 Cryptographer* cryptographer;
469 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); 465 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes());
470 KeyParams old_params = {"localhost", "dummy", "old"}; 466 KeyParams old_params = {"localhost", "dummy", "old"};
471 KeyParams new_params = {"localhost", "dummy", "new"}; 467 KeyParams new_params = {"localhost", "dummy", "new"};
472 { 468 {
473 syncable::ReadTransaction trans(FROM_HERE, directory()); 469 syncable::ReadTransaction trans(FROM_HERE, directory());
474 cryptographer = directory()->GetCryptographer(&trans); 470 cryptographer = directory()->GetCryptographer(&trans);
475 EXPECT_EQ(encrypted_types, 471 EXPECT_EQ(encrypted_types,
476 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 472 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
477 } 473 }
(...skipping 11 matching lines...) Expand all
489 485
490 // Add the new keys to the cryptogrpaher 486 // Add the new keys to the cryptogrpaher
491 cryptographer->AddKey(new_params); 487 cryptographer->AddKey(new_params);
492 EXPECT_TRUE(cryptographer->is_ready()); 488 EXPECT_TRUE(cryptographer->is_ready());
493 489
494 // Set up a local nigori with the superset of keys. 490 // Set up a local nigori with the superset of keys.
495 sync_pb::EntitySpecifics local_specifics; 491 sync_pb::EntitySpecifics local_specifics;
496 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori(); 492 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori();
497 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag()); 493 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag());
498 local_nigori->set_encrypt_everything(false); 494 local_nigori->set_encrypt_everything(false);
499 ASSERT_TRUE(entry_factory_->SetLocalSpecificsForItem( 495 ASSERT_TRUE(
500 nigori_handle, local_specifics)); 496 entry_factory_->SetLocalSpecificsForItem(nigori_handle, local_specifics));
501 // Apply the update locally so that UpdateFromEncryptedTypes knows what state 497 // Apply the update locally so that UpdateFromEncryptedTypes knows what state
502 // to use. 498 // to use.
503 { 499 {
504 syncable::ReadTransaction trans(FROM_HERE, directory()); 500 syncable::ReadTransaction trans(FROM_HERE, directory());
505 cryptographer = directory()->GetCryptographer(&trans); 501 cryptographer = directory()->GetCryptographer(&trans);
506 directory()->GetNigoriHandler()->ApplyNigoriUpdate( 502 directory()->GetNigoriHandler()->ApplyNigoriUpdate(*local_nigori, &trans);
507 *local_nigori,
508 &trans);
509 } 503 }
510 504
511 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 505 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
512 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 506 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
513 ApplyControlDataUpdates(directory()); 507 ApplyControlDataUpdates(directory());
514 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 508 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
515 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 509 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
516 510
517 EXPECT_TRUE(cryptographer->is_ready()); 511 EXPECT_TRUE(cryptographer->is_ready());
518 EXPECT_TRUE(cryptographer->CanDecryptUsingDefaultKey( 512 EXPECT_TRUE(cryptographer->CanDecryptUsingDefaultKey(
519 entry_factory_->GetLocalSpecificsForItem(nigori_handle). 513 entry_factory_->GetLocalSpecificsForItem(nigori_handle)
520 nigori().encryption_keybag())); 514 .nigori()
521 EXPECT_FALSE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 515 .encryption_keybag()));
522 nigori().keybag_is_frozen()); 516 EXPECT_FALSE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
523 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 517 .nigori()
524 nigori().encrypt_everything()); 518 .keybag_is_frozen());
519 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
520 .nigori()
521 .encrypt_everything());
525 { 522 {
526 syncable::ReadTransaction trans(FROM_HERE, directory()); 523 syncable::ReadTransaction trans(FROM_HERE, directory());
527 EXPECT_EQ(ModelTypeSet::All(), 524 EXPECT_EQ(ModelTypeSet::All(),
528 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 525 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
529 } 526 }
530 } 527 }
531 528
532 // If both nigoris are migrated, but we also set a custom passphrase locally, 529 // If both nigoris are migrated, but we also set a custom passphrase locally,
533 // the local nigori should be preserved. 530 // the local nigori should be preserved.
534 TEST_F(ApplyControlDataUpdatesTest, 531 TEST_F(ApplyControlDataUpdatesTest, NigoriConflictBothMigratedLocalCustom) {
535 NigoriConflictBothMigratedLocalCustom) {
536 Cryptographer* cryptographer; 532 Cryptographer* cryptographer;
537 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); 533 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes());
538 KeyParams old_params = {"localhost", "dummy", "old"}; 534 KeyParams old_params = {"localhost", "dummy", "old"};
539 KeyParams new_params = {"localhost", "dummy", "new"}; 535 KeyParams new_params = {"localhost", "dummy", "new"};
540 { 536 {
541 syncable::ReadTransaction trans(FROM_HERE, directory()); 537 syncable::ReadTransaction trans(FROM_HERE, directory());
542 cryptographer = directory()->GetCryptographer(&trans); 538 cryptographer = directory()->GetCryptographer(&trans);
543 EXPECT_EQ(encrypted_types, 539 EXPECT_EQ(encrypted_types,
544 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 540 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
545 } 541 }
(...skipping 20 matching lines...) Expand all
566 EXPECT_TRUE(cryptographer->is_ready()); 562 EXPECT_TRUE(cryptographer->is_ready());
567 563
568 // Set up a local nigori with a migrated custom passphrase type 564 // Set up a local nigori with a migrated custom passphrase type
569 sync_pb::EntitySpecifics local_specifics; 565 sync_pb::EntitySpecifics local_specifics;
570 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori(); 566 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori();
571 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag()); 567 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag());
572 local_nigori->set_encrypt_everything(true); 568 local_nigori->set_encrypt_everything(true);
573 local_nigori->set_keybag_is_frozen(true); 569 local_nigori->set_keybag_is_frozen(true);
574 local_nigori->set_passphrase_type( 570 local_nigori->set_passphrase_type(
575 sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE); 571 sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE);
576 ASSERT_TRUE(entry_factory_->SetLocalSpecificsForItem( 572 ASSERT_TRUE(
577 nigori_handle, local_specifics)); 573 entry_factory_->SetLocalSpecificsForItem(nigori_handle, local_specifics));
578 // Apply the update locally so that UpdateFromEncryptedTypes knows what state 574 // Apply the update locally so that UpdateFromEncryptedTypes knows what state
579 // to use. 575 // to use.
580 { 576 {
581 syncable::ReadTransaction trans(FROM_HERE, directory()); 577 syncable::ReadTransaction trans(FROM_HERE, directory());
582 cryptographer = directory()->GetCryptographer(&trans); 578 cryptographer = directory()->GetCryptographer(&trans);
583 directory()->GetNigoriHandler()->ApplyNigoriUpdate( 579 directory()->GetNigoriHandler()->ApplyNigoriUpdate(*local_nigori, &trans);
584 *local_nigori,
585 &trans);
586 } 580 }
587 581
588 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 582 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
589 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 583 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
590 ApplyControlDataUpdates(directory()); 584 ApplyControlDataUpdates(directory());
591 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 585 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
592 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 586 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
593 587
594 EXPECT_TRUE(cryptographer->is_ready()); 588 EXPECT_TRUE(cryptographer->is_ready());
595 EXPECT_TRUE(cryptographer->CanDecryptUsingDefaultKey( 589 EXPECT_TRUE(cryptographer->CanDecryptUsingDefaultKey(
596 entry_factory_->GetLocalSpecificsForItem(nigori_handle). 590 entry_factory_->GetLocalSpecificsForItem(nigori_handle)
597 nigori().encryption_keybag())); 591 .nigori()
598 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 592 .encryption_keybag()));
599 nigori().keybag_is_frozen()); 593 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
600 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 594 .nigori()
601 nigori().encrypt_everything()); 595 .keybag_is_frozen());
596 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
597 .nigori()
598 .encrypt_everything());
602 EXPECT_EQ(sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE, 599 EXPECT_EQ(sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE,
603 entry_factory_->GetLocalSpecificsForItem(nigori_handle). 600 entry_factory_->GetLocalSpecificsForItem(nigori_handle)
604 nigori().passphrase_type()); 601 .nigori()
602 .passphrase_type());
605 { 603 {
606 syncable::ReadTransaction trans(FROM_HERE, directory()); 604 syncable::ReadTransaction trans(FROM_HERE, directory());
607 EXPECT_EQ(ModelTypeSet::All(), 605 EXPECT_EQ(ModelTypeSet::All(),
608 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 606 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
609 } 607 }
610 } 608 }
611 609
612 // If both nigoris are migrated, but a custom passphrase with a new key was 610 // If both nigoris are migrated, but a custom passphrase with a new key was
613 // set remotely, the remote nigori should be preserved. 611 // set remotely, the remote nigori should be preserved.
614 TEST_F(ApplyControlDataUpdatesTest, 612 TEST_F(ApplyControlDataUpdatesTest, NigoriConflictBothMigratedServerCustom) {
615 NigoriConflictBothMigratedServerCustom) {
616 Cryptographer* cryptographer; 613 Cryptographer* cryptographer;
617 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); 614 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes());
618 KeyParams old_params = {"localhost", "dummy", "old"}; 615 KeyParams old_params = {"localhost", "dummy", "old"};
619 KeyParams new_params = {"localhost", "dummy", "new"}; 616 KeyParams new_params = {"localhost", "dummy", "new"};
620 { 617 {
621 syncable::ReadTransaction trans(FROM_HERE, directory()); 618 syncable::ReadTransaction trans(FROM_HERE, directory());
622 cryptographer = directory()->GetCryptographer(&trans); 619 cryptographer = directory()->GetCryptographer(&trans);
623 EXPECT_EQ(encrypted_types, 620 EXPECT_EQ(encrypted_types,
624 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 621 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
625 } 622 }
(...skipping 20 matching lines...) Expand all
646 643
647 // Set up a local nigori with a migrated keystore passphrase type 644 // Set up a local nigori with a migrated keystore passphrase type
648 sync_pb::EntitySpecifics local_specifics; 645 sync_pb::EntitySpecifics local_specifics;
649 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori(); 646 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori();
650 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag()); 647 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag());
651 local_nigori->set_encrypt_everything(false); 648 local_nigori->set_encrypt_everything(false);
652 local_nigori->set_keybag_is_frozen(true); 649 local_nigori->set_keybag_is_frozen(true);
653 local_nigori->set_passphrase_type( 650 local_nigori->set_passphrase_type(
654 sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE); 651 sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE);
655 server_nigori->mutable_keystore_decryptor_token(); 652 server_nigori->mutable_keystore_decryptor_token();
656 ASSERT_TRUE(entry_factory_->SetLocalSpecificsForItem( 653 ASSERT_TRUE(
657 nigori_handle, local_specifics)); 654 entry_factory_->SetLocalSpecificsForItem(nigori_handle, local_specifics));
658 // Apply the update locally so that UpdateFromEncryptedTypes knows what state 655 // Apply the update locally so that UpdateFromEncryptedTypes knows what state
659 // to use. 656 // to use.
660 { 657 {
661 syncable::ReadTransaction trans(FROM_HERE, directory()); 658 syncable::ReadTransaction trans(FROM_HERE, directory());
662 cryptographer = directory()->GetCryptographer(&trans); 659 cryptographer = directory()->GetCryptographer(&trans);
663 directory()->GetNigoriHandler()->ApplyNigoriUpdate( 660 directory()->GetNigoriHandler()->ApplyNigoriUpdate(*local_nigori, &trans);
664 *local_nigori,
665 &trans);
666 } 661 }
667 662
668 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 663 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
669 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 664 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
670 ApplyControlDataUpdates(directory()); 665 ApplyControlDataUpdates(directory());
671 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 666 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
672 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 667 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
673 668
674 EXPECT_TRUE(cryptographer->is_initialized()); 669 EXPECT_TRUE(cryptographer->is_initialized());
675 EXPECT_TRUE(cryptographer->has_pending_keys()); 670 EXPECT_TRUE(cryptographer->has_pending_keys());
676 EXPECT_TRUE(other_cryptographer.CanDecryptUsingDefaultKey( 671 EXPECT_TRUE(other_cryptographer.CanDecryptUsingDefaultKey(
677 entry_factory_->GetLocalSpecificsForItem(nigori_handle). 672 entry_factory_->GetLocalSpecificsForItem(nigori_handle)
678 nigori().encryption_keybag())); 673 .nigori()
679 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 674 .encryption_keybag()));
680 nigori().keybag_is_frozen()); 675 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
681 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 676 .nigori()
682 nigori().encrypt_everything()); 677 .keybag_is_frozen());
678 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
679 .nigori()
680 .encrypt_everything());
683 EXPECT_EQ(sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE, 681 EXPECT_EQ(sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE,
684 entry_factory_->GetLocalSpecificsForItem(nigori_handle). 682 entry_factory_->GetLocalSpecificsForItem(nigori_handle)
685 nigori().passphrase_type()); 683 .nigori()
684 .passphrase_type());
686 { 685 {
687 syncable::ReadTransaction trans(FROM_HERE, directory()); 686 syncable::ReadTransaction trans(FROM_HERE, directory());
688 EXPECT_EQ(ModelTypeSet::All(), 687 EXPECT_EQ(ModelTypeSet::All(),
689 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 688 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
690 } 689 }
691 } 690 }
692 691
693 // If the local nigori is migrated but the server is not, preserve the local 692 // If the local nigori is migrated but the server is not, preserve the local
694 // nigori. 693 // nigori.
695 TEST_F(ApplyControlDataUpdatesTest, 694 TEST_F(ApplyControlDataUpdatesTest, NigoriConflictLocalMigrated) {
696 NigoriConflictLocalMigrated) {
697 Cryptographer* cryptographer; 695 Cryptographer* cryptographer;
698 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); 696 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes());
699 KeyParams old_params = {"localhost", "dummy", "old"}; 697 KeyParams old_params = {"localhost", "dummy", "old"};
700 KeyParams new_params = {"localhost", "dummy", "new"}; 698 KeyParams new_params = {"localhost", "dummy", "new"};
701 { 699 {
702 syncable::ReadTransaction trans(FROM_HERE, directory()); 700 syncable::ReadTransaction trans(FROM_HERE, directory());
703 cryptographer = directory()->GetCryptographer(&trans); 701 cryptographer = directory()->GetCryptographer(&trans);
704 EXPECT_EQ(encrypted_types, 702 EXPECT_EQ(encrypted_types,
705 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 703 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
706 } 704 }
(...skipping 17 matching lines...) Expand all
724 EXPECT_TRUE(cryptographer->is_ready()); 722 EXPECT_TRUE(cryptographer->is_ready());
725 723
726 // Set up a local nigori with a migrated custom passphrase type 724 // Set up a local nigori with a migrated custom passphrase type
727 sync_pb::EntitySpecifics local_specifics; 725 sync_pb::EntitySpecifics local_specifics;
728 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori(); 726 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori();
729 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag()); 727 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag());
730 local_nigori->set_encrypt_everything(true); 728 local_nigori->set_encrypt_everything(true);
731 local_nigori->set_keybag_is_frozen(true); 729 local_nigori->set_keybag_is_frozen(true);
732 local_nigori->set_passphrase_type( 730 local_nigori->set_passphrase_type(
733 sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE); 731 sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE);
734 ASSERT_TRUE(entry_factory_->SetLocalSpecificsForItem( 732 ASSERT_TRUE(
735 nigori_handle, local_specifics)); 733 entry_factory_->SetLocalSpecificsForItem(nigori_handle, local_specifics));
736 // Apply the update locally so that UpdateFromEncryptedTypes knows what state 734 // Apply the update locally so that UpdateFromEncryptedTypes knows what state
737 // to use. 735 // to use.
738 { 736 {
739 syncable::ReadTransaction trans(FROM_HERE, directory()); 737 syncable::ReadTransaction trans(FROM_HERE, directory());
740 cryptographer = directory()->GetCryptographer(&trans); 738 cryptographer = directory()->GetCryptographer(&trans);
741 directory()->GetNigoriHandler()->ApplyNigoriUpdate( 739 directory()->GetNigoriHandler()->ApplyNigoriUpdate(*local_nigori, &trans);
742 *local_nigori,
743 &trans);
744 } 740 }
745 741
746 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 742 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
747 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 743 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
748 ApplyControlDataUpdates(directory()); 744 ApplyControlDataUpdates(directory());
749 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 745 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
750 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 746 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
751 747
752 EXPECT_TRUE(cryptographer->is_ready()); 748 EXPECT_TRUE(cryptographer->is_ready());
753 EXPECT_TRUE(cryptographer->CanDecryptUsingDefaultKey( 749 EXPECT_TRUE(cryptographer->CanDecryptUsingDefaultKey(
754 entry_factory_->GetLocalSpecificsForItem(nigori_handle). 750 entry_factory_->GetLocalSpecificsForItem(nigori_handle)
755 nigori().encryption_keybag())); 751 .nigori()
756 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 752 .encryption_keybag()));
757 nigori().keybag_is_frozen()); 753 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
758 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 754 .nigori()
759 nigori().encrypt_everything()); 755 .keybag_is_frozen());
756 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
757 .nigori()
758 .encrypt_everything());
760 EXPECT_EQ(sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE, 759 EXPECT_EQ(sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE,
761 entry_factory_->GetLocalSpecificsForItem(nigori_handle). 760 entry_factory_->GetLocalSpecificsForItem(nigori_handle)
762 nigori().passphrase_type()); 761 .nigori()
762 .passphrase_type());
763 { 763 {
764 syncable::ReadTransaction trans(FROM_HERE, directory()); 764 syncable::ReadTransaction trans(FROM_HERE, directory());
765 EXPECT_EQ(ModelTypeSet::All(), 765 EXPECT_EQ(ModelTypeSet::All(),
766 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 766 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
767 } 767 }
768 } 768 }
769 769
770 // If the server nigori is migrated but the local is not, preserve the server 770 // If the server nigori is migrated but the local is not, preserve the server
771 // nigori. 771 // nigori.
772 TEST_F(ApplyControlDataUpdatesTest, 772 TEST_F(ApplyControlDataUpdatesTest, NigoriConflictServerMigrated) {
773 NigoriConflictServerMigrated) {
774 Cryptographer* cryptographer; 773 Cryptographer* cryptographer;
775 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes()); 774 ModelTypeSet encrypted_types(SyncEncryptionHandler::SensitiveTypes());
776 KeyParams old_params = {"localhost", "dummy", "old"}; 775 KeyParams old_params = {"localhost", "dummy", "old"};
777 KeyParams new_params = {"localhost", "dummy", "new"}; 776 KeyParams new_params = {"localhost", "dummy", "new"};
778 { 777 {
779 syncable::ReadTransaction trans(FROM_HERE, directory()); 778 syncable::ReadTransaction trans(FROM_HERE, directory());
780 cryptographer = directory()->GetCryptographer(&trans); 779 cryptographer = directory()->GetCryptographer(&trans);
781 EXPECT_EQ(encrypted_types, 780 EXPECT_EQ(encrypted_types,
782 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans)); 781 directory()->GetNigoriHandler()->GetEncryptedTypes(&trans));
783 } 782 }
(...skipping 18 matching lines...) Expand all
802 cryptographer->AddKey(old_params); 801 cryptographer->AddKey(old_params);
803 cryptographer->AddKey(new_params); 802 cryptographer->AddKey(new_params);
804 EXPECT_TRUE(cryptographer->is_ready()); 803 EXPECT_TRUE(cryptographer->is_ready());
805 804
806 // Set up a local nigori with a migrated custom passphrase type 805 // Set up a local nigori with a migrated custom passphrase type
807 sync_pb::EntitySpecifics local_specifics; 806 sync_pb::EntitySpecifics local_specifics;
808 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori(); 807 sync_pb::NigoriSpecifics* local_nigori = local_specifics.mutable_nigori();
809 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag()); 808 cryptographer->GetKeys(local_nigori->mutable_encryption_keybag());
810 local_nigori->set_encrypt_everything(false); 809 local_nigori->set_encrypt_everything(false);
811 local_nigori->set_keybag_is_frozen(false); 810 local_nigori->set_keybag_is_frozen(false);
812 ASSERT_TRUE(entry_factory_->SetLocalSpecificsForItem( 811 ASSERT_TRUE(
813 nigori_handle, local_specifics)); 812 entry_factory_->SetLocalSpecificsForItem(nigori_handle, local_specifics));
814 // Apply the update locally so that UpdateFromEncryptedTypes knows what state 813 // Apply the update locally so that UpdateFromEncryptedTypes knows what state
815 // to use. 814 // to use.
816 { 815 {
817 syncable::ReadTransaction trans(FROM_HERE, directory()); 816 syncable::ReadTransaction trans(FROM_HERE, directory());
818 cryptographer = directory()->GetCryptographer(&trans); 817 cryptographer = directory()->GetCryptographer(&trans);
819 directory()->GetNigoriHandler()->ApplyNigoriUpdate( 818 directory()->GetNigoriHandler()->ApplyNigoriUpdate(*local_nigori, &trans);
820 *local_nigori,
821 &trans);
822 } 819 }
823 820
824 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 821 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
825 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 822 EXPECT_TRUE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
826 ApplyControlDataUpdates(directory()); 823 ApplyControlDataUpdates(directory());
827 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle)); 824 EXPECT_TRUE(entry_factory_->GetIsUnsyncedForItem(nigori_handle));
828 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle)); 825 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(nigori_handle));
829 826
830 EXPECT_TRUE(cryptographer->is_ready()); 827 EXPECT_TRUE(cryptographer->is_ready());
831 // Note: we didn't overwrite the encryption keybag with the local keys. The 828 // Note: we didn't overwrite the encryption keybag with the local keys. The
832 // sync encryption handler will do that when it detects that the new 829 // sync encryption handler will do that when it detects that the new
833 // keybag is out of date (and update the keystore bootstrap if necessary). 830 // keybag is out of date (and update the keystore bootstrap if necessary).
834 EXPECT_FALSE(cryptographer->CanDecryptUsingDefaultKey( 831 EXPECT_FALSE(cryptographer->CanDecryptUsingDefaultKey(
835 entry_factory_->GetLocalSpecificsForItem(nigori_handle). 832 entry_factory_->GetLocalSpecificsForItem(nigori_handle)
836 nigori().encryption_keybag())); 833 .nigori()
834 .encryption_keybag()));
837 EXPECT_TRUE(cryptographer->CanDecrypt( 835 EXPECT_TRUE(cryptographer->CanDecrypt(
838 entry_factory_->GetLocalSpecificsForItem(nigori_handle). 836 entry_factory_->GetLocalSpecificsForItem(nigori_handle)
839 nigori().encryption_keybag())); 837 .nigori()
840 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 838 .encryption_keybag()));
841 nigori().keybag_is_frozen()); 839 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
842 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle). 840 .nigori()
843 nigori().has_keystore_decryptor_token()); 841 .keybag_is_frozen());
842 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(nigori_handle)
843 .nigori()
844 .has_keystore_decryptor_token());
844 EXPECT_EQ(sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE, 845 EXPECT_EQ(sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE,
845 entry_factory_->GetLocalSpecificsForItem(nigori_handle). 846 entry_factory_->GetLocalSpecificsForItem(nigori_handle)
846 nigori().passphrase_type()); 847 .nigori()
847 { 848 .passphrase_type());
848 syncable::ReadTransaction trans(FROM_HERE, directory()); 849 { syncable::ReadTransaction trans(FROM_HERE, directory()); }
849 }
850 } 850 }
851 851
852 // Check that we can apply a simple control datatype node successfully. 852 // Check that we can apply a simple control datatype node successfully.
853 TEST_F(ApplyControlDataUpdatesTest, ControlApply) { 853 TEST_F(ApplyControlDataUpdatesTest, ControlApply) {
854 std::string experiment_id = "experiment"; 854 std::string experiment_id = "experiment";
855 sync_pb::EntitySpecifics specifics; 855 sync_pb::EntitySpecifics specifics;
856 specifics.mutable_experiments()->mutable_keystore_encryption()-> 856 specifics.mutable_experiments()->mutable_keystore_encryption()->set_enabled(
857 set_enabled(true); 857 true);
858 int64_t experiment_handle = 858 int64_t experiment_handle =
859 entry_factory_->CreateUnappliedNewItem(experiment_id, specifics, false); 859 entry_factory_->CreateUnappliedNewItem(experiment_id, specifics, false);
860 ApplyControlDataUpdates(directory()); 860 ApplyControlDataUpdates(directory());
861 861
862 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(experiment_handle)); 862 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(experiment_handle));
863 EXPECT_TRUE( 863 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(experiment_handle)
864 entry_factory_->GetLocalSpecificsForItem(experiment_handle). 864 .experiments()
865 experiments().keystore_encryption().enabled()); 865 .keystore_encryption()
866 .enabled());
866 } 867 }
867 868
868 // Verify that we apply top level folders before their children. 869 // Verify that we apply top level folders before their children.
869 TEST_F(ApplyControlDataUpdatesTest, ControlApplyParentBeforeChild) { 870 TEST_F(ApplyControlDataUpdatesTest, ControlApplyParentBeforeChild) {
870 std::string parent_id = "parent"; 871 std::string parent_id = "parent";
871 std::string experiment_id = "experiment"; 872 std::string experiment_id = "experiment";
872 sync_pb::EntitySpecifics specifics; 873 sync_pb::EntitySpecifics specifics;
873 specifics.mutable_experiments()->mutable_keystore_encryption()-> 874 specifics.mutable_experiments()->mutable_keystore_encryption()->set_enabled(
874 set_enabled(true); 875 true);
875 int64_t experiment_handle = entry_factory_->CreateUnappliedNewItemWithParent( 876 int64_t experiment_handle = entry_factory_->CreateUnappliedNewItemWithParent(
876 experiment_id, specifics, parent_id); 877 experiment_id, specifics, parent_id);
877 int64_t parent_handle = 878 int64_t parent_handle =
878 entry_factory_->CreateUnappliedNewItem(parent_id, specifics, true); 879 entry_factory_->CreateUnappliedNewItem(parent_id, specifics, true);
879 ApplyControlDataUpdates(directory()); 880 ApplyControlDataUpdates(directory());
880 881
881 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(parent_handle)); 882 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(parent_handle));
882 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(experiment_handle)); 883 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(experiment_handle));
883 EXPECT_TRUE( 884 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(experiment_handle)
884 entry_factory_->GetLocalSpecificsForItem(experiment_handle). 885 .experiments()
885 experiments().keystore_encryption().enabled()); 886 .keystore_encryption()
887 .enabled());
886 } 888 }
887 889
888 // Verify that we handle control datatype conflicts by preserving the server 890 // Verify that we handle control datatype conflicts by preserving the server
889 // data. 891 // data.
890 TEST_F(ApplyControlDataUpdatesTest, ControlConflict) { 892 TEST_F(ApplyControlDataUpdatesTest, ControlConflict) {
891 std::string experiment_id = "experiment"; 893 std::string experiment_id = "experiment";
892 sync_pb::EntitySpecifics local_specifics, server_specifics; 894 sync_pb::EntitySpecifics local_specifics, server_specifics;
893 server_specifics.mutable_experiments()->mutable_keystore_encryption()-> 895 server_specifics.mutable_experiments()
894 set_enabled(true); 896 ->mutable_keystore_encryption()
895 local_specifics.mutable_experiments()->mutable_keystore_encryption()-> 897 ->set_enabled(true);
896 set_enabled(false); 898 local_specifics.mutable_experiments()
899 ->mutable_keystore_encryption()
900 ->set_enabled(false);
897 int64_t experiment_handle = 901 int64_t experiment_handle =
898 entry_factory_->CreateSyncedItem(experiment_id, EXPERIMENTS, false); 902 entry_factory_->CreateSyncedItem(experiment_id, EXPERIMENTS, false);
899 entry_factory_->SetServerSpecificsForItem(experiment_handle, 903 entry_factory_->SetServerSpecificsForItem(experiment_handle,
900 server_specifics); 904 server_specifics);
901 entry_factory_->SetLocalSpecificsForItem(experiment_handle, 905 entry_factory_->SetLocalSpecificsForItem(experiment_handle, local_specifics);
902 local_specifics);
903 ApplyControlDataUpdates(directory()); 906 ApplyControlDataUpdates(directory());
904 907
905 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(experiment_handle)); 908 EXPECT_FALSE(entry_factory_->GetIsUnappliedForItem(experiment_handle));
906 EXPECT_TRUE( 909 EXPECT_TRUE(entry_factory_->GetLocalSpecificsForItem(experiment_handle)
907 entry_factory_->GetLocalSpecificsForItem(experiment_handle). 910 .experiments()
908 experiments().keystore_encryption().enabled()); 911 .keystore_encryption()
912 .enabled());
909 } 913 }
910 914
911 // Check that applying a EXPERIMENTS update marks the datatype as downloaded. 915 // Check that applying a EXPERIMENTS update marks the datatype as downloaded.
912 TEST_F(ApplyControlDataUpdatesTest, ExperimentsApplyMarksDownloadCompleted) { 916 TEST_F(ApplyControlDataUpdatesTest, ExperimentsApplyMarksDownloadCompleted) {
913 EXPECT_FALSE(directory()->InitialSyncEndedForType(EXPERIMENTS)); 917 EXPECT_FALSE(directory()->InitialSyncEndedForType(EXPERIMENTS));
914 918
915 // Create root node for EXPERIMENTS datatype 919 // Create root node for EXPERIMENTS datatype
916 { 920 {
917 syncable::WriteTransaction trans(FROM_HERE, UNITTEST, directory()); 921 syncable::WriteTransaction trans(FROM_HERE, UNITTEST, directory());
918 syncable::ModelNeutralMutableEntry entry( 922 syncable::ModelNeutralMutableEntry entry(
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 ApplyControlDataUpdates(directory()); 969 ApplyControlDataUpdates(directory());
966 970
967 // After applying the updates NIGORI should be marked as having its 971 // After applying the updates NIGORI should be marked as having its
968 // initial sync completed. 972 // initial sync completed.
969 EXPECT_TRUE(directory()->InitialSyncEndedForType(NIGORI)); 973 EXPECT_TRUE(directory()->InitialSyncEndedForType(NIGORI));
970 // Verify that there is no side effect on another control type. 974 // Verify that there is no side effect on another control type.
971 EXPECT_FALSE(directory()->InitialSyncEndedForType(EXPERIMENTS)); 975 EXPECT_FALSE(directory()->InitialSyncEndedForType(EXPERIMENTS));
972 } 976 }
973 977
974 } // namespace syncer 978 } // namespace syncer
OLDNEW
« no previous file with comments | « components/sync/engine_impl/apply_control_data_updates.cc ('k') | components/sync/engine_impl/backoff_delay_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698