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