172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file.
472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Keep this file in sync with the .proto files in this directory.
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/proto_value_conversions.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/values.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/app_specifics.pb.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/autofill_specifics.pb.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/bookmark_specifics.pb.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/encryption.pb.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/extension_specifics.pb.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/nigori_specifics.pb.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/password_specifics.pb.h"
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/preference_specifics.pb.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/session_specifics.pb.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/sync.pb.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/theme_specifics.pb.h"
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/typed_url_specifics.pb.h"
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/syncable/model_type.h"
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "testing/gtest/include/gtest/gtest.h"
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace browser_sync {
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace {
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass ProtoValueConversionsTest : public testing::Test {
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen protected:
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  template <class T>
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void TestSpecificsToValue(
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      DictionaryValue* (*specifics_to_value)(const T&)) {
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const T& specifics(T::default_instance());
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    scoped_ptr<DictionaryValue> value(specifics_to_value(specifics));
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // We can't do much but make sure that the returned value has
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // something in it.
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_FALSE(value->empty());
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, ProtoChangeCheck) {
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // If this number changes, that means we added or removed a data
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // type.  Don't forget to add a unit test for {New
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // type}SpecificsToValue below.
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(13, syncable::MODEL_TYPE_COUNT);
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We'd also like to check if we changed any field in our messages.
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // However, that's hard to do: sizeof could work, but it's
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // platform-dependent.  default_instance().ByteSize() won't change
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // for most changes, since most of our fields are optional.  So we
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // just settle for comments in the proto files.
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, EncryptedDataToValue) {
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(EncryptedDataToValue);
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, SessionHeaderToValue) {
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(SessionHeaderToValue);
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, SessionTabToValue) {
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(SessionTabToValue);
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, SessionWindowToValue) {
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(SessionWindowToValue);
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, TabNavigationToValue) {
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(TabNavigationToValue);
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, PasswordSpecificsData) {
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  sync_pb::PasswordSpecificsData specifics;
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  specifics.set_password_value("secret");
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<DictionaryValue> value(PasswordSpecificsDataToValue(specifics));
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(value->empty());
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string password_value;
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(value->GetString("password_value", &password_value));
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ("<redacted>", password_value);
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, AppSpecificsToValue) {
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(AppSpecificsToValue);
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, AutofillSpecificsToValue) {
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(AutofillSpecificsToValue);
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, AutofillCreditCardSpecificsToValue) {
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(AutofillCreditCardSpecificsToValue);
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, AutofillProfileSpecificsToValue) {
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(AutofillProfileSpecificsToValue);
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, BookmarkSpecificsToValue) {
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(BookmarkSpecificsToValue);
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, ExtensionSpecificsToValue) {
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(ExtensionSpecificsToValue);
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, NigoriSpecificsToValue) {
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(NigoriSpecificsToValue);
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, PasswordSpecificsToValue) {
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(PasswordSpecificsToValue);
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, PreferenceSpecificsToValue) {
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(PreferenceSpecificsToValue);
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, SessionSpecificsToValue) {
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(SessionSpecificsToValue);
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, ThemeSpecificsToValue) {
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(ThemeSpecificsToValue);
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, TypedUrlSpecificsToValue) {
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestSpecificsToValue(TypedUrlSpecificsToValue);
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TODO(akalin): Figure out how to better test EntitySpecificsToValue.
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(ProtoValueConversionsTest, EntitySpecificsToValue) {
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  sync_pb::EntitySpecifics specifics;
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Touch the extensions to make sure it shows up in the generated
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // value.
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define SET_EXTENSION(key) (void)specifics.MutableExtension(sync_pb::key)
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(app);
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(autofill);
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(autofill_profile);
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(bookmark);
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(extension);
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(nigori);
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(password);
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(preference);
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(session);
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(theme);
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(typed_url);
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#undef SET_EXTENSION
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<DictionaryValue> value(EntitySpecificsToValue(specifics));
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(syncable::MODEL_TYPE_COUNT - syncable::FIRST_REAL_MODEL_TYPE,
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            static_cast<int>(value->size()));
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace browser_sync
162