proto_value_conversions_unittest.cc revision ddb351dbec246cf1fab5ec20d2d5520909041de1
1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Keep this file in sync with the .proto files in this directory. 6 7#include "chrome/browser/sync/protocol/proto_value_conversions.h" 8 9#include "base/memory/scoped_ptr.h" 10#include "base/values.h" 11#include "chrome/browser/sync/protocol/app_specifics.pb.h" 12#include "chrome/browser/sync/protocol/autofill_specifics.pb.h" 13#include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" 14#include "chrome/browser/sync/protocol/encryption.pb.h" 15#include "chrome/browser/sync/protocol/extension_specifics.pb.h" 16#include "chrome/browser/sync/protocol/nigori_specifics.pb.h" 17#include "chrome/browser/sync/protocol/password_specifics.pb.h" 18#include "chrome/browser/sync/protocol/preference_specifics.pb.h" 19#include "chrome/browser/sync/protocol/session_specifics.pb.h" 20#include "chrome/browser/sync/protocol/sync.pb.h" 21#include "chrome/browser/sync/protocol/theme_specifics.pb.h" 22#include "chrome/browser/sync/protocol/typed_url_specifics.pb.h" 23#include "chrome/browser/sync/syncable/model_type.h" 24#include "testing/gtest/include/gtest/gtest.h" 25 26namespace browser_sync { 27namespace { 28 29class ProtoValueConversionsTest : public testing::Test { 30 protected: 31 template <class T> 32 void TestSpecificsToValue( 33 DictionaryValue* (*specifics_to_value)(const T&)) { 34 const T& specifics(T::default_instance()); 35 scoped_ptr<DictionaryValue> value(specifics_to_value(specifics)); 36 // We can't do much but make sure that the returned value has 37 // something in it. 38 EXPECT_FALSE(value->empty()); 39 } 40}; 41 42TEST_F(ProtoValueConversionsTest, ProtoChangeCheck) { 43 // If this number changes, that means we added or removed a data 44 // type. Don't forget to add a unit test for {New 45 // type}SpecificsToValue below. 46 EXPECT_EQ(13, syncable::MODEL_TYPE_COUNT); 47 48 // We'd also like to check if we changed any field in our messages. 49 // However, that's hard to do: sizeof could work, but it's 50 // platform-dependent. default_instance().ByteSize() won't change 51 // for most changes, since most of our fields are optional. So we 52 // just settle for comments in the proto files. 53} 54 55TEST_F(ProtoValueConversionsTest, EncryptedDataToValue) { 56 TestSpecificsToValue(EncryptedDataToValue); 57} 58 59TEST_F(ProtoValueConversionsTest, SessionHeaderToValue) { 60 TestSpecificsToValue(SessionHeaderToValue); 61} 62 63TEST_F(ProtoValueConversionsTest, SessionTabToValue) { 64 TestSpecificsToValue(SessionTabToValue); 65} 66 67TEST_F(ProtoValueConversionsTest, SessionWindowToValue) { 68 TestSpecificsToValue(SessionWindowToValue); 69} 70 71TEST_F(ProtoValueConversionsTest, TabNavigationToValue) { 72 TestSpecificsToValue(TabNavigationToValue); 73} 74 75TEST_F(ProtoValueConversionsTest, PasswordSpecificsData) { 76 sync_pb::PasswordSpecificsData specifics; 77 specifics.set_password_value("secret"); 78 scoped_ptr<DictionaryValue> value(PasswordSpecificsDataToValue(specifics)); 79 EXPECT_FALSE(value->empty()); 80 std::string password_value; 81 EXPECT_TRUE(value->GetString("password_value", &password_value)); 82 EXPECT_EQ("<redacted>", password_value); 83} 84 85TEST_F(ProtoValueConversionsTest, AppSpecificsToValue) { 86 TestSpecificsToValue(AppSpecificsToValue); 87} 88 89TEST_F(ProtoValueConversionsTest, AutofillSpecificsToValue) { 90 TestSpecificsToValue(AutofillSpecificsToValue); 91} 92 93TEST_F(ProtoValueConversionsTest, AutofillCreditCardSpecificsToValue) { 94 TestSpecificsToValue(AutofillCreditCardSpecificsToValue); 95} 96 97TEST_F(ProtoValueConversionsTest, AutofillProfileSpecificsToValue) { 98 TestSpecificsToValue(AutofillProfileSpecificsToValue); 99} 100 101TEST_F(ProtoValueConversionsTest, BookmarkSpecificsToValue) { 102 TestSpecificsToValue(BookmarkSpecificsToValue); 103} 104 105TEST_F(ProtoValueConversionsTest, ExtensionSpecificsToValue) { 106 TestSpecificsToValue(ExtensionSpecificsToValue); 107} 108 109TEST_F(ProtoValueConversionsTest, NigoriSpecificsToValue) { 110 TestSpecificsToValue(NigoriSpecificsToValue); 111} 112 113TEST_F(ProtoValueConversionsTest, PasswordSpecificsToValue) { 114 TestSpecificsToValue(PasswordSpecificsToValue); 115} 116 117TEST_F(ProtoValueConversionsTest, PreferenceSpecificsToValue) { 118 TestSpecificsToValue(PreferenceSpecificsToValue); 119} 120 121TEST_F(ProtoValueConversionsTest, SessionSpecificsToValue) { 122 TestSpecificsToValue(SessionSpecificsToValue); 123} 124 125TEST_F(ProtoValueConversionsTest, ThemeSpecificsToValue) { 126 TestSpecificsToValue(ThemeSpecificsToValue); 127} 128 129TEST_F(ProtoValueConversionsTest, TypedUrlSpecificsToValue) { 130 TestSpecificsToValue(TypedUrlSpecificsToValue); 131} 132 133// TODO(akalin): Figure out how to better test EntitySpecificsToValue. 134 135TEST_F(ProtoValueConversionsTest, EntitySpecificsToValue) { 136 sync_pb::EntitySpecifics specifics; 137 // Touch the extensions to make sure it shows up in the generated 138 // value. 139#define SET_EXTENSION(key) (void)specifics.MutableExtension(sync_pb::key) 140 141 SET_EXTENSION(app); 142 SET_EXTENSION(autofill); 143 SET_EXTENSION(autofill_profile); 144 SET_EXTENSION(bookmark); 145 SET_EXTENSION(extension); 146 SET_EXTENSION(nigori); 147 SET_EXTENSION(password); 148 SET_EXTENSION(preference); 149 SET_EXTENSION(session); 150 SET_EXTENSION(theme); 151 SET_EXTENSION(typed_url); 152 153#undef SET_EXTENSION 154 155 scoped_ptr<DictionaryValue> value(EntitySpecificsToValue(specifics)); 156 EXPECT_EQ(syncable::MODEL_TYPE_COUNT - syncable::FIRST_REAL_MODEL_TYPE, 157 static_cast<int>(value->size())); 158} 159 160} // namespace 161} // namespace browser_sync 162