invalidator_storage_unittest.cc revision 868fa2fe829687343ffae624259930155e16dbd8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/invalidation/invalidator_storage.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 9b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/internal_api/public/base/invalidation_test_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::InvalidationStateMap; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSourceKey[] = "source"; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNameKey[] = "name"; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMaxVersionKey[] = "max-version"; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kPayloadKey[] = "payload"; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kCurrentAckHandleKey[] = "current-ack"; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExpectedAckHandleKey[] = "expected-ack"; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kChromeSyncSourceId = 1004; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GenerateAckHandlesTestHelper(syncer::AckHandleMap* output, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const syncer::AckHandleMap& input) { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *output = input; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace invalidation { 40a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InvalidatorStorageTest : public testing::Test { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorageTest() 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : kBookmarksId_(kChromeSyncSourceId, "BOOKMARK"), 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kPreferencesId_(kChromeSyncSourceId, "PREFERENCE"), 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAppNotificationsId_(kChromeSyncSourceId, "APP_NOTIFICATION"), 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAutofillId_(kChromeSyncSourceId, "AUTOFILL") {} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidatorStorage::RegisterUserPrefs(pref_service_.registry()); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingPrefServiceSyncable pref_service_; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::ObjectId kBookmarksId_; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::ObjectId kPreferencesId_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::ObjectId kAppNotificationsId_; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::ObjectId kAutofillId_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop loop_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Set invalidation states for various keys and verify that they are written and 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// read back correctly. 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(InvalidatorStorageTest, SetMaxVersionAndPayload) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage storage(&pref_service_); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidationStateMap expected_states; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_states, storage.GetAllInvalidationStates()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states[kBookmarksId_].version = 2; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states[kBookmarksId_].payload = "hello"; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.SetMaxVersionAndPayload(kBookmarksId_, 2, "hello"); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_states, storage.GetAllInvalidationStates()); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states[kPreferencesId_].version = 5; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.SetMaxVersionAndPayload(kPreferencesId_, 5, std::string()); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_states, storage.GetAllInvalidationStates()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states[kAppNotificationsId_].version = 3; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states[kAppNotificationsId_].payload = "world"; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.SetMaxVersionAndPayload(kAppNotificationsId_, 3, "world"); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_states, storage.GetAllInvalidationStates()); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states[kAppNotificationsId_].version = 4; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states[kAppNotificationsId_].payload = "again"; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.SetMaxVersionAndPayload(kAppNotificationsId_, 4, "again"); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_states, storage.GetAllInvalidationStates()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Forgetting an entry should cause that entry to be deleted. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, Forget) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage storage(&pref_service_); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(storage.GetAllInvalidationStates().empty()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidationStateMap expected_states; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states[kBookmarksId_].version = 2; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states[kBookmarksId_].payload = "a"; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states[kPreferencesId_].version = 5; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states[kPreferencesId_].payload = "b"; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.SetMaxVersionAndPayload(kBookmarksId_, 2, "a"); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.SetMaxVersionAndPayload(kPreferencesId_, 5, "b"); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_states, storage.GetAllInvalidationStates()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states.erase(kPreferencesId_); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ObjectIdSet to_forget; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to_forget.insert(kPreferencesId_); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage.Forget(to_forget); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_states, storage.GetAllInvalidationStates()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Clearing the storage should erase all version map entries, bootstrap data, 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and the client ID. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, Clear) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage storage(&pref_service_); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(storage.GetAllInvalidationStates().empty()); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(storage.GetBootstrapData().empty()); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(storage.GetInvalidatorClientId().empty()); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.SetInvalidatorClientId("fake_id"); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("fake_id", storage.GetInvalidatorClientId()); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage.SetBootstrapData("test"); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("test", storage.GetBootstrapData()); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidationStateMap expected_states; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_states[kAppNotificationsId_].version = 3; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.SetMaxVersionAndPayload(kAppNotificationsId_, 3, std::string()); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_states, storage.GetAllInvalidationStates()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage.Clear(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(storage.GetAllInvalidationStates().empty()); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(storage.GetBootstrapData().empty()); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(storage.GetInvalidatorClientId().empty()); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, SerializeEmptyMap) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationStateMap empty_map; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue list; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage::SerializeToList(empty_map, &list); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(list.empty()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure we don't choke on a variety of malformed input. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, DeserializeFromListInvalidFormat) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationStateMap map; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue list_with_invalid_format; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* value; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The various cases below use distinct values to make it easier to track down 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // failures. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_with_invalid_format.Append(value); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString("completely", "invalid"); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_with_invalid_format.Append(value); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Missing two required fields 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kSourceKey, "10"); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_with_invalid_format.Append(value); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kNameKey, "missing source and version"); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_with_invalid_format.Append(value); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kMaxVersionKey, "3"); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_with_invalid_format.Append(value); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Missing one required field 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kSourceKey, "14"); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kNameKey, "missing version"); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_with_invalid_format.Append(value); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kSourceKey, "233"); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kMaxVersionKey, "5"); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_with_invalid_format.Append(value); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kNameKey, "missing source"); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kMaxVersionKey, "25"); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_with_invalid_format.Append(value); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid values in fields 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kSourceKey, "a"); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kNameKey, "bad source"); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kMaxVersionKey, "12"); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_with_invalid_format.Append(value); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kSourceKey, "1"); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kNameKey, "bad max version"); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kMaxVersionKey, "a"); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_with_invalid_format.Append(value); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And finally something that should work. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::ObjectId valid_id(42, "this should work"); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kSourceKey, "42"); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kNameKey, valid_id.name()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kMaxVersionKey, "20"); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_with_invalid_format.Append(value); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage::DeserializeFromList(list_with_invalid_format, &map); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, map.size()); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(20, map[valid_id].version); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests behavior when there are duplicate entries for a single key. The value 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the last entry with that key should be used in the version map. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, DeserializeFromListWithDuplicates) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationStateMap map; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue list; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* value; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kSourceKey, base::IntToString(kBookmarksId_.source())); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kNameKey, kBookmarksId_.name()); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kMaxVersionKey, "20"); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.Append(value); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kSourceKey, base::IntToString(kAutofillId_.source())); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kNameKey, kAutofillId_.name()); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kMaxVersionKey, "10"); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.Append(value); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kSourceKey, base::IntToString(kBookmarksId_.source())); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kNameKey, kBookmarksId_.name()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kMaxVersionKey, "15"); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.Append(value); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage::DeserializeFromList(list, &map); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, map.size()); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, map[kAutofillId_].version); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(15, map[kBookmarksId_].version); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, DeserializeFromEmptyList) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationStateMap map; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue list; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage::DeserializeFromList(list, &map); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(map.empty()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that deserializing a well-formed value results in the expected state 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// map. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, DeserializeFromListBasic) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationStateMap map; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue list; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* value; 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::AckHandle ack_handle_1 = syncer::AckHandle::CreateUnique(); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::AckHandle ack_handle_2 = syncer::AckHandle::CreateUnique(); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = new DictionaryValue(); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value->SetString(kSourceKey, 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::IntToString(kAppNotificationsId_.source())); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value->SetString(kNameKey, kAppNotificationsId_.name()); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value->SetString(kMaxVersionKey, "20"); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value->SetString(kPayloadKey, "testing"); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value->Set(kCurrentAckHandleKey, ack_handle_1.ToValue().release()); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value->Set(kExpectedAckHandleKey, ack_handle_2.ToValue().release()); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list.Append(value); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidatorStorage::DeserializeFromList(list, &map); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1U, map.size()); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(20, map[kAppNotificationsId_].version); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("testing", map[kAppNotificationsId_].payload); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_THAT(map[kAppNotificationsId_].current, Eq(ack_handle_1)); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_THAT(map[kAppNotificationsId_].expected, Eq(ack_handle_2)); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that deserializing well-formed values when optional parameters are 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// omitted works. 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(InvalidatorStorageTest, DeserializeFromListMissingOptionalValues) { 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidationStateMap map; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue list; 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryValue* value; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::AckHandle ack_handle = syncer::AckHandle::CreateUnique(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Payload missing because of an upgrade from a previous browser version that 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // didn't set the field. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kSourceKey, base::IntToString(kAutofillId_.source())); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kNameKey, kAutofillId_.name()); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kMaxVersionKey, "10"); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.Append(value); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A crash between SetMaxVersion() and a callback from GenerateAckHandles() 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // could result in this state. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = new DictionaryValue(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kSourceKey, base::IntToString(kBookmarksId_.source())); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kNameKey, kBookmarksId_.name()); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->SetString(kMaxVersionKey, "15"); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value->SetString(kPayloadKey, "hello"); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list.Append(value); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Never acknowledged, so current ack handle is unset. 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = new DictionaryValue(); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value->SetString(kSourceKey, base::IntToString(kPreferencesId_.source())); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value->SetString(kNameKey, kPreferencesId_.name()); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value->SetString(kMaxVersionKey, "20"); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value->SetString(kPayloadKey, "world"); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value->Set(kExpectedAckHandleKey, ack_handle.ToValue().release()); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.Append(value); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage::DeserializeFromList(list, &map); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3U, map.size()); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, map[kAutofillId_].version); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", map[kAutofillId_].payload); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(map[kAutofillId_].current.IsValid()); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(map[kAutofillId_].expected.IsValid()); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(15, map[kBookmarksId_].version); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("hello", map[kBookmarksId_].payload); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(map[kBookmarksId_].current.IsValid()); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(map[kBookmarksId_].expected.IsValid()); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(20, map[kPreferencesId_].version); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("world", map[kPreferencesId_].payload); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(map[kPreferencesId_].current.IsValid()); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_THAT(map[kPreferencesId_].expected, Eq(ack_handle)); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests for legacy deserialization code. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, DeserializeMapOutOfRange) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationStateMap map; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue dict_with_out_of_range_type; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict_with_out_of_range_type.SetString( 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(syncer::TOP_LEVEL_FOLDER), "100"); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict_with_out_of_range_type.SetString( 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(syncer::BOOKMARKS), "5"); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage::DeserializeMap(&dict_with_out_of_range_type, &map); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, map.size()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, map[kBookmarksId_].version); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, DeserializeMapInvalidFormat) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationStateMap map; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue dict_with_invalid_format; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict_with_invalid_format.SetString("whoops", "5"); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict_with_invalid_format.SetString("ohnoes", "whoops"); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict_with_invalid_format.SetString( 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(syncer::BOOKMARKS), "ohnoes"); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict_with_invalid_format.SetString( 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(syncer::AUTOFILL), "10"); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage::DeserializeMap(&dict_with_invalid_format, &map); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, map.size()); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, map[kAutofillId_].version); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, DeserializeMapEmptyDictionary) { 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationStateMap map; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue dict; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage::DeserializeMap(&dict, &map); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(map.empty()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, DeserializeMapBasic) { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationStateMap map; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue dict; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict.SetString(base::IntToString(syncer::AUTOFILL), "10"); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict.SetString(base::IntToString(syncer::BOOKMARKS), "15"); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage::DeserializeMap(&dict, &map); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, map.size()); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, map[kAutofillId_].version); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(15, map[kBookmarksId_].version); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the migration code for the legacy preference works as expected. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Migration should happen on construction of InvalidatorStorage. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, MigrateLegacyPreferences) { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* legacy_dict = new DictionaryValue; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) legacy_dict->SetString(base::IntToString(syncer::AUTOFILL), "10"); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) legacy_dict->SetString(base::IntToString(syncer::BOOKMARKS), "32"); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) legacy_dict->SetString(base::IntToString(syncer::PREFERENCES), "54"); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_service_.SetUserPref(prefs::kSyncMaxInvalidationVersions, legacy_dict); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage storage(&pref_service_); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Legacy pref should be cleared. 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* dict = 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_service_.GetDictionary(prefs::kSyncMaxInvalidationVersions); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(dict->empty()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate the new pref is set correctly. 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidationStateMap map; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* list = 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_service_.GetList(prefs::kInvalidatorMaxInvalidationVersions); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage::DeserializeFromList(*list, &map); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3U, map.size()); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, map[kAutofillId_].version); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(32, map[kBookmarksId_].version); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(54, map[kPreferencesId_].version); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(InvalidatorStorageTest, SetGetNotifierClientId) { 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidatorStorage storage(&pref_service_); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string client_id("fK6eDzAIuKqx9A4+93bljg=="); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.SetInvalidatorClientId(client_id); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(client_id, storage.GetInvalidatorClientId()); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InvalidatorStorageTest, SetGetBootstrapData) { 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorStorage storage(&pref_service_); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string mess("n\0tK\0\0l\344", 8); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(IsStringUTF8(mess)); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage.SetBootstrapData(mess); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(mess, storage.GetBootstrapData()); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that we correctly generate ack handles, acknowledge them, and persist 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// them. 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(InvalidatorStorageTest, GenerateAckHandlesAndAcknowledge) { 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidatorStorage storage(&pref_service_); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::ObjectIdSet ids; 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidationStateMap state_map; 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::AckHandleMap ack_handle_map; 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::AckHandleMap::const_iterator it; 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it works as expected if the key doesn't already exist in the map, 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // e.g. the first invalidation received for the object ID was not for a 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // specific version. 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ids.insert(kAutofillId_); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.GenerateAckHandles( 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ids, base::MessageLoopProxy::current(), 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&GenerateAckHandlesTestHelper, &ack_handle_map)); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop_.RunUntilIdle(); 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1U, ack_handle_map.size()); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it = ack_handle_map.find(kAutofillId_); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Android STL appears to be buggy and causes gtest's IsContainerTest<> to 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // treat an iterator as a STL container so we use != instead of ASSERT_NE. 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ack_handle_map.end() != it); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(it->second.IsValid()); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_map[kAutofillId_].expected = it->second; 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(state_map, storage.GetAllInvalidationStates()); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.Acknowledge(kAutofillId_, it->second); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_map[kAutofillId_].current = it->second; 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(state_map, storage.GetAllInvalidationStates()); 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ids.clear(); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test that it works as expected if the key already exists. 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_map[kBookmarksId_].version = 11; 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_map[kBookmarksId_].payload = "hello"; 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.SetMaxVersionAndPayload(kBookmarksId_, 11, "hello"); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(state_map, storage.GetAllInvalidationStates()); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ids.insert(kBookmarksId_); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.GenerateAckHandles( 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ids, base::MessageLoopProxy::current(), 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&GenerateAckHandlesTestHelper, &ack_handle_map)); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop_.RunUntilIdle(); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1U, ack_handle_map.size()); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it = ack_handle_map.find(kBookmarksId_); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ack_handle_map.end() != it); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(it->second.IsValid()); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_map[kBookmarksId_].expected = it->second; 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(state_map, storage.GetAllInvalidationStates()); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.Acknowledge(kBookmarksId_, it->second); 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_map[kBookmarksId_].current = it->second; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(state_map, storage.GetAllInvalidationStates()); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Finally, test that the ack handles are updated if we're asked to generate 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // another ack handle for the same object ID. 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_map[kBookmarksId_].version = 12; 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_map[kBookmarksId_].payload = "world"; 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.SetMaxVersionAndPayload(kBookmarksId_, 12, "world"); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(state_map, storage.GetAllInvalidationStates()); 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ids.insert(kBookmarksId_); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.GenerateAckHandles( 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ids, base::MessageLoopProxy::current(), 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&GenerateAckHandlesTestHelper, &ack_handle_map)); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loop_.RunUntilIdle(); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1U, ack_handle_map.size()); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it = ack_handle_map.find(kBookmarksId_); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(ack_handle_map.end() != it); 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(it->second.IsValid()); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_map[kBookmarksId_].expected = it->second; 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(state_map, storage.GetAllInvalidationStates()); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage.Acknowledge(kBookmarksId_, it->second); 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_map[kBookmarksId_].current = it->second; 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(state_map, storage.GetAllInvalidationStates()); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 506a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} // namespace invalidation 507