1 // Copyright 2013 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.
5 #include "sql/meta_table.h"
9 #include "base/files/file_path.h"
10 #include "base/files/scoped_temp_dir.h"
11 #include "sql/database.h"
12 #include "sql/statement.h"
13 #include "sql/test/sql_test_base.h"
14 #include "testing/gtest/include/gtest/gtest.h"
18 using SQLMetaTableTest = sql::SQLTestBase;
20 TEST_F(SQLMetaTableTest, DoesTableExist) {
21 EXPECT_FALSE(sql::MetaTable::DoesTableExist(&db()));
24 sql::MetaTable meta_table;
25 EXPECT_TRUE(meta_table.Init(&db(), 1, 1));
28 EXPECT_TRUE(sql::MetaTable::DoesTableExist(&db()));
31 TEST_F(SQLMetaTableTest, RazeIfDeprecated) {
32 const int kDeprecatedVersion = 1;
33 const int kVersion = 2;
35 // Setup a current database.
37 sql::MetaTable meta_table;
38 EXPECT_TRUE(meta_table.Init(&db(), kVersion, kVersion));
39 EXPECT_TRUE(db().Execute("CREATE TABLE t(c)"));
40 EXPECT_TRUE(db().DoesTableExist("t"));
43 // Table should should still exist if the database version is new enough.
44 sql::MetaTable::RazeIfDeprecated(&db(), kDeprecatedVersion);
45 EXPECT_TRUE(db().DoesTableExist("t"));
47 // TODO(shess): It may make sense to Raze() if meta isn't present or
48 // version isn't present. See meta_table.h TODO on RazeIfDeprecated().
50 // Table should still exist if the version is not available.
51 EXPECT_TRUE(db().Execute("DELETE FROM meta WHERE key = 'version'"));
53 sql::MetaTable meta_table;
54 EXPECT_TRUE(meta_table.Init(&db(), kVersion, kVersion));
55 EXPECT_EQ(0, meta_table.GetVersionNumber());
57 sql::MetaTable::RazeIfDeprecated(&db(), kDeprecatedVersion);
58 EXPECT_TRUE(db().DoesTableExist("t"));
60 // Table should still exist if meta table is missing.
61 EXPECT_TRUE(db().Execute("DROP TABLE meta"));
62 sql::MetaTable::RazeIfDeprecated(&db(), kDeprecatedVersion);
63 EXPECT_TRUE(db().DoesTableExist("t"));
65 // Setup meta with deprecated version.
67 sql::MetaTable meta_table;
68 EXPECT_TRUE(meta_table.Init(&db(), kDeprecatedVersion, kDeprecatedVersion));
71 // Deprecation check should remove the table.
72 EXPECT_TRUE(db().DoesTableExist("t"));
73 sql::MetaTable::RazeIfDeprecated(&db(), kDeprecatedVersion);
74 EXPECT_FALSE(sql::MetaTable::DoesTableExist(&db()));
75 EXPECT_FALSE(db().DoesTableExist("t"));
78 TEST_F(SQLMetaTableTest, VersionNumber) {
79 // Compatibility versions one less than the main versions to make
80 // sure the values aren't being crossed with each other.
81 const int kVersionFirst = 2;
82 const int kCompatVersionFirst = kVersionFirst - 1;
83 const int kVersionSecond = 4;
84 const int kCompatVersionSecond = kVersionSecond - 1;
85 const int kVersionThird = 6;
86 const int kCompatVersionThird = kVersionThird - 1;
88 // First Init() sets the version info as expected.
90 sql::MetaTable meta_table;
91 EXPECT_TRUE(meta_table.Init(&db(), kVersionFirst, kCompatVersionFirst));
92 EXPECT_EQ(kVersionFirst, meta_table.GetVersionNumber());
93 EXPECT_EQ(kCompatVersionFirst, meta_table.GetCompatibleVersionNumber());
96 // Second Init() does not change the version info.
98 sql::MetaTable meta_table;
99 EXPECT_TRUE(meta_table.Init(&db(), kVersionSecond, kCompatVersionSecond));
100 EXPECT_EQ(kVersionFirst, meta_table.GetVersionNumber());
101 EXPECT_EQ(kCompatVersionFirst, meta_table.GetCompatibleVersionNumber());
103 meta_table.SetVersionNumber(kVersionSecond);
104 meta_table.SetCompatibleVersionNumber(kCompatVersionSecond);
107 // Version info from Set*() calls is seen.
109 sql::MetaTable meta_table;
110 EXPECT_TRUE(meta_table.Init(&db(), kVersionThird, kCompatVersionThird));
111 EXPECT_EQ(kVersionSecond, meta_table.GetVersionNumber());
112 EXPECT_EQ(kCompatVersionSecond, meta_table.GetCompatibleVersionNumber());
116 TEST_F(SQLMetaTableTest, StringValue) {
117 static const char kKey[] = "String Key";
118 const std::string kFirstValue("First Value");
119 const std::string kSecondValue("Second Value");
121 // Initially, the value isn't there until set.
123 sql::MetaTable meta_table;
124 EXPECT_TRUE(meta_table.Init(&db(), 1, 1));
127 EXPECT_FALSE(meta_table.GetValue(kKey, &value));
129 EXPECT_TRUE(meta_table.SetValue(kKey, kFirstValue));
130 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
131 EXPECT_EQ(kFirstValue, value);
134 // Value is persistent across different instances.
136 sql::MetaTable meta_table;
137 EXPECT_TRUE(meta_table.Init(&db(), 1, 1));
140 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
141 EXPECT_EQ(kFirstValue, value);
143 EXPECT_TRUE(meta_table.SetValue(kKey, kSecondValue));
146 // Existing value was successfully changed.
148 sql::MetaTable meta_table;
149 EXPECT_TRUE(meta_table.Init(&db(), 1, 1));
152 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
153 EXPECT_EQ(kSecondValue, value);
157 TEST_F(SQLMetaTableTest, IntValue) {
158 static const char kKey[] = "Int Key";
159 const int kFirstValue = 17;
160 const int kSecondValue = 23;
162 // Initially, the value isn't there until set.
164 sql::MetaTable meta_table;
165 EXPECT_TRUE(meta_table.Init(&db(), 1, 1));
168 EXPECT_FALSE(meta_table.GetValue(kKey, &value));
170 EXPECT_TRUE(meta_table.SetValue(kKey, kFirstValue));
171 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
172 EXPECT_EQ(kFirstValue, value);
175 // Value is persistent across different instances.
177 sql::MetaTable meta_table;
178 EXPECT_TRUE(meta_table.Init(&db(), 1, 1));
181 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
182 EXPECT_EQ(kFirstValue, value);
184 EXPECT_TRUE(meta_table.SetValue(kKey, kSecondValue));
187 // Existing value was successfully changed.
189 sql::MetaTable meta_table;
190 EXPECT_TRUE(meta_table.Init(&db(), 1, 1));
193 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
194 EXPECT_EQ(kSecondValue, value);
198 TEST_F(SQLMetaTableTest, Int64Value) {
199 static const char kKey[] = "Int Key";
200 const int64_t kFirstValue = 5000000017LL;
201 const int64_t kSecondValue = 5000000023LL;
203 // Initially, the value isn't there until set.
205 sql::MetaTable meta_table;
206 EXPECT_TRUE(meta_table.Init(&db(), 1, 1));
209 EXPECT_FALSE(meta_table.GetValue(kKey, &value));
211 EXPECT_TRUE(meta_table.SetValue(kKey, kFirstValue));
212 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
213 EXPECT_EQ(kFirstValue, value);
216 // Value is persistent across different instances.
218 sql::MetaTable meta_table;
219 EXPECT_TRUE(meta_table.Init(&db(), 1, 1));
222 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
223 EXPECT_EQ(kFirstValue, value);
225 EXPECT_TRUE(meta_table.SetValue(kKey, kSecondValue));
228 // Existing value was successfully changed.
230 sql::MetaTable meta_table;
231 EXPECT_TRUE(meta_table.Init(&db(), 1, 1));
234 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
235 EXPECT_EQ(kSecondValue, value);
239 TEST_F(SQLMetaTableTest, DeleteKey) {
240 static const char kKey[] = "String Key";
241 const std::string kValue("String Value");
243 sql::MetaTable meta_table;
244 EXPECT_TRUE(meta_table.Init(&db(), 1, 1));
246 // Value isn't present.
248 EXPECT_FALSE(meta_table.GetValue(kKey, &value));
250 // Now value is present.
251 EXPECT_TRUE(meta_table.SetValue(kKey, kValue));
252 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
253 EXPECT_EQ(kValue, value);
255 // After delete value isn't present.
256 EXPECT_TRUE(meta_table.DeleteKey(kKey));
257 EXPECT_FALSE(meta_table.GetValue(kKey, &value));