| 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 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 entry.Put(syncable::SPECIFICS, specifics); | 220 entry.Put(syncable::SPECIFICS, specifics); |
| 221 return entry.Get(syncable::META_HANDLE); | 221 return entry.Get(syncable::META_HANDLE); |
| 222 } | 222 } |
| 223 | 223 |
| 224 } // namespace | 224 } // namespace |
| 225 | 225 |
| 226 class SyncApiTest : public testing::Test { | 226 class SyncApiTest : public testing::Test { |
| 227 public: | 227 public: |
| 228 virtual void SetUp() { | 228 virtual void SetUp() { |
| 229 test_user_share_.SetUp(); | 229 test_user_share_.SetUp(); |
| 230 SetUpEncryption(); | |
| 231 } | 230 } |
| 232 | 231 |
| 233 virtual void TearDown() { | 232 virtual void TearDown() { |
| 234 test_user_share_.TearDown(); | 233 test_user_share_.TearDown(); |
| 235 } | 234 } |
| 236 | 235 |
| 237 void SetUpEncryption() { | |
| 238 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | |
| 239 encryption_handler_.reset( | |
| 240 new SyncEncryptionHandlerImpl(test_user_share_.user_share(), | |
| 241 trans.GetCryptographer())); | |
| 242 trans.GetCryptographer()->SetNigoriHandler(encryption_handler_.get()); | |
| 243 } | |
| 244 | |
| 245 protected: | 236 protected: |
| 246 MessageLoop message_loop_; | 237 MessageLoop message_loop_; |
| 247 TestUserShare test_user_share_; | 238 TestUserShare test_user_share_; |
| 248 scoped_ptr<SyncEncryptionHandlerImpl> encryption_handler_; | |
| 249 }; | 239 }; |
| 250 | 240 |
| 251 TEST_F(SyncApiTest, SanityCheckTest) { | 241 TEST_F(SyncApiTest, SanityCheckTest) { |
| 252 { | 242 { |
| 253 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | 243 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); |
| 254 EXPECT_TRUE(trans.GetWrappedTrans() != NULL); | 244 EXPECT_TRUE(trans.GetWrappedTrans()); |
| 255 } | 245 } |
| 256 { | 246 { |
| 257 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); | 247 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); |
| 258 EXPECT_TRUE(trans.GetWrappedTrans() != NULL); | 248 EXPECT_TRUE(trans.GetWrappedTrans()); |
| 259 } | 249 } |
| 260 { | 250 { |
| 261 // No entries but root should exist | 251 // No entries but root should exist |
| 262 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | 252 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); |
| 263 ReadNode node(&trans); | 253 ReadNode node(&trans); |
| 264 // Metahandle 1 can be root, sanity check 2 | 254 // Metahandle 1 can be root, sanity check 2 |
| 265 EXPECT_EQ(BaseNode::INIT_FAILED_ENTRY_NOT_GOOD, node.InitByIdLookup(2)); | 255 EXPECT_EQ(BaseNode::INIT_FAILED_ENTRY_NOT_GOOD, node.InitByIdLookup(2)); |
| 266 } | 256 } |
| 267 } | 257 } |
| 268 | 258 |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 EXPECT_EQ("secret", data.password_value()); | 468 EXPECT_EQ("secret", data.password_value()); |
| 479 } | 469 } |
| 480 } | 470 } |
| 481 | 471 |
| 482 TEST_F(SyncApiTest, WriteEncryptedTitle) { | 472 TEST_F(SyncApiTest, WriteEncryptedTitle) { |
| 483 KeyParams params = {"localhost", "username", "passphrase"}; | 473 KeyParams params = {"localhost", "username", "passphrase"}; |
| 484 { | 474 { |
| 485 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); | 475 ReadTransaction trans(FROM_HERE, test_user_share_.user_share()); |
| 486 trans.GetCryptographer()->AddKey(params); | 476 trans.GetCryptographer()->AddKey(params); |
| 487 } | 477 } |
| 488 encryption_handler_->EnableEncryptEverything(); | 478 test_user_share_.encryption_handler()->EnableEncryptEverything(); |
| 489 { | 479 { |
| 490 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); | 480 WriteTransaction trans(FROM_HERE, test_user_share_.user_share()); |
| 491 ReadNode root_node(&trans); | 481 ReadNode root_node(&trans); |
| 492 root_node.InitByRootLookup(); | 482 root_node.InitByRootLookup(); |
| 493 | 483 |
| 494 WriteNode bookmark_node(&trans); | 484 WriteNode bookmark_node(&trans); |
| 495 WriteNode::InitUniqueByCreationResult result = | 485 WriteNode::InitUniqueByCreationResult result = |
| 496 bookmark_node.InitUniqueByCreation(BOOKMARKS, | 486 bookmark_node.InitUniqueByCreation(BOOKMARKS, |
| 497 root_node, "foo"); | 487 root_node, "foo"); |
| 498 EXPECT_EQ(WriteNode::INIT_SUCCESS, result); | 488 EXPECT_EQ(WriteNode::INIT_SUCCESS, result); |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 854 return false; | 844 return false; |
| 855 if (encryption_status != UNINITIALIZED) { | 845 if (encryption_status != UNINITIALIZED) { |
| 856 KeyParams params = {"localhost", "dummy", "foobar"}; | 846 KeyParams params = {"localhost", "dummy", "foobar"}; |
| 857 cryptographer->AddKey(params); | 847 cryptographer->AddKey(params); |
| 858 } else { | 848 } else { |
| 859 DCHECK_NE(nigori_status, WRITE_TO_NIGORI); | 849 DCHECK_NE(nigori_status, WRITE_TO_NIGORI); |
| 860 } | 850 } |
| 861 if (nigori_status == WRITE_TO_NIGORI) { | 851 if (nigori_status == WRITE_TO_NIGORI) { |
| 862 sync_pb::NigoriSpecifics nigori; | 852 sync_pb::NigoriSpecifics nigori; |
| 863 cryptographer->GetKeys(nigori.mutable_encrypted()); | 853 cryptographer->GetKeys(nigori.mutable_encrypted()); |
| 864 cryptographer->UpdateNigoriFromEncryptedTypes( | 854 share->directory->GetNigoriHandler()->UpdateNigoriFromEncryptedTypes( |
| 865 &nigori, | 855 &nigori, |
| 866 trans.GetWrappedTrans()); | 856 trans.GetWrappedTrans()); |
| 867 WriteNode node(&trans); | 857 WriteNode node(&trans); |
| 868 EXPECT_EQ(BaseNode::INIT_OK, node.InitByIdLookup(nigori_id)); | 858 EXPECT_EQ(BaseNode::INIT_OK, node.InitByIdLookup(nigori_id)); |
| 869 node.SetNigoriSpecifics(nigori); | 859 node.SetNigoriSpecifics(nigori); |
| 870 } | 860 } |
| 871 return cryptographer->is_ready(); | 861 return cryptographer->is_ready(); |
| 872 } | 862 } |
| 873 | 863 |
| 874 int64 GetIdForDataType(ModelType type) { | 864 int64 GetIdForDataType(ModelType type) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 917 } | 907 } |
| 918 | 908 |
| 919 // Returns true if we are currently encrypting all sync data. May | 909 // Returns true if we are currently encrypting all sync data. May |
| 920 // be called on any thread. | 910 // be called on any thread. |
| 921 bool EncryptEverythingEnabledForTest() { | 911 bool EncryptEverythingEnabledForTest() { |
| 922 return sync_manager_.GetEncryptionHandler()->EncryptEverythingEnabled(); | 912 return sync_manager_.GetEncryptionHandler()->EncryptEverythingEnabled(); |
| 923 } | 913 } |
| 924 | 914 |
| 925 // Gets the set of encrypted types from the cryptographer | 915 // Gets the set of encrypted types from the cryptographer |
| 926 // Note: opens a transaction. May be called from any thread. | 916 // Note: opens a transaction. May be called from any thread. |
| 927 syncer::ModelTypeSet GetEncryptedDataTypesForTest() { | 917 ModelTypeSet GetEncryptedTypes() { |
| 928 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 918 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 929 return GetEncryptedTypes(&trans); | 919 return GetEncryptedTypesWithTrans(&trans); |
| 920 } |
| 921 |
| 922 ModelTypeSet GetEncryptedTypesWithTrans(BaseTransaction* trans) { |
| 923 return trans->GetDirectory()->GetNigoriHandler()-> |
| 924 GetEncryptedTypes(trans->GetWrappedTrans()); |
| 930 } | 925 } |
| 931 | 926 |
| 932 void SimulateEnableNotificationsForTest() { | 927 void SimulateEnableNotificationsForTest() { |
| 933 DCHECK(sync_manager_.thread_checker_.CalledOnValidThread()); | 928 DCHECK(sync_manager_.thread_checker_.CalledOnValidThread()); |
| 934 sync_manager_.OnNotificationsEnabled(); | 929 sync_manager_.OnNotificationsEnabled(); |
| 935 } | 930 } |
| 936 | 931 |
| 937 void SimulateDisableNotificationsForTest( | 932 void SimulateDisableNotificationsForTest( |
| 938 NotificationsDisabledReason reason) { | 933 NotificationsDisabledReason reason) { |
| 939 DCHECK(sync_manager_.thread_checker_.CalledOnValidThread()); | 934 DCHECK(sync_manager_.thread_checker_.CalledOnValidThread()); |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1372 TriggerOnIncomingNotificationForTest(model_types); | 1367 TriggerOnIncomingNotificationForTest(model_types); |
| 1373 | 1368 |
| 1374 // Should trigger the replies. | 1369 // Should trigger the replies. |
| 1375 PumpLoop(); | 1370 PumpLoop(); |
| 1376 } | 1371 } |
| 1377 | 1372 |
| 1378 TEST_F(SyncManagerTest, RefreshEncryptionReady) { | 1373 TEST_F(SyncManagerTest, RefreshEncryptionReady) { |
| 1379 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, DEFAULT_ENCRYPTION)); | 1374 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, DEFAULT_ENCRYPTION)); |
| 1380 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 1375 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 1381 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 1376 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 1377 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, false)); |
| 1382 | 1378 |
| 1383 sync_manager_.GetEncryptionHandler()->Init(); | 1379 sync_manager_.GetEncryptionHandler()->Init(); |
| 1384 PumpLoop(); | 1380 PumpLoop(); |
| 1385 | 1381 |
| 1386 const ModelTypeSet encrypted_types = GetEncryptedDataTypesForTest(); | 1382 const ModelTypeSet encrypted_types = GetEncryptedTypes(); |
| 1387 EXPECT_TRUE(encrypted_types.Has(PASSWORDS)); | 1383 EXPECT_TRUE(encrypted_types.Has(PASSWORDS)); |
| 1388 EXPECT_FALSE(EncryptEverythingEnabledForTest()); | 1384 EXPECT_FALSE(EncryptEverythingEnabledForTest()); |
| 1389 | 1385 |
| 1390 { | 1386 { |
| 1391 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1387 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 1392 ReadNode node(&trans); | 1388 ReadNode node(&trans); |
| 1393 EXPECT_EQ(BaseNode::INIT_OK, | 1389 EXPECT_EQ(BaseNode::INIT_OK, |
| 1394 node.InitByIdLookup(GetIdForDataType(NIGORI))); | 1390 node.InitByIdLookup(GetIdForDataType(NIGORI))); |
| 1395 sync_pb::NigoriSpecifics nigori = node.GetNigoriSpecifics(); | 1391 sync_pb::NigoriSpecifics nigori = node.GetNigoriSpecifics(); |
| 1396 EXPECT_TRUE(nigori.has_encrypted()); | 1392 EXPECT_TRUE(nigori.has_encrypted()); |
| 1397 Cryptographer* cryptographer = trans.GetCryptographer(); | 1393 Cryptographer* cryptographer = trans.GetCryptographer(); |
| 1398 EXPECT_TRUE(cryptographer->is_ready()); | 1394 EXPECT_TRUE(cryptographer->is_ready()); |
| 1399 EXPECT_TRUE(cryptographer->CanDecrypt(nigori.encrypted())); | 1395 EXPECT_TRUE(cryptographer->CanDecrypt(nigori.encrypted())); |
| 1400 } | 1396 } |
| 1401 } | 1397 } |
| 1402 | 1398 |
| 1403 // Attempt to refresh encryption when nigori not downloaded. | 1399 // Attempt to refresh encryption when nigori not downloaded. |
| 1404 TEST_F(SyncManagerTest, RefreshEncryptionNotReady) { | 1400 TEST_F(SyncManagerTest, RefreshEncryptionNotReady) { |
| 1405 // Don't set up encryption (no nigori node created). | 1401 // Don't set up encryption (no nigori node created). |
| 1406 | 1402 |
| 1407 // Should fail. Triggers an OnPassphraseRequired because the cryptographer | 1403 // Should fail. Triggers an OnPassphraseRequired because the cryptographer |
| 1408 // is not ready. | 1404 // is not ready. |
| 1409 EXPECT_CALL(encryption_observer_, OnPassphraseRequired(_, _)).Times(1); | 1405 EXPECT_CALL(encryption_observer_, OnPassphraseRequired(_, _)).Times(1); |
| 1410 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 1406 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 1407 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, false)); |
| 1411 sync_manager_.GetEncryptionHandler()->Init(); | 1408 sync_manager_.GetEncryptionHandler()->Init(); |
| 1412 PumpLoop(); | 1409 PumpLoop(); |
| 1413 | 1410 |
| 1414 const ModelTypeSet encrypted_types = GetEncryptedDataTypesForTest(); | 1411 const ModelTypeSet encrypted_types = GetEncryptedTypes(); |
| 1415 EXPECT_TRUE(encrypted_types.Has(PASSWORDS)); // Hardcoded. | 1412 EXPECT_TRUE(encrypted_types.Has(PASSWORDS)); // Hardcoded. |
| 1416 EXPECT_FALSE(EncryptEverythingEnabledForTest()); | 1413 EXPECT_FALSE(EncryptEverythingEnabledForTest()); |
| 1417 } | 1414 } |
| 1418 | 1415 |
| 1419 // Attempt to refresh encryption when nigori is empty. | 1416 // Attempt to refresh encryption when nigori is empty. |
| 1420 TEST_F(SyncManagerTest, RefreshEncryptionEmptyNigori) { | 1417 TEST_F(SyncManagerTest, RefreshEncryptionEmptyNigori) { |
| 1421 EXPECT_TRUE(SetUpEncryption(DONT_WRITE_NIGORI, DEFAULT_ENCRYPTION)); | 1418 EXPECT_TRUE(SetUpEncryption(DONT_WRITE_NIGORI, DEFAULT_ENCRYPTION)); |
| 1422 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()).Times(1); | 1419 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()).Times(1); |
| 1423 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 1420 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 1421 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, false)); |
| 1424 | 1422 |
| 1425 // Should write to nigori. | 1423 // Should write to nigori. |
| 1426 sync_manager_.GetEncryptionHandler()->Init(); | 1424 sync_manager_.GetEncryptionHandler()->Init(); |
| 1427 PumpLoop(); | 1425 PumpLoop(); |
| 1428 | 1426 |
| 1429 const ModelTypeSet encrypted_types = GetEncryptedDataTypesForTest(); | 1427 const ModelTypeSet encrypted_types = GetEncryptedTypes(); |
| 1430 EXPECT_TRUE(encrypted_types.Has(PASSWORDS)); // Hardcoded. | 1428 EXPECT_TRUE(encrypted_types.Has(PASSWORDS)); // Hardcoded. |
| 1431 EXPECT_FALSE(EncryptEverythingEnabledForTest()); | 1429 EXPECT_FALSE(EncryptEverythingEnabledForTest()); |
| 1432 | 1430 |
| 1433 { | 1431 { |
| 1434 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1432 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 1435 ReadNode node(&trans); | 1433 ReadNode node(&trans); |
| 1436 EXPECT_EQ(BaseNode::INIT_OK, | 1434 EXPECT_EQ(BaseNode::INIT_OK, |
| 1437 node.InitByIdLookup(GetIdForDataType(NIGORI))); | 1435 node.InitByIdLookup(GetIdForDataType(NIGORI))); |
| 1438 sync_pb::NigoriSpecifics nigori = node.GetNigoriSpecifics(); | 1436 sync_pb::NigoriSpecifics nigori = node.GetNigoriSpecifics(); |
| 1439 EXPECT_TRUE(nigori.has_encrypted()); | 1437 EXPECT_TRUE(nigori.has_encrypted()); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1476 } | 1474 } |
| 1477 // Last batch_size nodes are a third type that will not need encryption. | 1475 // Last batch_size nodes are a third type that will not need encryption. |
| 1478 for (; i < 3*batch_size; ++i) { | 1476 for (; i < 3*batch_size; ++i) { |
| 1479 MakeNodeWithParent(sync_manager_.GetUserShare(), THEMES, | 1477 MakeNodeWithParent(sync_manager_.GetUserShare(), THEMES, |
| 1480 base::StringPrintf("%"PRIuS"", i), | 1478 base::StringPrintf("%"PRIuS"", i), |
| 1481 GetIdForDataType(THEMES)); | 1479 GetIdForDataType(THEMES)); |
| 1482 } | 1480 } |
| 1483 | 1481 |
| 1484 { | 1482 { |
| 1485 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1483 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 1486 EXPECT_TRUE(GetEncryptedTypes(&trans).Equals( | 1484 EXPECT_TRUE(GetEncryptedTypesWithTrans(&trans).Equals( |
| 1487 SyncEncryptionHandler::SensitiveTypes())); | 1485 SyncEncryptionHandler::SensitiveTypes())); |
| 1488 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1486 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1489 trans.GetWrappedTrans(), | 1487 trans.GetWrappedTrans(), |
| 1490 trans.GetCryptographer(), | |
| 1491 BOOKMARKS, | 1488 BOOKMARKS, |
| 1492 false /* not encrypted */)); | 1489 false /* not encrypted */)); |
| 1493 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1490 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1494 trans.GetWrappedTrans(), | 1491 trans.GetWrappedTrans(), |
| 1495 trans.GetCryptographer(), | |
| 1496 SESSIONS, | 1492 SESSIONS, |
| 1497 false /* not encrypted */)); | 1493 false /* not encrypted */)); |
| 1498 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1494 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1499 trans.GetWrappedTrans(), | 1495 trans.GetWrappedTrans(), |
| 1500 trans.GetCryptographer(), | |
| 1501 THEMES, | 1496 THEMES, |
| 1502 false /* not encrypted */)); | 1497 false /* not encrypted */)); |
| 1503 } | 1498 } |
| 1504 | 1499 |
| 1505 EXPECT_CALL(encryption_observer_, | 1500 EXPECT_CALL(encryption_observer_, |
| 1506 OnEncryptedTypesChanged( | 1501 OnEncryptedTypesChanged( |
| 1507 HasModelTypes(ModelTypeSet::All()), true)); | 1502 HasModelTypes(ModelTypeSet::All()), true)); |
| 1508 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 1503 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 1509 sync_manager_.GetEncryptionHandler()->EnableEncryptEverything(); | 1504 sync_manager_.GetEncryptionHandler()->EnableEncryptEverything(); |
| 1510 EXPECT_TRUE(EncryptEverythingEnabledForTest()); | 1505 EXPECT_TRUE(EncryptEverythingEnabledForTest()); |
| 1511 { | 1506 { |
| 1512 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1507 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 1513 EXPECT_TRUE(GetEncryptedTypes(&trans).Equals( | 1508 EXPECT_TRUE(GetEncryptedTypesWithTrans(&trans).Equals( |
| 1514 ModelTypeSet::All())); | 1509 ModelTypeSet::All())); |
| 1515 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1510 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1516 trans.GetWrappedTrans(), | 1511 trans.GetWrappedTrans(), |
| 1517 trans.GetCryptographer(), | |
| 1518 BOOKMARKS, | 1512 BOOKMARKS, |
| 1519 true /* is encrypted */)); | 1513 true /* is encrypted */)); |
| 1520 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1514 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1521 trans.GetWrappedTrans(), | 1515 trans.GetWrappedTrans(), |
| 1522 trans.GetCryptographer(), | |
| 1523 SESSIONS, | 1516 SESSIONS, |
| 1524 true /* is encrypted */)); | 1517 true /* is encrypted */)); |
| 1525 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1518 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1526 trans.GetWrappedTrans(), | 1519 trans.GetWrappedTrans(), |
| 1527 trans.GetCryptographer(), | |
| 1528 THEMES, | 1520 THEMES, |
| 1529 true /* is encrypted */)); | 1521 true /* is encrypted */)); |
| 1530 } | 1522 } |
| 1531 | 1523 |
| 1532 // Trigger's a ReEncryptEverything with new passphrase. | 1524 // Trigger's a ReEncryptEverything with new passphrase. |
| 1533 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); | 1525 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); |
| 1534 EXPECT_CALL(encryption_observer_, OnBootstrapTokenUpdated(_)); | 1526 EXPECT_CALL(encryption_observer_, OnBootstrapTokenUpdated(_)); |
| 1535 EXPECT_CALL(encryption_observer_, OnPassphraseAccepted()); | 1527 EXPECT_CALL(encryption_observer_, OnPassphraseAccepted()); |
| 1536 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 1528 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 1537 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 1529 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 1538 sync_manager_.GetEncryptionHandler()->SetEncryptionPassphrase( | 1530 sync_manager_.GetEncryptionHandler()->SetEncryptionPassphrase( |
| 1539 "new_passphrase", true); | 1531 "new_passphrase", true); |
| 1540 EXPECT_TRUE(EncryptEverythingEnabledForTest()); | 1532 EXPECT_TRUE(EncryptEverythingEnabledForTest()); |
| 1541 { | 1533 { |
| 1542 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 1534 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 1543 EXPECT_TRUE(GetEncryptedTypes(&trans).Equals(ModelTypeSet::All())); | 1535 EXPECT_TRUE(GetEncryptedTypesWithTrans(&trans).Equals(ModelTypeSet::All())); |
| 1544 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1536 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1545 trans.GetWrappedTrans(), | 1537 trans.GetWrappedTrans(), |
| 1546 trans.GetCryptographer(), | |
| 1547 BOOKMARKS, | 1538 BOOKMARKS, |
| 1548 true /* is encrypted */)); | 1539 true /* is encrypted */)); |
| 1549 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1540 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1550 trans.GetWrappedTrans(), | 1541 trans.GetWrappedTrans(), |
| 1551 trans.GetCryptographer(), | |
| 1552 SESSIONS, | 1542 SESSIONS, |
| 1553 true /* is encrypted */)); | 1543 true /* is encrypted */)); |
| 1554 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 1544 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 1555 trans.GetWrappedTrans(), | 1545 trans.GetWrappedTrans(), |
| 1556 trans.GetCryptographer(), | |
| 1557 THEMES, | 1546 THEMES, |
| 1558 true /* is encrypted */)); | 1547 true /* is encrypted */)); |
| 1559 } | 1548 } |
| 1560 // Calling EncryptDataTypes with an empty encrypted types should not trigger | 1549 // Calling EncryptDataTypes with an empty encrypted types should not trigger |
| 1561 // a reencryption and should just notify immediately. | 1550 // a reencryption and should just notify immediately. |
| 1562 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); | 1551 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); |
| 1563 EXPECT_CALL(encryption_observer_, OnBootstrapTokenUpdated(_)).Times(0); | 1552 EXPECT_CALL(encryption_observer_, OnBootstrapTokenUpdated(_)).Times(0); |
| 1564 EXPECT_CALL(encryption_observer_, OnPassphraseAccepted()).Times(0); | 1553 EXPECT_CALL(encryption_observer_, OnPassphraseAccepted()).Times(0); |
| 1565 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()).Times(0); | 1554 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()).Times(0); |
| 1566 sync_manager_.GetEncryptionHandler()->EnableEncryptEverything(); | 1555 sync_manager_.GetEncryptionHandler()->EnableEncryptEverything(); |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2007 // specifics should be stored in the server legal form. | 1996 // specifics should be stored in the server legal form. |
| 2008 EXPECT_EQ(raw_title2, node2.GetTitle()); | 1997 EXPECT_EQ(raw_title2, node2.GetTitle()); |
| 2009 EXPECT_EQ(title2, node2.GetBookmarkSpecifics().title()); | 1998 EXPECT_EQ(title2, node2.GetBookmarkSpecifics().title()); |
| 2010 EXPECT_EQ(url2, node2.GetBookmarkSpecifics().url()); | 1999 EXPECT_EQ(url2, node2.GetBookmarkSpecifics().url()); |
| 2011 } | 2000 } |
| 2012 | 2001 |
| 2013 { | 2002 { |
| 2014 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 2003 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 2015 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 2004 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 2016 trans.GetWrappedTrans(), | 2005 trans.GetWrappedTrans(), |
| 2017 trans.GetCryptographer(), | |
| 2018 BOOKMARKS, | 2006 BOOKMARKS, |
| 2019 false /* not encrypted */)); | 2007 false /* not encrypted */)); |
| 2020 } | 2008 } |
| 2021 | 2009 |
| 2022 EXPECT_CALL(encryption_observer_, | 2010 EXPECT_CALL(encryption_observer_, |
| 2023 OnEncryptedTypesChanged( | 2011 OnEncryptedTypesChanged( |
| 2024 HasModelTypes(ModelTypeSet::All()), true)); | 2012 HasModelTypes(ModelTypeSet::All()), true)); |
| 2025 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 2013 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 2026 sync_manager_.GetEncryptionHandler()->EnableEncryptEverything(); | 2014 sync_manager_.GetEncryptionHandler()->EnableEncryptEverything(); |
| 2027 EXPECT_TRUE(EncryptEverythingEnabledForTest()); | 2015 EXPECT_TRUE(EncryptEverythingEnabledForTest()); |
| 2028 | 2016 |
| 2029 { | 2017 { |
| 2030 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 2018 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 2031 EXPECT_TRUE(GetEncryptedTypes(&trans).Equals(ModelTypeSet::All())); | 2019 EXPECT_TRUE(GetEncryptedTypesWithTrans(&trans).Equals(ModelTypeSet::All())); |
| 2032 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( | 2020 EXPECT_TRUE(syncable::VerifyDataTypeEncryptionForTest( |
| 2033 trans.GetWrappedTrans(), | 2021 trans.GetWrappedTrans(), |
| 2034 trans.GetCryptographer(), | |
| 2035 BOOKMARKS, | 2022 BOOKMARKS, |
| 2036 true /* is encrypted */)); | 2023 true /* is encrypted */)); |
| 2037 | 2024 |
| 2038 ReadNode node(&trans); | 2025 ReadNode node(&trans); |
| 2039 EXPECT_EQ(BaseNode::INIT_OK, node.InitByIdLookup(node_id1)); | 2026 EXPECT_EQ(BaseNode::INIT_OK, node.InitByIdLookup(node_id1)); |
| 2040 EXPECT_EQ(BOOKMARKS, node.GetModelType()); | 2027 EXPECT_EQ(BOOKMARKS, node.GetModelType()); |
| 2041 EXPECT_EQ(title, node.GetTitle()); | 2028 EXPECT_EQ(title, node.GetTitle()); |
| 2042 EXPECT_EQ(title, node.GetBookmarkSpecifics().title()); | 2029 EXPECT_EQ(title, node.GetBookmarkSpecifics().title()); |
| 2043 EXPECT_EQ(url, node.GetBookmarkSpecifics().url()); | 2030 EXPECT_EQ(url, node.GetBookmarkSpecifics().url()); |
| 2044 | 2031 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2107 EXPECT_FALSE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); | 2094 EXPECT_FALSE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); |
| 2108 | 2095 |
| 2109 // Encrypt the datatatype, should set is_unsynced. | 2096 // Encrypt the datatatype, should set is_unsynced. |
| 2110 EXPECT_CALL(encryption_observer_, | 2097 EXPECT_CALL(encryption_observer_, |
| 2111 OnEncryptedTypesChanged( | 2098 OnEncryptedTypesChanged( |
| 2112 HasModelTypes(ModelTypeSet::All()), true)); | 2099 HasModelTypes(ModelTypeSet::All()), true)); |
| 2113 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 2100 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 2114 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, FULL_ENCRYPTION)); | 2101 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, FULL_ENCRYPTION)); |
| 2115 | 2102 |
| 2116 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 2103 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 2104 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, true)); |
| 2117 sync_manager_.GetEncryptionHandler()->Init(); | 2105 sync_manager_.GetEncryptionHandler()->Init(); |
| 2118 PumpLoop(); | 2106 PumpLoop(); |
| 2119 { | 2107 { |
| 2120 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 2108 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 2121 ReadNode node(&trans); | 2109 ReadNode node(&trans); |
| 2122 EXPECT_EQ(BaseNode::INIT_OK, | 2110 EXPECT_EQ(BaseNode::INIT_OK, |
| 2123 node.InitByClientTagLookup(BOOKMARKS, client_tag)); | 2111 node.InitByClientTagLookup(BOOKMARKS, client_tag)); |
| 2124 const syncable::Entry* node_entry = node.GetEntry(); | 2112 const syncable::Entry* node_entry = node.GetEntry(); |
| 2125 const sync_pb::EntitySpecifics& specifics = node_entry->Get(SPECIFICS); | 2113 const sync_pb::EntitySpecifics& specifics = node_entry->Get(SPECIFICS); |
| 2126 EXPECT_TRUE(specifics.has_encrypted()); | 2114 EXPECT_TRUE(specifics.has_encrypted()); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2154 EXPECT_TRUE(cryptographer->is_ready()); | 2142 EXPECT_TRUE(cryptographer->is_ready()); |
| 2155 EXPECT_TRUE(cryptographer->CanDecryptUsingDefaultKey( | 2143 EXPECT_TRUE(cryptographer->CanDecryptUsingDefaultKey( |
| 2156 specifics.encrypted())); | 2144 specifics.encrypted())); |
| 2157 } | 2145 } |
| 2158 EXPECT_TRUE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); | 2146 EXPECT_TRUE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); |
| 2159 | 2147 |
| 2160 // Force a re-encrypt everything. Should not set is_unsynced. | 2148 // Force a re-encrypt everything. Should not set is_unsynced. |
| 2161 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); | 2149 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); |
| 2162 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 2150 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 2163 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 2151 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 2152 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, false)); |
| 2164 | 2153 |
| 2165 sync_manager_.GetEncryptionHandler()->Init(); | 2154 sync_manager_.GetEncryptionHandler()->Init(); |
| 2166 PumpLoop(); | 2155 PumpLoop(); |
| 2167 | 2156 |
| 2168 { | 2157 { |
| 2169 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 2158 ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 2170 ReadNode node(&trans); | 2159 ReadNode node(&trans); |
| 2171 EXPECT_EQ(BaseNode::INIT_OK, | 2160 EXPECT_EQ(BaseNode::INIT_OK, |
| 2172 node.InitByClientTagLookup(BOOKMARKS, client_tag)); | 2161 node.InitByClientTagLookup(BOOKMARKS, client_tag)); |
| 2173 const syncable::Entry* node_entry = node.GetEntry(); | 2162 const syncable::Entry* node_entry = node.GetEntry(); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2360 BaseNode::GenerateSyncableHash(PASSWORDS, | 2349 BaseNode::GenerateSyncableHash(PASSWORDS, |
| 2361 client_tag), | 2350 client_tag), |
| 2362 entity_specifics); | 2351 entity_specifics); |
| 2363 // New node shouldn't start off unsynced. | 2352 // New node shouldn't start off unsynced. |
| 2364 EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag)); | 2353 EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag)); |
| 2365 | 2354 |
| 2366 // Force a re-encrypt everything. Should not set is_unsynced. | 2355 // Force a re-encrypt everything. Should not set is_unsynced. |
| 2367 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); | 2356 testing::Mock::VerifyAndClearExpectations(&encryption_observer_); |
| 2368 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 2357 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 2369 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 2358 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 2359 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, false)); |
| 2370 sync_manager_.GetEncryptionHandler()->Init(); | 2360 sync_manager_.GetEncryptionHandler()->Init(); |
| 2371 PumpLoop(); | 2361 PumpLoop(); |
| 2372 EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag)); | 2362 EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag)); |
| 2373 } | 2363 } |
| 2374 | 2364 |
| 2375 // Verify SetTitle(..) doesn't unnecessarily set IS_UNSYNCED for bookmarks | 2365 // Verify SetTitle(..) doesn't unnecessarily set IS_UNSYNCED for bookmarks |
| 2376 // when we write the same data, but does set it when we write new data. | 2366 // when we write the same data, but does set it when we write new data. |
| 2377 TEST_F(SyncManagerTest, SetBookmarkTitle) { | 2367 TEST_F(SyncManagerTest, SetBookmarkTitle) { |
| 2378 std::string client_tag = "title"; | 2368 std::string client_tag = "title"; |
| 2379 sync_pb::EntitySpecifics entity_specifics; | 2369 sync_pb::EntitySpecifics entity_specifics; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2422 // New node shouldn't start off unsynced. | 2412 // New node shouldn't start off unsynced. |
| 2423 EXPECT_FALSE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); | 2413 EXPECT_FALSE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); |
| 2424 | 2414 |
| 2425 // Encrypt the datatatype, should set is_unsynced. | 2415 // Encrypt the datatatype, should set is_unsynced. |
| 2426 EXPECT_CALL(encryption_observer_, | 2416 EXPECT_CALL(encryption_observer_, |
| 2427 OnEncryptedTypesChanged( | 2417 OnEncryptedTypesChanged( |
| 2428 HasModelTypes(ModelTypeSet::All()), true)); | 2418 HasModelTypes(ModelTypeSet::All()), true)); |
| 2429 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 2419 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 2430 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, FULL_ENCRYPTION)); | 2420 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, FULL_ENCRYPTION)); |
| 2431 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 2421 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 2422 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, true)); |
| 2432 sync_manager_.GetEncryptionHandler()->Init(); | 2423 sync_manager_.GetEncryptionHandler()->Init(); |
| 2433 PumpLoop(); | 2424 PumpLoop(); |
| 2434 EXPECT_TRUE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); | 2425 EXPECT_TRUE(ResetUnsyncedEntry(BOOKMARKS, client_tag)); |
| 2435 | 2426 |
| 2436 // Manually change to the same title. Should not set is_unsynced. | 2427 // Manually change to the same title. Should not set is_unsynced. |
| 2437 // NON_UNIQUE_NAME should be kEncryptedString. | 2428 // NON_UNIQUE_NAME should be kEncryptedString. |
| 2438 { | 2429 { |
| 2439 WriteTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 2430 WriteTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 2440 WriteNode node(&trans); | 2431 WriteNode node(&trans); |
| 2441 EXPECT_EQ(BaseNode::INIT_OK, | 2432 EXPECT_EQ(BaseNode::INIT_OK, |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2518 // New node shouldn't start off unsynced. | 2509 // New node shouldn't start off unsynced. |
| 2519 EXPECT_FALSE(ResetUnsyncedEntry(PREFERENCES, client_tag)); | 2510 EXPECT_FALSE(ResetUnsyncedEntry(PREFERENCES, client_tag)); |
| 2520 | 2511 |
| 2521 // Encrypt the datatatype, should set is_unsynced. | 2512 // Encrypt the datatatype, should set is_unsynced. |
| 2522 EXPECT_CALL(encryption_observer_, | 2513 EXPECT_CALL(encryption_observer_, |
| 2523 OnEncryptedTypesChanged( | 2514 OnEncryptedTypesChanged( |
| 2524 HasModelTypes(ModelTypeSet::All()), true)); | 2515 HasModelTypes(ModelTypeSet::All()), true)); |
| 2525 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); | 2516 EXPECT_CALL(encryption_observer_, OnEncryptionComplete()); |
| 2526 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, FULL_ENCRYPTION)); | 2517 EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, FULL_ENCRYPTION)); |
| 2527 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); | 2518 EXPECT_CALL(encryption_observer_, OnCryptographerStateChanged(_)); |
| 2519 EXPECT_CALL(encryption_observer_, OnEncryptedTypesChanged(_, true)); |
| 2528 sync_manager_.GetEncryptionHandler()->Init(); | 2520 sync_manager_.GetEncryptionHandler()->Init(); |
| 2529 PumpLoop(); | 2521 PumpLoop(); |
| 2530 EXPECT_TRUE(ResetUnsyncedEntry(PREFERENCES, client_tag)); | 2522 EXPECT_TRUE(ResetUnsyncedEntry(PREFERENCES, client_tag)); |
| 2531 | 2523 |
| 2532 // Manually change to the same title. Should not set is_unsynced. | 2524 // Manually change to the same title. Should not set is_unsynced. |
| 2533 // NON_UNIQUE_NAME should be kEncryptedString. | 2525 // NON_UNIQUE_NAME should be kEncryptedString. |
| 2534 { | 2526 { |
| 2535 WriteTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); | 2527 WriteTransaction trans(FROM_HERE, sync_manager_.GetUserShare()); |
| 2536 WriteNode node(&trans); | 2528 WriteNode node(&trans); |
| 2537 EXPECT_EQ(BaseNode::INIT_OK, | 2529 EXPECT_EQ(BaseNode::INIT_OK, |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2890 | 2882 |
| 2891 // Verify only the non-disabled types remain after cleanup. | 2883 // Verify only the non-disabled types remain after cleanup. |
| 2892 sync_manager_.PurgeDisabledTypes(enabled_types, new_enabled_types); | 2884 sync_manager_.PurgeDisabledTypes(enabled_types, new_enabled_types); |
| 2893 EXPECT_TRUE(new_enabled_types.Equals( | 2885 EXPECT_TRUE(new_enabled_types.Equals( |
| 2894 Union(sync_manager_.InitialSyncEndedTypes(), partial_enabled_types))); | 2886 Union(sync_manager_.InitialSyncEndedTypes(), partial_enabled_types))); |
| 2895 EXPECT_TRUE(disabled_types.Equals( | 2887 EXPECT_TRUE(disabled_types.Equals( |
| 2896 sync_manager_.GetTypesWithEmptyProgressMarkerToken(ModelTypeSet::All()))); | 2888 sync_manager_.GetTypesWithEmptyProgressMarkerToken(ModelTypeSet::All()))); |
| 2897 } | 2889 } |
| 2898 | 2890 |
| 2899 } // namespace | 2891 } // namespace |
| OLD | NEW |