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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/change_record.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/values_test_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/extension_specifics.pb.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/proto_value_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::ExpectDictDictionaryValue; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::ExpectDictStringValue; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Invoke; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::StrictMock; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChangeRecordTest : public testing::Test {}; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExpectChangeRecordActionValue(ChangeRecord::Action expected_value, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& value, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string str_value; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value.GetString(key, &str_value)); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (expected_value) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ChangeRecord::ACTION_ADD: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Add", str_value); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ChangeRecord::ACTION_UPDATE: 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Update", str_value); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ChangeRecord::ACTION_DELETE: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Delete", str_value); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckChangeRecordValue( 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ChangeRecord& record, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& value) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectChangeRecordActionValue(record.action, value, "action"); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectDictStringValue(base::Int64ToString(record.id), value, "id"); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (record.action == ChangeRecord::ACTION_DELETE) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::DictionaryValue> expected_extra_value; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (record.extra.get()) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_extra_value.reset(record.extra->ToValue()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value* extra_value = NULL; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(record.extra.get() != NULL, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.Get("extra", &extra_value)); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(extra_value, expected_extra_value.get())); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::DictionaryValue> expected_specifics_value( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EntitySpecificsToValue(record.specifics)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectDictDictionaryValue(*expected_specifics_value, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value, "specifics"); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockExtraChangeRecordData 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public ExtraPasswordChangeRecordData { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MOCK_CONST_METHOD0(ToValue, base::DictionaryValue*()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChangeRecordTest, ChangeRecordToValue) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics old_specifics; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_specifics.mutable_extension()->set_id("old"); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics new_specifics; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_specifics.mutable_extension()->set_id("new"); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int64 kTestId = 5; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChangeRecord record; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.action = ChangeRecord::ACTION_ADD; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.id = kTestId; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.specifics = old_specifics; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.extra.reset(new StrictMock<MockExtraChangeRecordData>()); 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::DictionaryValue> value(record.ToValue()); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckChangeRecordValue(record, *value); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChangeRecord record; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.action = ChangeRecord::ACTION_UPDATE; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.id = kTestId; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.specifics = old_specifics; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.extra.reset(new StrictMock<MockExtraChangeRecordData>()); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::DictionaryValue> value(record.ToValue()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckChangeRecordValue(record, *value); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete (no extra) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChangeRecord record; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.action = ChangeRecord::ACTION_DELETE; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.id = kTestId; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.specifics = old_specifics; 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::DictionaryValue> value(record.ToValue()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckChangeRecordValue(record, *value); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete (with extra) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChangeRecord record; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.action = ChangeRecord::ACTION_DELETE; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.id = kTestId; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.specifics = old_specifics; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue extra_value; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_value.SetString("foo", "bar"); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<StrictMock<MockExtraChangeRecordData> > extra( 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new StrictMock<MockExtraChangeRecordData>()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*extra, ToValue()).Times(2).WillRepeatedly( 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Invoke(&extra_value, &base::DictionaryValue::DeepCopy)); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record.extra.reset(extra.release()); 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::DictionaryValue> value(record.ToValue()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckChangeRecordValue(record, *value); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 138