| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 // Unit tests for the SyncApi. Note that a lot of the underlying | 5 // Unit tests for the SyncApi. Note that a lot of the underlying |
| 6 // functionality is provided by the Syncable layer, which has its own | 6 // functionality is provided by the Syncable layer, which has its own |
| 7 // unit tests. We'll test SyncApi specific things in this harness. | 7 // unit tests. We'll test SyncApi specific things in this harness. |
| 8 | 8 |
| 9 #include <cstddef> | 9 #include <cstddef> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 entry.Put(syncable::SPECIFICS, specifics); | 218 entry.Put(syncable::SPECIFICS, specifics); |
| 219 return entry.Get(syncable::META_HANDLE); | 219 return entry.Get(syncable::META_HANDLE); |
| 220 } | 220 } |
| 221 | 221 |
| 222 } // namespace | 222 } // namespace |
| 223 | 223 |
| 224 class SyncApiTest : public testing::Test { | 224 class SyncApiTest : public testing::Test { |
| 225 public: | 225 public: |
| 226 virtual void SetUp() { | 226 virtual void SetUp() { |
| 227 test_user_share_.SetUp(); | 227 test_user_share_.SetUp(); |
| 228 SetUpEncryption(); | |
| 229 } | 228 } |
| 230 | 229 |
| 231 virtual void TearDown() { | 230 virtual void TearDown() { |
| 232 test_user_share_.TearDown(); | 231 test_user_share_.TearDown(); |
| 233 } | 232 } |
| 234 | 233 |
| 235 void SetUpEncryption() { | |
| 236 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | |
| 237 encryption_handler_.reset( | |
| 238 new SyncEncryptionHandlerImpl(test_user_share_.user_share(), | |
| 239 trans.GetCryptographer())); | |
| 240 trans.GetCryptographer()->SetNigoriHandler(encryption_handler_.get()); | |
| 241 } | |
| 242 | |
| 243 protected: | 234 protected: |
| 244 MessageLoop message_loop_; | 235 MessageLoop message_loop_; |
| 245 TestUserShare test_user_share_; | 236 TestUserShare test_user_share_; |
| 246 scoped_ptr<SyncEncryptionHandlerImpl> encryption_handler_; | |
| 247 }; | 237 }; |
| 248 | 238 |
| 249 TEST_F(SyncApiTest, SanityCheckTest) { | 239 TEST_F(SyncApiTest, SanityCheckTest) { |
| 250 { | 240 { |
| 251 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | 241 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); |
| 252 EXPECT_TRUE(trans.GetWrappedTrans() != NULL); | 242 EXPECT_TRUE(trans.GetWrappedTrans()); |
| 253 } | 243 } |
| 254 { | 244 { |
| 255 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); | 245 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); |
| 256 EXPECT_TRUE(trans.GetWrappedTrans() != NULL); | 246 EXPECT_TRUE(trans.GetWrappedTrans()); |
| 257 } | 247 } |
| 258 { | 248 { |
| 259 // No entries but root should exist | 249 // No entries but root should exist |
| 260 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | 250 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); |
| 261 ReadNode node(&trans); | 251 ReadNode node(&trans); |
| 262 // Metahandle 1 can be root, sanity check 2 | 252 // Metahandle 1 can be root, sanity check 2 |
| 263 EXPECT_EQ(BaseNode::INIT_FAILED_ENTRY_NOT_GOOD, node.InitByIdLookup(2)); | 253 EXPECT_EQ(BaseNode::INIT_FAILED_ENTRY_NOT_GOOD, node.InitByIdLookup(2)); |
| 264 } | 254 } |
| 265 } | 255 } |
| 266 | 256 |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 EXPECT_EQ("secret", data.password_value()); | 466 EXPECT_EQ("secret", data.password_value()); |
| 477 } | 467 } |
| 478 } | 468 } |
| 479 | 469 |
| 480 TEST_F(SyncApiTest, WriteEncryptedTitle) { | 470 TEST_F(SyncApiTest, WriteEncryptedTitle) { |
| 481 KeyParams params = {"localhost", "username", "passphrase"}; | 471 KeyParams params = {"localhost", "username", "passphrase"}; |
| 482 { | 472 { |
| 483 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | 473 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); |
| 484 trans.GetCryptographer()->AddKey(params); | 474 trans.GetCryptographer()->AddKey(params); |
| 485 } | 475 } |
| 486 encryption_handler_->EnableEncryptEverything(); | 476 test_user_share_.encryption_handler()->EnableEncryptEverything(); |
| 487 { | 477 { |
| 488 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); | 478 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); |
| 489 ReadNode root_node(&trans); | 479 ReadNode root_node(&trans); |
| 490 root_node.InitByRootLookup(); | 480 root_node.InitByRootLookup(); |
| 491 | 481 |
| 492 WriteNode bookmark_node(&trans); | 482 WriteNode bookmark_node(&trans); |
| 493 WriteNode::InitUniqueByCreationResult result = | 483 WriteNode::InitUniqueByCreationResult result = |
| 494 bookmark_node.InitUniqueByCreation(BOOKMARKS, | 484 bookmark_node.InitUniqueByCreation(BOOKMARKS, |
| 495 root_node, "foo"); | 485 root_node, "foo"); |
| 496 EXPECT_EQ(WriteNode::INIT_SUCCESS, result); | 486 EXPECT_EQ(WriteNode::INIT_SUCCESS, result); |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 return false; | 824 return false; |
| 835 if (encryption_status != UNINITIALIZED) { | 825 if (encryption_status != UNINITIALIZED) { |
| 836 KeyParams params = {"localhost", "dummy", "foobar"}; | 826 KeyParams params = {"localhost", "dummy", "foobar"}; |
| 837 cryptographer->AddKey(params); | 827 cryptographer->AddKey(params); |
| 838 } else { | 828 } else { |
| 839 DCHECK_NE(nigori_status, WRITE_TO_NIGORI); | 829 DCHECK_NE(nigori_status, WRITE_TO_NIGORI); |
| 840 } | 830 } |
| 841 if (nigori_status == WRITE_TO_NIGORI) { | 831 if (nigori_status == WRITE_TO_NIGORI) { |
| 842 sync_pb::NigoriSpecifics nigori; | 832 sync_pb::NigoriSpecifics nigori; |
| 843 cryptographer->GetKeys(nigori.mutable_encrypted()); | 833 cryptographer->GetKeys(nigori.mutable_encrypted()); |
| 844 cryptographer->UpdateNigoriFromEncryptedTypes( | 834 share->directory->GetNigoriHandler()->UpdateNigoriFromEncryptedTypes( |
| 845 &nigori, | 835 &nigori, |
| 846 trans.GetWrappedTrans()); | 836 trans.GetWrappedTrans()); |
| 847 WriteNode node(&trans); | 837 WriteNode node(&trans); |
| 848 EXPECT_EQ(BaseNode::INIT_OK, node.InitByIdLookup(nigori_id)); | 838 EXPECT_EQ(BaseNode::INIT_OK, node.InitByIdLookup(nigori_id)); |
| 849 node.SetNigoriSpecifics(nigori); | 839 node.SetNigoriSpecifics(nigori); |
| 850 } | 840 } |
| 851 return cryptographer->is_ready(); | 841 return cryptographer->is_ready(); |
| 852 } | 842 } |
| 853 | 843 |
| 854 int64 GetIdForDataType(ModelType type) { | 844 int64 GetIdForDataType(ModelType type) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 897 } | 887 } |
| 898 | 888 |
| 899 // Returns true if we are currently encrypting all sync data. May | 889 // Returns true if we are currently encrypting all sync data. May |
| 900 // be called on any thread. | 890 // be called on any thread. |
| 901 bool EncryptEverythingEnabledForTest() { | 891 bool EncryptEverythingEnabledForTest() { |
| 902 return sync_manager_.GetEncryptionHandler()->EncryptEverythingEnabled(); | 892 return sync_manager_.GetEncryptionHandler()->EncryptEverythingEnabled(); |
| 903 } | 893 } |
| 904 | 894 |
| 905 // Gets the set of encrypted types from the cryptographer | 895 // Gets the set of encrypted types from the cryptographer |
| 906 // Note: opens a transaction. May be called from any thread. | 896 // Note: opens a transaction. May be called from any thread. |
| 907 syncer::ModelTypeSet GetEncryptedDataTypesForTest() { | 897 ModelTypeSet GetEncryptedTypes() { |
| 908 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 898 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 909 return GetEncryptedTypes(&trans); | 899 return GetEncryptedTypesWithTrans(&trans); |
| 900 } |
| 901 |
| 902 ModelTypeSet GetEncryptedTypesWithTrans(BaseTransaction* trans) { |
| 903 return trans->GetDirectory()->GetNigoriHandler()-> |
| 904 GetEncryptedTypes(trans->GetWrappedTrans()); |
| 910 } | 905 } |
| 911 | 906 |
| 912 void SimulateEnableNotificationsForTest() { | 907 void SimulateEnableNotificationsForTest() { |
| 913 DCHECK(sync_manager_.thread_checker_.CalledOnValidThread()); | 908 DCHECK(sync_manager_.thread_checker_.CalledOnValidThread()); |
| 914 sync_manager_.OnNotificationsEnabled(); | 909 sync_manager_.OnNotificationsEnabled(); |
| 915 } | 910 } |
| 916 | 911 |
| 917 void SimulateDisableNotificationsForTest( | 912 void SimulateDisableNotificationsForTest( |
| 918 NotificationsDisabledReason reason) { | 913 NotificationsDisabledReason reason) { |
| 919 DCHECK(sync_manager_.thread_checker_.CalledOnValidThread()); | 914 DCHECK(sync_manager_.thread_checker_.CalledOnValidThread()); |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1349 TriggerOnIncomingNotificationForTest(model_types); | 1344 TriggerOnIncomingNotificationForTest(model_types); |
| 1350 | 1345 |
| 1351 // Should trigger the replies. | 1346 // Should trigger the replies. |
| 1352 PumpLoop(); | 1347 PumpLoop(); |
| 1353 } | 1348 } |
| 1354 | 1349 |
| 1355 TEST_F(SyncManagerTest, RefreshEncryptionReady) { | 1350 TEST_F(SyncManagerTest, RefreshEncryptionReady) { |
| 1356 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, DEFAULT_ENCRYPTION)); | 1351 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, DEFAULT_ENCRYPTION)); |
| 1357 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 1352 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 1358 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 1353 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 1354 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, false)); |
| 1359 | 1355 |
| 1360 sync_manager_.GetEncryptionHandler()->Init(); | 1356 sync_manager_.GetEncryptionHandler()->Init(); |
| 1361 PumpLoop(); | 1357 PumpLoop(); |
| 1362 | 1358 |
| 1363 const ModelTypeSet encrypted_types = GetEncryptedDataTypesForTest(); | 1359 const ModelTypeSet encrypted_types = GetEncryptedTypes(); |
| 1364 EXPECT_TRUE(encrypted_types.Has(PASSWORDS)); | 1360 EXPECT_TRUE(encrypted_types.Has(PASSWORDS)); |
| 1365 EXPECT_FALSE(EncryptEverythingEnabledForTest()); | 1361 EXPECT_FALSE(EncryptEverythingEnabledForTest()); |
| 1366 | 1362 |
| 1367 { | 1363 { |
| 1368 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1364 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 1369 ReadNode node(&trans); | 1365 ReadNode node(&trans); |
| 1370 EXPECT_EQ(BaseNode::INIT_OK, | 1366 EXPECT_EQ(BaseNode::INIT_OK, |
| 1371 node.InitByIdLookup(GetIdForDataType(NIGORI))); | 1367 node.InitByIdLookup(GetIdForDataType(NIGORI))); |
| 1372 sync_pb::NigoriSpecifics nigori = node.GetNigoriSpecifics(); | 1368 sync_pb::NigoriSpecifics nigori = node.GetNigoriSpecifics(); |
| 1373 EXPECT_TRUE(nigori.has_encrypted()); | 1369 EXPECT_TRUE(nigori.has_encrypted()); |
| 1374 Cryptographer* cryptographer = trans.GetCryptographer(); | 1370 Cryptographer* cryptographer = trans.GetCryptographer(); |
| 1375 EXPECT_TRUE(cryptographer->is_ready()); | 1371 EXPECT_TRUE(cryptographer->is_ready()); |
| 1376 EXPECT_TRUE(cryptographer->CanDecrypt(nigori.encrypted())); | 1372 EXPECT_TRUE(cryptographer->CanDecrypt(nigori.encrypted())); |
| 1377 } | 1373 } |
| 1378 } | 1374 } |
| 1379 | 1375 |
| 1380 // Attempt to refresh encryption when nigori not downloaded. | 1376 // Attempt to refresh encryption when nigori not downloaded. |
| 1381 TEST_F(SyncManagerTest, RefreshEncryptionNotReady) { | 1377 TEST_F(SyncManagerTest, RefreshEncryptionNotReady) { |
| 1382 // Don't set up encryption (no nigori node created). | 1378 // Don't set up encryption (no nigori node created). |
| 1383 | 1379 |
| 1384 // Should fail. Triggers an OnPassphraseRequired because the cryptographer | 1380 // Should fail. Triggers an OnPassphraseRequired because the cryptographer |
| 1385 // is not ready. | 1381 // is not ready. |
| 1386 EXPECT_CALL(encryption_observer_, OnPassphraseRequired(_, _)).Times(1); | 1382 EXPECT_CALL(encryption_observer_, OnPassphraseRequired(_, _)).Times(1); |
| 1387 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 1383 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 1384 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, false)); |
| 1388 sync_manager_.GetEncryptionHandler()->Init(); | 1385 sync_manager_.GetEncryptionHandler()->Init(); |
| 1389 PumpLoop(); | 1386 PumpLoop(); |
| 1390 | 1387 |
| 1391 const ModelTypeSet encrypted_types = GetEncryptedDataTypesForTest(); | 1388 const ModelTypeSet encrypted_types = GetEncryptedTypes(); |
| 1392 EXPECT_TRUE(encrypted_types.Has(PASSWORDS)); // Hardcoded. | 1389 EXPECT_TRUE(encrypted_types.Has(PASSWORDS)); // Hardcoded. |
| 1393 EXPECT_FALSE(EncryptEverythingEnabledForTest()); | 1390 EXPECT_FALSE(EncryptEverythingEnabledForTest()); |
| 1394 } | 1391 } |
| 1395 | 1392 |
| 1396 // Attempt to refresh encryption when nigori is empty. | 1393 // Attempt to refresh encryption when nigori is empty. |
| 1397 TEST_F(SyncManagerTest, RefreshEncryptionEmptyNigori) { | 1394 TEST_F(SyncManagerTest, RefreshEncryptionEmptyNigori) { |
| 1398 EXPECT_TRUE(SetUpEncryption(DONT_WRITE_NIGORI, DEFAULT_ENCRYPTION)); | 1395 EXPECT_TRUE(SetUpEncryption(DONT_WRITE_NIGORI, DEFAULT_ENCRYPTION)); |
| 1399 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()).Times(1); | 1396 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()).Times(1); |
| 1400 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 1397 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 1398 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, false)); |
| 1401 | 1399 |
| 1402 // Should write to nigori. | 1400 // Should write to nigori. |
| 1403 sync_manager_.GetEncryptionHandler()->Init(); | 1401 sync_manager_.GetEncryptionHandler()->Init(); |
| 1404 PumpLoop(); | 1402 PumpLoop(); |
| 1405 | 1403 |
| 1406 const ModelTypeSet encrypted_types = GetEncryptedDataTypesForTest(); | 1404 const ModelTypeSet encrypted_types = GetEncryptedTypes(); |
| 1407 EXPECT_TRUE(encrypted_types.Has(PASSWORDS)); // Hardcoded. | 1405 EXPECT_TRUE(encrypted_types.Has(PASSWORDS)); // Hardcoded. |
| 1408 EXPECT_FALSE(EncryptEverythingEnabledForTest()); | 1406 EXPECT_FALSE(EncryptEverythingEnabledForTest()); |
| 1409 | 1407 |
| 1410 { | 1408 { |
| 1411 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1409 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 1412 ReadNode node(&trans); | 1410 ReadNode node(&trans); |
| 1413 EXPECT_EQ(BaseNode::INIT_OK, | 1411 EXPECT_EQ(BaseNode::INIT_OK, |
| 1414 node.InitByIdLookup(GetIdForDataType(NIGORI))); | 1412 node.InitByIdLookup(GetIdForDataType(NIGORI))); |
| 1415 sync_pb::NigoriSpecifics nigori = node.GetNigoriSpecifics(); | 1413 sync_pb::NigoriSpecifics nigori = node.GetNigoriSpecifics(); |
| 1416 EXPECT_TRUE(nigori.has_encrypted()); | 1414 EXPECT_TRUE(nigori.has_encrypted()); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1453 } | 1451 } |
| 1454 // Last batch_size nodes are a third type that will not need encryption. | 1452 // Last batch_size nodes are a third type that will not need encryption. |
| 1455 for (; i < 3*batch_size; ++i) { | 1453 for (; i < 3*batch_size; ++i) { |
| 1456 MakeNodeWithParent(sync_manager_.GetUserShare(), THEMES, | 1454 MakeNodeWithParent(sync_manager_.GetUserShare(), THEMES, |
| 1457 base::StringPrintf("%"PRIuS"", i), | 1455 base::StringPrintf("%"PRIuS"", i), |
| 1458 GetIdForDataType(THEMES)); | 1456 GetIdForDataType(THEMES)); |
| 1459 } | 1457 } |
| 1460 | 1458 |
| 1461 { | 1459 { |
| 1462 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1460 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 1463 EXPECT_TRUE(GetEncryptedTypes(&trans).Equals( | 1461 EXPECT_TRUE(GetEncryptedTypesWithTrans(&trans).Equals( |
| 1464 SyncEncryptionHandler::SensitiveTypes())); | 1462 SyncEncryptionHandler::SensitiveTypes())); |
| 1465 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1463 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1466 trans.GetWrappedTrans(), | 1464 trans.GetWrappedTrans(), |
| 1467 trans.GetCryptographer(), | |
| 1468 BOOKMARKS, | 1465 BOOKMARKS, |
| 1469 false /* not encrypted */)); | 1466 false /* not encrypted */)); |
| 1470 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1467 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1471 trans.GetWrappedTrans(), | 1468 trans.GetWrappedTrans(), |
| 1472 trans.GetCryptographer(), | |
| 1473 SESSIONS, | 1469 SESSIONS, |
| 1474 false /* not encrypted */)); | 1470 false /* not encrypted */)); |
| 1475 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1471 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1476 trans.GetWrappedTrans(), | 1472 trans.GetWrappedTrans(), |
| 1477 trans.GetCryptographer(), | |
| 1478 THEMES, | 1473 THEMES, |
| 1479 false /* not encrypted */)); | 1474 false /* not encrypted */)); |
| 1480 } | 1475 } |
| 1481 | 1476 |
| 1482 EXPECT_CALL(encryption_observer_, | 1477 EXPECT_CALL(encryption_observer_, |
| 1483 OnEncryptedTypesChanged( | 1478 OnEncryptedTypesChanged( |
| 1484 HasModelTypes(ModelTypeSet::All()), true)); | 1479 HasModelTypes(ModelTypeSet::All()), true)); |
| 1485 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 1480 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 1486 sync_manager_.GetEncryptionHandler()->EnableEncryptEverything(); | 1481 sync_manager_.GetEncryptionHandler()->EnableEncryptEverything(); |
| 1487 EXPECT_TRUE(EncryptEverythingEnabledForTest()); | 1482 EXPECT_TRUE(EncryptEverythingEnabledForTest()); |
| 1488 { | 1483 { |
| 1489 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1484 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 1490 EXPECT_TRUE(GetEncryptedTypes(&trans).Equals( | 1485 EXPECT_TRUE(GetEncryptedTypesWithTrans(&trans).Equals( |
| 1491 ModelTypeSet::All())); | 1486 ModelTypeSet::All())); |
| 1492 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1487 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1493 trans.GetWrappedTrans(), | 1488 trans.GetWrappedTrans(), |
| 1494 trans.GetCryptographer(), | |
| 1495 BOOKMARKS, | 1489 BOOKMARKS, |
| 1496 true /* is encrypted */)); | 1490 true /* is encrypted */)); |
| 1497 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1491 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1498 trans.GetWrappedTrans(), | 1492 trans.GetWrappedTrans(), |
| 1499 trans.GetCryptographer(), | |
| 1500 SESSIONS, | 1493 SESSIONS, |
| 1501 true /* is encrypted */)); | 1494 true /* is encrypted */)); |
| 1502 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1495 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1503 trans.GetWrappedTrans(), | 1496 trans.GetWrappedTrans(), |
| 1504 trans.GetCryptographer(), | |
| 1505 THEMES, | 1497 THEMES, |
| 1506 true /* is encrypted */)); | 1498 true /* is encrypted */)); |
| 1507 } | 1499 } |
| 1508 | 1500 |
| 1509 // Trigger's a ReEncryptEverything with new passphrase. | 1501 // Trigger's a ReEncryptEverything with new passphrase. |
| 1510 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); | 1502 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); |
| 1511 EXPECT_CALL(encryption_observer_, OnBootstrapTokenUpdated(_)); | 1503 EXPECT_CALL(encryption_observer_, OnBootstrapTokenUpdated(_)); |
| 1512 EXPECT_CALL(encryption_observer_, OnPassphraseAccepted()); | 1504 EXPECT_CALL(encryption_observer_, OnPassphraseAccepted()); |
| 1513 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 1505 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 1514 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 1506 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 1515 sync_manager_.GetEncryptionHandler()->SetEncryptionPassphrase( | 1507 sync_manager_.GetEncryptionHandler()->SetEncryptionPassphrase( |
| 1516 "new_passphrase", true); | 1508 "new_passphrase", true); |
| 1517 EXPECT_TRUE(EncryptEverythingEnabledForTest()); | 1509 EXPECT_TRUE(EncryptEverythingEnabledForTest()); |
| 1518 { | 1510 { |
| 1519 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1511 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 1520 EXPECT_TRUE(GetEncryptedTypes(&trans).Equals(ModelTypeSet::All())); | 1512 EXPECT_TRUE(GetEncryptedTypesWithTrans(&trans).Equals(ModelTypeSet::All())); |
| 1521 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1513 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1522 trans.GetWrappedTrans(), | 1514 trans.GetWrappedTrans(), |
| 1523 trans.GetCryptographer(), | |
| 1524 BOOKMARKS, | 1515 BOOKMARKS, |
| 1525 true /* is encrypted */)); | 1516 true /* is encrypted */)); |
| 1526 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1517 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1527 trans.GetWrappedTrans(), | 1518 trans.GetWrappedTrans(), |
| 1528 trans.GetCryptographer(), | |
| 1529 SESSIONS, | 1519 SESSIONS, |
| 1530 true /* is encrypted */)); | 1520 true /* is encrypted */)); |
| 1531 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1521 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1532 trans.GetWrappedTrans(), | 1522 trans.GetWrappedTrans(), |
| 1533 trans.GetCryptographer(), | |
| 1534 THEMES, | 1523 THEMES, |
| 1535 true /* is encrypted */)); | 1524 true /* is encrypted */)); |
| 1536 } | 1525 } |
| 1537 // Calling EncryptDataTypes with an empty encrypted types should not trigger | 1526 // Calling EncryptDataTypes with an empty encrypted types should not trigger |
| 1538 // a reencryption and should just notify immediately. | 1527 // a reencryption and should just notify immediately. |
| 1539 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); | 1528 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); |
| 1540 EXPECT_CALL(encryption_observer_, OnBootstrapTokenUpdated(_)).Times(0); | 1529 EXPECT_CALL(encryption_observer_, OnBootstrapTokenUpdated(_)).Times(0); |
| 1541 EXPECT_CALL(encryption_observer_, OnPassphraseAccepted()).Times(0); | 1530 EXPECT_CALL(encryption_observer_, OnPassphraseAccepted()).Times(0); |
| 1542 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()).Times(0); | 1531 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()).Times(0); |
| 1543 sync_manager_.GetEncryptionHandler()->EnableEncryptEverything(); | 1532 sync_manager_.GetEncryptionHandler()->EnableEncryptEverything(); |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1984 // specifics should be stored in the server legal form. | 1973 // specifics should be stored in the server legal form. |
| 1985 EXPECT_EQ(raw_title2, node2.GetTitle()); | 1974 EXPECT_EQ(raw_title2, node2.GetTitle()); |
| 1986 EXPECT_EQ(title2, node2.GetBookmarkSpecifics().title()); | 1975 EXPECT_EQ(title2, node2.GetBookmarkSpecifics().title()); |
| 1987 EXPECT_EQ(url2, node2.GetBookmarkSpecifics().url()); | 1976 EXPECT_EQ(url2, node2.GetBookmarkSpecifics().url()); |
| 1988 } | 1977 } |
| 1989 | 1978 |
| 1990 { | 1979 { |
| 1991 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1980 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 1992 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1981 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1993 trans.GetWrappedTrans(), | 1982 trans.GetWrappedTrans(), |
| 1994 trans.GetCryptographer(), | |
| 1995 BOOKMARKS, | 1983 BOOKMARKS, |
| 1996 false /* not encrypted */)); | 1984 false /* not encrypted */)); |
| 1997 } | 1985 } |
| 1998 | 1986 |
| 1999 EXPECT_CALL(encryption_observer_, | 1987 EXPECT_CALL(encryption_observer_, |
| 2000 OnEncryptedTypesChanged( | 1988 OnEncryptedTypesChanged( |
| 2001 HasModelTypes(ModelTypeSet::All()), true)); | 1989 HasModelTypes(ModelTypeSet::All()), true)); |
| 2002 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 1990 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 2003 sync_manager_.GetEncryptionHandler()->EnableEncryptEverything(); | 1991 sync_manager_.GetEncryptionHandler()->EnableEncryptEverything(); |
| 2004 EXPECT_TRUE(EncryptEverythingEnabledForTest()); | 1992 EXPECT_TRUE(EncryptEverythingEnabledForTest()); |
| 2005 | 1993 |
| 2006 { | 1994 { |
| 2007 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1995 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 2008 EXPECT_TRUE(GetEncryptedTypes(&trans).Equals(ModelTypeSet::All())); | 1996 EXPECT_TRUE(GetEncryptedTypesWithTrans(&trans).Equals(ModelTypeSet::All())); |
| 2009 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1997 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 2010 trans.GetWrappedTrans(), | 1998 trans.GetWrappedTrans(), |
| 2011 trans.GetCryptographer(), | |
| 2012 BOOKMARKS, | 1999 BOOKMARKS, |
| 2013 true /* is encrypted */)); | 2000 true /* is encrypted */)); |
| 2014 | 2001 |
| 2015 ReadNode node(&trans); | 2002 ReadNode node(&trans); |
| 2016 EXPECT_EQ(BaseNode::INIT_OK, node.InitByIdLookup(node_id1)); | 2003 EXPECT_EQ(BaseNode::INIT_OK, node.InitByIdLookup(node_id1)); |
| 2017 EXPECT_EQ(BOOKMARKS, node.GetModelType()); | 2004 EXPECT_EQ(BOOKMARKS, node.GetModelType()); |
| 2018 EXPECT_EQ(title, node.GetTitle()); | 2005 EXPECT_EQ(title, node.GetTitle()); |
| 2019 EXPECT_EQ(title, node.GetBookmarkSpecifics().title()); | 2006 EXPECT_EQ(title, node.GetBookmarkSpecifics().title()); |
| 2020 EXPECT_EQ(url, node.GetBookmarkSpecifics().url()); | 2007 EXPECT_EQ(url, node.GetBookmarkSpecifics().url()); |
| 2021 | 2008 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2084 EXPECT_FALSE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); | 2071 EXPECT_FALSE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); |
| 2085 | 2072 |
| 2086 // Encrypt the datatatype, should set is_unsynced. | 2073 // Encrypt the datatatype, should set is_unsynced. |
| 2087 EXPECT_CALL(encryption_observer_, | 2074 EXPECT_CALL(encryption_observer_, |
| 2088 OnEncryptedTypesChanged( | 2075 OnEncryptedTypesChanged( |
| 2089 HasModelTypes(ModelTypeSet::All()), true)); | 2076 HasModelTypes(ModelTypeSet::All()), true)); |
| 2090 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 2077 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 2091 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, FULL_ENCRYPTION)); | 2078 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, FULL_ENCRYPTION)); |
| 2092 | 2079 |
| 2093 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 2080 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 2081 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, true)); |
| 2094 sync_manager_.GetEncryptionHandler()->Init(); | 2082 sync_manager_.GetEncryptionHandler()->Init(); |
| 2095 PumpLoop(); | 2083 PumpLoop(); |
| 2096 { | 2084 { |
| 2097 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 2085 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 2098 ReadNode node(&trans); | 2086 ReadNode node(&trans); |
| 2099 EXPECT_EQ(BaseNode::INIT_OK, | 2087 EXPECT_EQ(BaseNode::INIT_OK, |
| 2100 node.InitByClientTagLookup(BOOKMARKS, client_tag)); | 2088 node.InitByClientTagLookup(BOOKMARKS, client_tag)); |
| 2101 const syncable::Entry* node_entry = node.GetEntry(); | 2089 const syncable::Entry* node_entry = node.GetEntry(); |
| 2102 const sync_pb::EntitySpecifics& specifics = node_entry->Get(SPECIFICS); | 2090 const sync_pb::EntitySpecifics& specifics = node_entry->Get(SPECIFICS); |
| 2103 EXPECT_TRUE(specifics.has_encrypted()); | 2091 EXPECT_TRUE(specifics.has_encrypted()); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2131 EXPECT_TRUE(cryptographer->is_ready()); | 2119 EXPECT_TRUE(cryptographer->is_ready()); |
| 2132 EXPECT_TRUE(cryptographer->CanDecryptUsingDefaultKey( | 2120 EXPECT_TRUE(cryptographer->CanDecryptUsingDefaultKey( |
| 2133 specifics.encrypted())); | 2121 specifics.encrypted())); |
| 2134 } | 2122 } |
| 2135 EXPECT_TRUE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); | 2123 EXPECT_TRUE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); |
| 2136 | 2124 |
| 2137 // Force a re-encrypt everything. Should not set is_unsynced. | 2125 // Force a re-encrypt everything. Should not set is_unsynced. |
| 2138 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); | 2126 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); |
| 2139 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 2127 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 2140 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 2128 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 2129 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, true)); |
| 2141 | 2130 |
| 2142 sync_manager_.GetEncryptionHandler()->Init(); | 2131 sync_manager_.GetEncryptionHandler()->Init(); |
| 2143 PumpLoop(); | 2132 PumpLoop(); |
| 2144 | 2133 |
| 2145 { | 2134 { |
| 2146 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 2135 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 2147 ReadNode node(&trans); | 2136 ReadNode node(&trans); |
| 2148 EXPECT_EQ(BaseNode::INIT_OK, | 2137 EXPECT_EQ(BaseNode::INIT_OK, |
| 2149 node.InitByClientTagLookup(BOOKMARKS, client_tag)); | 2138 node.InitByClientTagLookup(BOOKMARKS, client_tag)); |
| 2150 const syncable::Entry* node_entry = node.GetEntry(); | 2139 const syncable::Entry* node_entry = node.GetEntry(); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2337 BaseNode::GenerateSyncableHash(PASSWORDS, | 2326 BaseNode::GenerateSyncableHash(PASSWORDS, |
| 2338 client_tag), | 2327 client_tag), |
| 2339 entity_specifics); | 2328 entity_specifics); |
| 2340 // New node shouldn't start off unsynced. | 2329 // New node shouldn't start off unsynced. |
| 2341 EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag)); | 2330 EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag)); |
| 2342 | 2331 |
| 2343 // Force a re-encrypt everything. Should not set is_unsynced. | 2332 // Force a re-encrypt everything. Should not set is_unsynced. |
| 2344 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); | 2333 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); |
| 2345 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 2334 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 2346 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 2335 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 2336 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, false)); |
| 2347 sync_manager_.GetEncryptionHandler()->Init(); | 2337 sync_manager_.GetEncryptionHandler()->Init(); |
| 2348 PumpLoop(); | 2338 PumpLoop(); |
| 2349 EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag)); | 2339 EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag)); |
| 2350 } | 2340 } |
| 2351 | 2341 |
| 2352 // Verify SetTitle(..) doesn't unnecessarily set IS_UNSYNCED for bookmarks | 2342 // Verify SetTitle(..) doesn't unnecessarily set IS_UNSYNCED for bookmarks |
| 2353 // when we write the same data, but does set it when we write new data. | 2343 // when we write the same data, but does set it when we write new data. |
| 2354 TEST_F(SyncManagerTest, SetBookmarkTitle) { | 2344 TEST_F(SyncManagerTest, SetBookmarkTitle) { |
| 2355 std::string client_tag = "title"; | 2345 std::string client_tag = "title"; |
| 2356 sync_pb::EntitySpecifics entity_specifics; | 2346 sync_pb::EntitySpecifics entity_specifics; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2399 // New node shouldn't start off unsynced. | 2389 // New node shouldn't start off unsynced. |
| 2400 EXPECT_FALSE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); | 2390 EXPECT_FALSE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); |
| 2401 | 2391 |
| 2402 // Encrypt the datatatype, should set is_unsynced. | 2392 // Encrypt the datatatype, should set is_unsynced. |
| 2403 EXPECT_CALL(encryption_observer_, | 2393 EXPECT_CALL(encryption_observer_, |
| 2404 OnEncryptedTypesChanged( | 2394 OnEncryptedTypesChanged( |
| 2405 HasModelTypes(ModelTypeSet::All()), true)); | 2395 HasModelTypes(ModelTypeSet::All()), true)); |
| 2406 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 2396 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 2407 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, FULL_ENCRYPTION)); | 2397 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, FULL_ENCRYPTION)); |
| 2408 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 2398 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 2399 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, true)); |
| 2409 sync_manager_.GetEncryptionHandler()->Init(); | 2400 sync_manager_.GetEncryptionHandler()->Init(); |
| 2410 PumpLoop(); | 2401 PumpLoop(); |
| 2411 EXPECT_TRUE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); | 2402 EXPECT_TRUE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); |
| 2412 | 2403 |
| 2413 // Manually change to the same title. Should not set is_unsynced. | 2404 // Manually change to the same title. Should not set is_unsynced. |
| 2414 // NON_UNIQUE_NAME should be kEncryptedString. | 2405 // NON_UNIQUE_NAME should be kEncryptedString. |
| 2415 { | 2406 { |
| 2416 WriteTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 2407 WriteTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 2417 WriteNode node(&trans); | 2408 WriteNode node(&trans); |
| 2418 EXPECT_EQ(BaseNode::INIT_OK, | 2409 EXPECT_EQ(BaseNode::INIT_OK, |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2495 // New node shouldn't start off unsynced. | 2486 // New node shouldn't start off unsynced. |
| 2496 EXPECT_FALSE(ResetUnsyncedEntry(PREFERENCES, client_tag)); | 2487 EXPECT_FALSE(ResetUnsyncedEntry(PREFERENCES, client_tag)); |
| 2497 | 2488 |
| 2498 // Encrypt the datatatype, should set is_unsynced. | 2489 // Encrypt the datatatype, should set is_unsynced. |
| 2499 EXPECT_CALL(encryption_observer_, | 2490 EXPECT_CALL(encryption_observer_, |
| 2500 OnEncryptedTypesChanged( | 2491 OnEncryptedTypesChanged( |
| 2501 HasModelTypes(ModelTypeSet::All()), true)); | 2492 HasModelTypes(ModelTypeSet::All()), true)); |
| 2502 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 2493 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 2503 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, FULL_ENCRYPTION)); | 2494 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, FULL_ENCRYPTION)); |
| 2504 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 2495 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 2496 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, true)); |
| 2505 sync_manager_.GetEncryptionHandler()->Init(); | 2497 sync_manager_.GetEncryptionHandler()->Init(); |
| 2506 PumpLoop(); | 2498 PumpLoop(); |
| 2507 EXPECT_TRUE(ResetUnsyncedEntry(PREFERENCES, client_tag)); | 2499 EXPECT_TRUE(ResetUnsyncedEntry(PREFERENCES, client_tag)); |
| 2508 | 2500 |
| 2509 // Manually change to the same title. Should not set is_unsynced. | 2501 // Manually change to the same title. Should not set is_unsynced. |
| 2510 // NON_UNIQUE_NAME should be kEncryptedString. | 2502 // NON_UNIQUE_NAME should be kEncryptedString. |
| 2511 { | 2503 { |
| 2512 WriteTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 2504 WriteTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 2513 WriteNode node(&trans); | 2505 WriteNode node(&trans); |
| 2514 EXPECT_EQ(BaseNode::INIT_OK, | 2506 EXPECT_EQ(BaseNode::INIT_OK, |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2867 | 2859 |
| 2868 // Verify only the non-disabled types remain after cleanup. | 2860 // Verify only the non-disabled types remain after cleanup. |
| 2869 sync_manager_.PurgeDisabledTypes(enabled_types, new_enabled_types); | 2861 sync_manager_.PurgeDisabledTypes(enabled_types, new_enabled_types); |
| 2870 EXPECT_TRUE(new_enabled_types.Equals( | 2862 EXPECT_TRUE(new_enabled_types.Equals( |
| 2871 Union(sync_manager_.InitialSyncEndedTypes(), partial_enabled_types))); | 2863 Union(sync_manager_.InitialSyncEndedTypes(), partial_enabled_types))); |
| 2872 EXPECT_TRUE(disabled_types.Equals( | 2864 EXPECT_TRUE(disabled_types.Equals( |
| 2873 sync_manager_.GetTypesWithEmptyProgressMarkerToken(ModelTypeSet::All()))); | 2865 sync_manager_.GetTypesWithEmptyProgressMarkerToken(ModelTypeSet::All()))); |
| 2874 } | 2866 } |
| 2875 | 2867 |
| 2876 } // namespace | 2868 } // namespace |
| OLD | NEW |