1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <limits> 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "app/sql/statement.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/utf_string_conversions.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "build/build_config.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/password_manager/encryptor.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/syncable/directory_manager.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/util/user_settings.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing std::numeric_limits; 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace { 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst FilePath::CharType kV10UserSettingsDB[] = 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FILE_PATH_LITERAL("Version10Settings.sqlite3"); 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst FilePath::CharType kV11UserSettingsDB[] = 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FILE_PATH_LITERAL("Version11Settings.sqlite3"); 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst FilePath::CharType kOldStyleSyncDataDB[] = 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FILE_PATH_LITERAL("OldStyleSyncData.sqlite3"); 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass UserSettingsTest : public testing::Test { 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UserSettingsTest() : sync_data_("Some sync data") {} 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetUp() { 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Need to mock the Keychain for unit tests on Mac to avoid possible 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // blocking UI. |SetAuthTokenForService| uses Encryptor. 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Encryptor::UseMockKeychain(true); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Creates and populates the V10 database files within 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |destination_directory|. 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetUpVersion10Databases(const FilePath& destination_directory) { 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch v10_user_setting_db_path_ = 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch destination_directory.Append(FilePath(kV10UserSettingsDB)); 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Connection db; 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.Open(v10_user_setting_db_path_)); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch old_style_sync_data_path_ = 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch destination_directory.Append(FilePath(kOldStyleSyncDataDB)); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(sync_data_.length(), 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<size_t>(file_util::WriteFile( 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch old_style_sync_data_path_, sync_data_.data(), 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_data_.length()))); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create settings table. 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.Execute( 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "CREATE TABLE settings (email, key, value, PRIMARY KEY(email, key)" 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " ON CONFLICT REPLACE)")); 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add a blank signin table. 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.Execute( 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "CREATE TABLE signin_types (signin, signin_type)")); 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create and populate version table. 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.Execute("CREATE TABLE db_version (version)")); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const char* query = "INSERT INTO db_version VALUES(?)"; 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db.GetUniqueStatement(query)); 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(FATAL) << query << "\n" << db.GetErrorMessage(); 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt(0, 10); 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(FATAL) << query << "\n" << db.GetErrorMessage(); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create shares table. 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.Execute( 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "CREATE TABLE shares (email, share_name, file_name," 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " PRIMARY KEY(email, share_name) ON CONFLICT REPLACE)")); 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Populate a share. 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const char* query = "INSERT INTO shares VALUES(?, ?, ?)"; 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db.GetUniqueStatement(query)); 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(FATAL) << query << "\n" << db.GetErrorMessage(); 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, "foo@foo.com"); 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(1, "foo@foo.com"); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(2, WideToUTF8(old_style_sync_data_path_.value())); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_POSIX) 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(2, old_style_sync_data_path_.value()); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(FATAL) << query << "\n" << db.GetErrorMessage(); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Creates and populates the V11 database file within 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |destination_directory|. 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetUpVersion11Database(const FilePath& destination_directory) { 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch v11_user_setting_db_path_ = 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch destination_directory.Append(FilePath(kV11UserSettingsDB)); 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Connection db; 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.Open(v11_user_setting_db_path_)); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create settings table. 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.Execute( 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "CREATE TABLE settings (email, key, value, PRIMARY KEY(email, key)" 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " ON CONFLICT REPLACE)")); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create and populate version table. 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.Execute("CREATE TABLE db_version (version)")); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const char* query = "INSERT INTO db_version VALUES(?)"; 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db.GetUniqueStatement(query)); 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(FATAL) << query << "\n" << db.GetErrorMessage(); 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt(0, 11); 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(FATAL) << query << "\n" << db.GetErrorMessage(); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.Execute( 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "CREATE TABLE signin_types (signin, signin_type)")); 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const char* query = "INSERT INTO signin_types VALUES(?, ?)"; 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db.GetUniqueStatement(query)); 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(FATAL) << query << "\n" << db.GetErrorMessage(); 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, "test"); 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(1, "test"); 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(FATAL) << query << "\n" << db.GetErrorMessage(); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& sync_data() const { return sync_data_; } 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const FilePath& v10_user_setting_db_path() const { 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return v10_user_setting_db_path_; 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const FilePath& v11_user_setting_db_path() const { 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return v11_user_setting_db_path_; 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const FilePath& old_style_sync_data_path() const { 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return old_style_sync_data_path_; 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath v10_user_setting_db_path_; 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath old_style_sync_data_path_; 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath v11_user_setting_db_path_; 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string sync_data_; 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserSettingsTest, MigrateFromV10ToV11) { 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScopedTempDir temp_dir; 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetUpVersion10Databases(temp_dir.path()); 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create a UserSettings, which should trigger migration code. We do this 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // inside a scoped block so it closes itself and we can poke around to see 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // what happened later. 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser_sync::UserSettings settings; 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings.Init(v10_user_setting_db_path()); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now poke around using sqlite to see if UserSettings migrated properly. 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Connection db; 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.Open(v10_user_setting_db_path())); 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Note that we don't use ScopedStatement to avoid closing the sqlite handle 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // before finalizing the statement. 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const char* query = "SELECT version FROM db_version"; 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement version_query(db.GetUniqueStatement(query)); 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!version_query) 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(FATAL) << query << "\n" << db.GetErrorMessage(); 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(version_query.Step()); 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const int version = version_query.ColumnInt(0); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_GE(version, 11); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(file_util::PathExists(old_style_sync_data_path())); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath new_style_path = temp_dir.path().Append( 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::DirectoryManager::GetSyncDataDatabaseFilename()); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string contents; 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(file_util::ReadFileToString(new_style_path, &contents)); 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(sync_data() == contents); 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserSettingsTest, MigrateFromV11ToV12) { 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScopedTempDir temp_dir; 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetUpVersion11Database(temp_dir.path()); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser_sync::UserSettings settings; 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings.Init(v11_user_setting_db_path()); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Connection db; 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.Open(v11_user_setting_db_path())); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const char* query = "SELECT version FROM db_version"; 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement version_query(db.GetUniqueStatement(query)); 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!version_query) 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(FATAL) << query << "\n" << db.GetErrorMessage(); 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(version_query.Step()); 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const int version = version_query.ColumnInt(0); 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_GE(version, 12); 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const char* query2 = "SELECT name FROM sqlite_master " 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE type='table' AND name='signin_types'"; 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement table_query(db.GetUniqueStatement(query2)); 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!table_query) 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(FATAL) << query2 << "\n" << db.GetErrorMessage(); 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_FALSE(table_query.Step()); 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserSettingsTest, APEncode) { 23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string test; 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch char i; 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (i = numeric_limits<char>::min(); i < numeric_limits<char>::max(); ++i) 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test.push_back(i); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test.push_back(i); 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string encoded = browser_sync::APEncode(test); 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string decoded = browser_sync::APDecode(encoded); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(test, decoded); 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserSettingsTest, PersistEmptyToken) { 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScopedTempDir temp_dir; 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser_sync::UserSettings settings; 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings.Init(temp_dir.path().AppendASCII("UserSettings.sqlite3")); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings.SetAuthTokenForService("username", "service", ""); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string username; 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string token; 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(settings.GetLastUserAndServiceToken("service", &username, 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &token)); 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("", token); 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("username", username); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserSettingsTest, PersistNonEmptyToken) { 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScopedTempDir temp_dir; 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser_sync::UserSettings settings; 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings.Init(temp_dir.path().AppendASCII("UserSettings.sqlite3")); 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings.SetAuthTokenForService("username", "service", 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "oonetuhasonteuhasonetuhasonetuhasonetuhasouhasonetuhasonetuhasonetuhah" 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "oonetuhasonteuhasonetuhasonetuhasonetuhasouhasonetuhasonetuhasonetuhah" 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "oonetuhasonteuhasonetuhasonetuhasonetuhasouhasonetuhasonetuhasonetuhah"); 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string username; 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string token; 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(settings.GetLastUserAndServiceToken("service", &username, 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &token)); 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ( 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "oonetuhasonteuhasonetuhasonetuhasonetuhasouhasonetuhasonetuhasonetuhah" 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "oonetuhasonteuhasonetuhasonetuhasonetuhasouhasonetuhasonetuhasonetuhah" 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "oonetuhasonteuhasonetuhasonetuhasonetuhasouhasonetuhasonetuhasonetuhah", 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch token); 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ("username", username); 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 282