blob: 19a3d1f96a0833ae380892195f7899ef75752123 [file] [log] [blame]
[email protected]6ed6d14f2013-09-07 15:48:361// 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.
4
5#include "sql/meta_table.h"
6
avi0b519202015-12-21 07:25:197#include <stdint.h>
8
[email protected]6ed6d14f2013-09-07 15:48:369#include "base/files/file_path.h"
10#include "base/files/scoped_temp_dir.h"
Victor Costancfbfa602018-08-01 23:24:4611#include "sql/database.h"
[email protected]6ed6d14f2013-09-07 15:48:3612#include "sql/statement.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
Victor Costan49a903a2021-05-07 22:21:0015namespace sql {
16
[email protected]6ed6d14f2013-09-07 15:48:3617namespace {
18
Victor Costan49a903a2021-05-07 22:21:0019class SQLMetaTableTest : public testing::Test {
20 public:
21 ~SQLMetaTableTest() override = default;
Victor Costan525b30a2021-05-05 17:54:1022
Victor Costan49a903a2021-05-07 22:21:0023 void SetUp() override {
24 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
25 ASSERT_TRUE(
26 db_.Open(temp_dir_.GetPath().AppendASCII("meta_table_test.sqlite")));
Victor Costan525b30a2021-05-05 17:54:1027 }
28
Victor Costan49a903a2021-05-07 22:21:0029 protected:
30 base::ScopedTempDir temp_dir_;
31 Database db_;
32};
33
34TEST_F(SQLMetaTableTest, DoesTableExist) {
35 EXPECT_FALSE(MetaTable::DoesTableExist(&db_));
36
37 {
38 MetaTable meta_table;
39 EXPECT_TRUE(meta_table.Init(&db_, 1, 1));
40 }
41
42 EXPECT_TRUE(MetaTable::DoesTableExist(&db_));
[email protected]6ed6d14f2013-09-07 15:48:3643}
44
David Van Clevef7b270f2021-06-22 13:27:1945TEST_F(SQLMetaTableTest, DeleteTableForTesting) {
46 MetaTable meta_table;
47 EXPECT_TRUE(meta_table.Init(&db_, 1, 1));
48
49 EXPECT_TRUE(MetaTable::DeleteTableForTesting(&db_));
50 EXPECT_FALSE(MetaTable::DoesTableExist(&db_));
51}
52
[email protected]fe4e3de2013-10-08 02:19:1753TEST_F(SQLMetaTableTest, RazeIfDeprecated) {
54 const int kDeprecatedVersion = 1;
55 const int kVersion = 2;
56
57 // Setup a current database.
58 {
Victor Costan49a903a2021-05-07 22:21:0059 MetaTable meta_table;
60 EXPECT_TRUE(meta_table.Init(&db_, kVersion, kVersion));
61 EXPECT_TRUE(db_.Execute("CREATE TABLE t(c)"));
62 EXPECT_TRUE(db_.DoesTableExist("t"));
[email protected]fe4e3de2013-10-08 02:19:1763 }
64
65 // Table should should still exist if the database version is new enough.
Victor Costan49a903a2021-05-07 22:21:0066 MetaTable::RazeIfDeprecated(&db_, kDeprecatedVersion);
67 EXPECT_TRUE(db_.DoesTableExist("t"));
[email protected]fe4e3de2013-10-08 02:19:1768
69 // TODO(shess): It may make sense to Raze() if meta isn't present or
70 // version isn't present. See meta_table.h TODO on RazeIfDeprecated().
71
72 // Table should still exist if the version is not available.
Victor Costan49a903a2021-05-07 22:21:0073 EXPECT_TRUE(db_.Execute("DELETE FROM meta WHERE key = 'version'"));
[email protected]fe4e3de2013-10-08 02:19:1774 {
Victor Costan49a903a2021-05-07 22:21:0075 MetaTable meta_table;
76 EXPECT_TRUE(meta_table.Init(&db_, kVersion, kVersion));
[email protected]fe4e3de2013-10-08 02:19:1777 EXPECT_EQ(0, meta_table.GetVersionNumber());
78 }
Victor Costan49a903a2021-05-07 22:21:0079 MetaTable::RazeIfDeprecated(&db_, kDeprecatedVersion);
80 EXPECT_TRUE(db_.DoesTableExist("t"));
[email protected]fe4e3de2013-10-08 02:19:1781
82 // Table should still exist if meta table is missing.
Victor Costan49a903a2021-05-07 22:21:0083 EXPECT_TRUE(db_.Execute("DROP TABLE meta"));
84 MetaTable::RazeIfDeprecated(&db_, kDeprecatedVersion);
85 EXPECT_TRUE(db_.DoesTableExist("t"));
[email protected]fe4e3de2013-10-08 02:19:1786
87 // Setup meta with deprecated version.
88 {
Victor Costan49a903a2021-05-07 22:21:0089 MetaTable meta_table;
90 EXPECT_TRUE(meta_table.Init(&db_, kDeprecatedVersion, kDeprecatedVersion));
[email protected]fe4e3de2013-10-08 02:19:1791 }
92
93 // Deprecation check should remove the table.
Victor Costan49a903a2021-05-07 22:21:0094 EXPECT_TRUE(db_.DoesTableExist("t"));
95 MetaTable::RazeIfDeprecated(&db_, kDeprecatedVersion);
96 EXPECT_FALSE(MetaTable::DoesTableExist(&db_));
97 EXPECT_FALSE(db_.DoesTableExist("t"));
[email protected]fe4e3de2013-10-08 02:19:1798}
99
[email protected]6ed6d14f2013-09-07 15:48:36100TEST_F(SQLMetaTableTest, VersionNumber) {
101 // Compatibility versions one less than the main versions to make
102 // sure the values aren't being crossed with each other.
103 const int kVersionFirst = 2;
104 const int kCompatVersionFirst = kVersionFirst - 1;
105 const int kVersionSecond = 4;
106 const int kCompatVersionSecond = kVersionSecond - 1;
107 const int kVersionThird = 6;
108 const int kCompatVersionThird = kVersionThird - 1;
109
110 // First Init() sets the version info as expected.
111 {
Victor Costan49a903a2021-05-07 22:21:00112 MetaTable meta_table;
113 EXPECT_TRUE(meta_table.Init(&db_, kVersionFirst, kCompatVersionFirst));
[email protected]6ed6d14f2013-09-07 15:48:36114 EXPECT_EQ(kVersionFirst, meta_table.GetVersionNumber());
115 EXPECT_EQ(kCompatVersionFirst, meta_table.GetCompatibleVersionNumber());
116 }
117
118 // Second Init() does not change the version info.
119 {
Victor Costan49a903a2021-05-07 22:21:00120 MetaTable meta_table;
121 EXPECT_TRUE(meta_table.Init(&db_, kVersionSecond, kCompatVersionSecond));
[email protected]6ed6d14f2013-09-07 15:48:36122 EXPECT_EQ(kVersionFirst, meta_table.GetVersionNumber());
123 EXPECT_EQ(kCompatVersionFirst, meta_table.GetCompatibleVersionNumber());
124
125 meta_table.SetVersionNumber(kVersionSecond);
126 meta_table.SetCompatibleVersionNumber(kCompatVersionSecond);
127 }
128
129 // Version info from Set*() calls is seen.
130 {
Victor Costan49a903a2021-05-07 22:21:00131 MetaTable meta_table;
132 EXPECT_TRUE(meta_table.Init(&db_, kVersionThird, kCompatVersionThird));
[email protected]6ed6d14f2013-09-07 15:48:36133 EXPECT_EQ(kVersionSecond, meta_table.GetVersionNumber());
134 EXPECT_EQ(kCompatVersionSecond, meta_table.GetCompatibleVersionNumber());
135 }
136}
137
138TEST_F(SQLMetaTableTest, StringValue) {
Victor Costan1d868352018-06-26 19:06:48139 static const char kKey[] = "String Key";
[email protected]6ed6d14f2013-09-07 15:48:36140 const std::string kFirstValue("First Value");
141 const std::string kSecondValue("Second Value");
142
143 // Initially, the value isn't there until set.
144 {
Victor Costan49a903a2021-05-07 22:21:00145 MetaTable meta_table;
146 EXPECT_TRUE(meta_table.Init(&db_, 1, 1));
[email protected]6ed6d14f2013-09-07 15:48:36147
148 std::string value;
149 EXPECT_FALSE(meta_table.GetValue(kKey, &value));
150
151 EXPECT_TRUE(meta_table.SetValue(kKey, kFirstValue));
152 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
153 EXPECT_EQ(kFirstValue, value);
154 }
155
156 // Value is persistent across different instances.
157 {
Victor Costan49a903a2021-05-07 22:21:00158 MetaTable meta_table;
159 EXPECT_TRUE(meta_table.Init(&db_, 1, 1));
[email protected]6ed6d14f2013-09-07 15:48:36160
161 std::string value;
162 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
163 EXPECT_EQ(kFirstValue, value);
164
165 EXPECT_TRUE(meta_table.SetValue(kKey, kSecondValue));
166 }
167
168 // Existing value was successfully changed.
169 {
Victor Costan49a903a2021-05-07 22:21:00170 MetaTable meta_table;
171 EXPECT_TRUE(meta_table.Init(&db_, 1, 1));
[email protected]6ed6d14f2013-09-07 15:48:36172
173 std::string value;
174 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
175 EXPECT_EQ(kSecondValue, value);
176 }
177}
178
179TEST_F(SQLMetaTableTest, IntValue) {
Victor Costan1d868352018-06-26 19:06:48180 static const char kKey[] = "Int Key";
[email protected]6ed6d14f2013-09-07 15:48:36181 const int kFirstValue = 17;
182 const int kSecondValue = 23;
183
184 // Initially, the value isn't there until set.
185 {
Victor Costan49a903a2021-05-07 22:21:00186 MetaTable meta_table;
187 EXPECT_TRUE(meta_table.Init(&db_, 1, 1));
[email protected]6ed6d14f2013-09-07 15:48:36188
189 int value;
190 EXPECT_FALSE(meta_table.GetValue(kKey, &value));
191
192 EXPECT_TRUE(meta_table.SetValue(kKey, kFirstValue));
193 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
194 EXPECT_EQ(kFirstValue, value);
195 }
196
197 // Value is persistent across different instances.
198 {
Victor Costan49a903a2021-05-07 22:21:00199 MetaTable meta_table;
200 EXPECT_TRUE(meta_table.Init(&db_, 1, 1));
[email protected]6ed6d14f2013-09-07 15:48:36201
202 int value;
203 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
204 EXPECT_EQ(kFirstValue, value);
205
206 EXPECT_TRUE(meta_table.SetValue(kKey, kSecondValue));
207 }
208
209 // Existing value was successfully changed.
210 {
Victor Costan49a903a2021-05-07 22:21:00211 MetaTable meta_table;
212 EXPECT_TRUE(meta_table.Init(&db_, 1, 1));
[email protected]6ed6d14f2013-09-07 15:48:36213
214 int value;
215 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
216 EXPECT_EQ(kSecondValue, value);
217 }
218}
219
220TEST_F(SQLMetaTableTest, Int64Value) {
Victor Costan1d868352018-06-26 19:06:48221 static const char kKey[] = "Int Key";
tfarina720d4f32015-05-11 22:31:26222 const int64_t kFirstValue = 5000000017LL;
223 const int64_t kSecondValue = 5000000023LL;
[email protected]6ed6d14f2013-09-07 15:48:36224
225 // Initially, the value isn't there until set.
226 {
Victor Costan49a903a2021-05-07 22:21:00227 MetaTable meta_table;
228 EXPECT_TRUE(meta_table.Init(&db_, 1, 1));
[email protected]6ed6d14f2013-09-07 15:48:36229
tfarina720d4f32015-05-11 22:31:26230 int64_t value;
[email protected]6ed6d14f2013-09-07 15:48:36231 EXPECT_FALSE(meta_table.GetValue(kKey, &value));
232
233 EXPECT_TRUE(meta_table.SetValue(kKey, kFirstValue));
234 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
235 EXPECT_EQ(kFirstValue, value);
236 }
237
238 // Value is persistent across different instances.
239 {
Victor Costan49a903a2021-05-07 22:21:00240 MetaTable meta_table;
241 EXPECT_TRUE(meta_table.Init(&db_, 1, 1));
[email protected]6ed6d14f2013-09-07 15:48:36242
tfarina720d4f32015-05-11 22:31:26243 int64_t value;
[email protected]6ed6d14f2013-09-07 15:48:36244 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
245 EXPECT_EQ(kFirstValue, value);
246
247 EXPECT_TRUE(meta_table.SetValue(kKey, kSecondValue));
248 }
249
250 // Existing value was successfully changed.
251 {
Victor Costan49a903a2021-05-07 22:21:00252 MetaTable meta_table;
253 EXPECT_TRUE(meta_table.Init(&db_, 1, 1));
[email protected]6ed6d14f2013-09-07 15:48:36254
tfarina720d4f32015-05-11 22:31:26255 int64_t value;
[email protected]6ed6d14f2013-09-07 15:48:36256 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
257 EXPECT_EQ(kSecondValue, value);
258 }
259}
260
261TEST_F(SQLMetaTableTest, DeleteKey) {
Victor Costan1d868352018-06-26 19:06:48262 static const char kKey[] = "String Key";
[email protected]6ed6d14f2013-09-07 15:48:36263 const std::string kValue("String Value");
264
Victor Costan49a903a2021-05-07 22:21:00265 MetaTable meta_table;
266 EXPECT_TRUE(meta_table.Init(&db_, 1, 1));
[email protected]6ed6d14f2013-09-07 15:48:36267
268 // Value isn't present.
269 std::string value;
270 EXPECT_FALSE(meta_table.GetValue(kKey, &value));
271
272 // Now value is present.
273 EXPECT_TRUE(meta_table.SetValue(kKey, kValue));
274 EXPECT_TRUE(meta_table.GetValue(kKey, &value));
275 EXPECT_EQ(kValue, value);
276
277 // After delete value isn't present.
278 EXPECT_TRUE(meta_table.DeleteKey(kKey));
279 EXPECT_FALSE(meta_table.GetValue(kKey, &value));
280}
281
282} // namespace
Victor Costan49a903a2021-05-07 22:21:00283
284} // namespace sql