1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE entry.
#include "base/file_util.h"
#include "base/test/test_file_util.h"
#include "chrome/browser/sync/syncable/directory_manager.h"
#include "chrome/browser/sync/util/user_settings.h"
#include "chrome/browser/sync/util/query_helpers.h"
#include "testing/gtest/include/gtest/gtest.h"
using browser_sync::UserSettings;
static const PathChar* kV10UserSettingsDB = PSTR("Version10Settings.sqlite3");
static const PathChar* kOldStyleSyncDataDB = PSTR("OldStyleSyncData.sqlite3");
class UserSettingsTest : public testing::Test {
public:
UserSettingsTest() : sync_data_("Some sync data") { }
void SetUpVersion10Databases() {
CleanUpVersion10Databases();
sqlite3* primer_handle = NULL;
ASSERT_TRUE(SQLITE_OK == SqliteOpen(kV10UserSettingsDB,
&primer_handle));
FilePath old_sync_data(kOldStyleSyncDataDB);
ASSERT_TRUE(sync_data_.length() ==
static_cast<size_t>(file_util::WriteFile(
old_sync_data, sync_data_.data(), sync_data_.length())));
// Create settings table.
ExecOrDie(primer_handle, "CREATE TABLE settings"
" (email, key, value, "
" PRIMARY KEY(email, key) ON CONFLICT REPLACE)");
// Create and populate version table.
ExecOrDie(primer_handle, "CREATE TABLE db_version ( version )");
ExecOrDie(primer_handle, "INSERT INTO db_version values ( ? )", 10);
// Create shares table.
ExecOrDie(primer_handle, "CREATE TABLE shares"
" (email, share_name, file_name,"
" PRIMARY KEY(email, share_name) ON CONFLICT REPLACE)");
#if OS_WIN
// Populate a share.
ExecOrDie(primer_handle, "INSERT INTO shares values ( ?, ?, ?)",
"foo@foo.com", "foo@foo.com", WideToUTF8(kOldStyleSyncDataDB));
#elif OS_LINUX
// Populate a share.
ExecOrDie(primer_handle, "INSERT INTO shares values ( ?, ?, ?)",
"foo@foo.com", "foo@foo.com", kOldStyleSyncDataDB);
#endif
sqlite3_close(primer_handle);
}
void CleanUpVersion10Databases() {
ASSERT_TRUE(file_util::DieFileDie(FilePath(kV10UserSettingsDB), false));
ASSERT_TRUE(file_util::DieFileDie(FilePath(kOldStyleSyncDataDB), false));
ASSERT_TRUE(file_util::DieFileDie(FilePath(PSTR("SyncData.sqlite3")),
false));
}
const std::string& sync_data() const { return sync_data_; }
private:
std::string sync_data_;
};
TEST_F(UserSettingsTest, MigrateFromV10ToV11) {
SetUpVersion10Databases();
{
// Create a UserSettings, which should trigger migration code. We do this
// inside a scoped block so it closes itself and we can poke around to see
// what happened later.
UserSettings settings;
settings.Init(kV10UserSettingsDB);
}
// Now poke around using sqlite to see if UserSettings migrated properly.
sqlite3* handle = NULL;
ASSERT_TRUE(SQLITE_OK == SqliteOpen(kV10UserSettingsDB, &handle));
ScopedStatement version_query(PrepareQuery(handle,
"SELECT version FROM db_version"));
ASSERT_TRUE(SQLITE_ROW == sqlite3_step(version_query.get()));
const int version = sqlite3_column_int(version_query.get(), 0);
EXPECT_TRUE(11 == version);
EXPECT_FALSE(file_util::PathExists(FilePath(kOldStyleSyncDataDB)));
PathString path(syncable::DirectoryManager::GetSyncDataDatabaseFilename());
std::string contents;
ASSERT_TRUE(file_util::ReadFileToString(FilePath(path), &contents));
EXPECT_TRUE(sync_data() == contents);
}
|