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