Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: content/browser/fileapi/sandbox_origin_database_unittest.cc

Issue 2368913003: Populate storage_unittests target. (Closed)
Patch Set: Removed unnecessary include from storage/browser/blob/blob_storage_context_unittest.cc. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 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 <stddef.h>
6
7 #include <algorithm>
8 #include <functional>
9 #include <limits>
10 #include <memory>
11 #include <string>
12 #include <vector>
13
14 #include "base/files/file.h"
15 #include "base/files/file_path.h"
16 #include "base/files/file_util.h"
17 #include "base/files/scoped_temp_dir.h"
18 #include "base/macros.h"
19 #include "base/stl_util.h"
20 #include "content/browser/fileapi/sandbox_database_test_helper.h"
21 #include "storage/browser/fileapi/sandbox_origin_database.h"
22 #include "storage/common/fileapi/file_system_util.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24 #include "third_party/leveldatabase/src/db/filename.h"
25 #include "third_party/leveldatabase/src/include/leveldb/db.h"
26
27 using storage::SandboxOriginDatabase;
28
29 namespace content {
30
31 namespace {
32 const base::FilePath::CharType kFileSystemDirName[] =
33 FILE_PATH_LITERAL("File System");
34 const base::FilePath::CharType kOriginDatabaseName[] =
35 FILE_PATH_LITERAL("Origins");
36 } // namespace
37
38 TEST(SandboxOriginDatabaseTest, BasicTest) {
39 base::ScopedTempDir dir;
40 ASSERT_TRUE(dir.CreateUniqueTempDir());
41 const base::FilePath kFSDir = dir.GetPath().Append(kFileSystemDirName);
42 EXPECT_FALSE(base::PathExists(kFSDir));
43 EXPECT_TRUE(base::CreateDirectory(kFSDir));
44
45 SandboxOriginDatabase database(kFSDir, NULL);
46 std::string origin("origin");
47
48 EXPECT_FALSE(database.HasOriginPath(origin));
49 // Double-check to make sure that had no side effects.
50 EXPECT_FALSE(database.HasOriginPath(origin));
51
52 base::FilePath path0;
53 base::FilePath path1;
54
55 // Empty strings aren't valid origins.
56 EXPECT_FALSE(database.GetPathForOrigin(std::string(), &path0));
57
58 EXPECT_TRUE(database.GetPathForOrigin(origin, &path0));
59 EXPECT_TRUE(database.HasOriginPath(origin));
60 EXPECT_TRUE(database.GetPathForOrigin(origin, &path1));
61 EXPECT_FALSE(path0.empty());
62 EXPECT_FALSE(path1.empty());
63 EXPECT_EQ(path0, path1);
64
65 EXPECT_TRUE(base::PathExists(kFSDir.Append(kOriginDatabaseName)));
66 }
67
68 TEST(SandboxOriginDatabaseTest, TwoPathTest) {
69 base::ScopedTempDir dir;
70 ASSERT_TRUE(dir.CreateUniqueTempDir());
71 const base::FilePath kFSDir = dir.GetPath().Append(kFileSystemDirName);
72 EXPECT_FALSE(base::PathExists(kFSDir));
73 EXPECT_TRUE(base::CreateDirectory(kFSDir));
74
75 SandboxOriginDatabase database(kFSDir, NULL);
76 std::string origin0("origin0");
77 std::string origin1("origin1");
78
79 EXPECT_FALSE(database.HasOriginPath(origin0));
80 EXPECT_FALSE(database.HasOriginPath(origin1));
81
82 base::FilePath path0;
83 base::FilePath path1;
84 EXPECT_TRUE(database.GetPathForOrigin(origin0, &path0));
85 EXPECT_TRUE(database.HasOriginPath(origin0));
86 EXPECT_FALSE(database.HasOriginPath(origin1));
87 EXPECT_TRUE(database.GetPathForOrigin(origin1, &path1));
88 EXPECT_TRUE(database.HasOriginPath(origin1));
89 EXPECT_FALSE(path0.empty());
90 EXPECT_FALSE(path1.empty());
91 EXPECT_NE(path0, path1);
92
93 EXPECT_TRUE(base::PathExists(kFSDir.Append(kOriginDatabaseName)));
94 }
95
96 TEST(SandboxOriginDatabaseTest, DropDatabaseTest) {
97 base::ScopedTempDir dir;
98 ASSERT_TRUE(dir.CreateUniqueTempDir());
99 const base::FilePath kFSDir = dir.GetPath().Append(kFileSystemDirName);
100 EXPECT_FALSE(base::PathExists(kFSDir));
101 EXPECT_TRUE(base::CreateDirectory(kFSDir));
102
103 SandboxOriginDatabase database(kFSDir, NULL);
104 std::string origin("origin");
105
106 EXPECT_FALSE(database.HasOriginPath(origin));
107
108 base::FilePath path0;
109 EXPECT_TRUE(database.GetPathForOrigin(origin, &path0));
110 EXPECT_TRUE(database.HasOriginPath(origin));
111 EXPECT_FALSE(path0.empty());
112
113 EXPECT_TRUE(base::PathExists(kFSDir.Append(kOriginDatabaseName)));
114
115 database.DropDatabase();
116
117 base::FilePath path1;
118 EXPECT_TRUE(database.HasOriginPath(origin));
119 EXPECT_TRUE(database.GetPathForOrigin(origin, &path1));
120 EXPECT_FALSE(path1.empty());
121 EXPECT_EQ(path0, path1);
122 }
123
124 TEST(SandboxOriginDatabaseTest, DeleteOriginTest) {
125 base::ScopedTempDir dir;
126 ASSERT_TRUE(dir.CreateUniqueTempDir());
127 const base::FilePath kFSDir = dir.GetPath().Append(kFileSystemDirName);
128 EXPECT_FALSE(base::PathExists(kFSDir));
129 EXPECT_TRUE(base::CreateDirectory(kFSDir));
130
131 SandboxOriginDatabase database(kFSDir, NULL);
132 std::string origin("origin");
133
134 EXPECT_FALSE(database.HasOriginPath(origin));
135 EXPECT_TRUE(database.RemovePathForOrigin(origin));
136
137 base::FilePath path0;
138 EXPECT_TRUE(database.GetPathForOrigin(origin, &path0));
139 EXPECT_TRUE(database.HasOriginPath(origin));
140 EXPECT_FALSE(path0.empty());
141
142 EXPECT_TRUE(database.RemovePathForOrigin(origin));
143 EXPECT_FALSE(database.HasOriginPath(origin));
144
145 base::FilePath path1;
146 EXPECT_TRUE(database.GetPathForOrigin(origin, &path1));
147 EXPECT_FALSE(path1.empty());
148 EXPECT_NE(path0, path1);
149 }
150
151 TEST(SandboxOriginDatabaseTest, ListOriginsTest) {
152 base::ScopedTempDir dir;
153 ASSERT_TRUE(dir.CreateUniqueTempDir());
154 const base::FilePath kFSDir = dir.GetPath().Append(kFileSystemDirName);
155 EXPECT_FALSE(base::PathExists(kFSDir));
156 EXPECT_TRUE(base::CreateDirectory(kFSDir));
157
158 std::vector<SandboxOriginDatabase::OriginRecord> origins;
159
160 SandboxOriginDatabase database(kFSDir, NULL);
161 EXPECT_TRUE(database.ListAllOrigins(&origins));
162 EXPECT_TRUE(origins.empty());
163 origins.clear();
164
165 std::string origin0("origin0");
166 std::string origin1("origin1");
167
168 EXPECT_FALSE(database.HasOriginPath(origin0));
169 EXPECT_FALSE(database.HasOriginPath(origin1));
170
171 base::FilePath path0;
172 base::FilePath path1;
173 EXPECT_TRUE(database.GetPathForOrigin(origin0, &path0));
174 EXPECT_TRUE(database.ListAllOrigins(&origins));
175 EXPECT_EQ(origins.size(), 1UL);
176 EXPECT_EQ(origins[0].origin, origin0);
177 EXPECT_EQ(origins[0].path, path0);
178 origins.clear();
179 EXPECT_TRUE(database.GetPathForOrigin(origin1, &path1));
180 EXPECT_TRUE(database.ListAllOrigins(&origins));
181 EXPECT_EQ(origins.size(), 2UL);
182 if (origins[0].origin == origin0) {
183 EXPECT_EQ(origins[0].path, path0);
184 EXPECT_EQ(origins[1].origin, origin1);
185 EXPECT_EQ(origins[1].path, path1);
186 } else {
187 EXPECT_EQ(origins[0].origin, origin1);
188 EXPECT_EQ(origins[0].path, path1);
189 EXPECT_EQ(origins[1].origin, origin0);
190 EXPECT_EQ(origins[1].path, path0);
191 }
192 }
193
194 TEST(SandboxOriginDatabaseTest, DatabaseRecoveryTest) {
195 // Checks if SandboxOriginDatabase properly handles database corruption.
196 // In this test, we'll register some origins to the origin database, then
197 // corrupt database and its log file.
198 // After repairing, the origin database should be consistent even when some
199 // entries lost.
200
201 base::ScopedTempDir dir;
202 ASSERT_TRUE(dir.CreateUniqueTempDir());
203 const base::FilePath kFSDir = dir.GetPath().Append(kFileSystemDirName);
204 const base::FilePath kDBDir = kFSDir.Append(kOriginDatabaseName);
205 EXPECT_FALSE(base::PathExists(kFSDir));
206 EXPECT_TRUE(base::CreateDirectory(kFSDir));
207
208 const std::string kOrigins[] = {
209 "foo.example.com",
210 "bar.example.com",
211 "baz.example.com",
212 "hoge.example.com",
213 "fuga.example.com",
214 };
215
216 std::unique_ptr<SandboxOriginDatabase> database(
217 new SandboxOriginDatabase(kFSDir, NULL));
218 for (size_t i = 0; i < arraysize(kOrigins); ++i) {
219 base::FilePath path;
220 EXPECT_FALSE(database->HasOriginPath(kOrigins[i]));
221 EXPECT_TRUE(database->GetPathForOrigin(kOrigins[i], &path));
222 EXPECT_FALSE(path.empty());
223 EXPECT_TRUE(database->GetPathForOrigin(kOrigins[i], &path));
224
225 if (i != 1)
226 EXPECT_TRUE(base::CreateDirectory(kFSDir.Append(path)));
227 }
228 database.reset();
229
230 const base::FilePath kGarbageDir = kFSDir.AppendASCII("foo");
231 const base::FilePath kGarbageFile = kGarbageDir.AppendASCII("bar");
232 EXPECT_TRUE(base::CreateDirectory(kGarbageDir));
233 base::File file(kGarbageFile,
234 base::File::FLAG_CREATE | base::File::FLAG_WRITE);
235 EXPECT_TRUE(file.IsValid());
236 file.Close();
237
238 // Corrupt database itself and last log entry to drop last 1 database
239 // operation. The database should detect the corruption and should recover
240 // its consistency after recovery.
241 CorruptDatabase(kDBDir, leveldb::kDescriptorFile,
242 0, std::numeric_limits<size_t>::max());
243 CorruptDatabase(kDBDir, leveldb::kLogFile, -1, 1);
244
245 base::FilePath path;
246 database.reset(new SandboxOriginDatabase(kFSDir, NULL));
247 std::vector<SandboxOriginDatabase::OriginRecord> origins_in_db;
248 EXPECT_TRUE(database->ListAllOrigins(&origins_in_db));
249
250 // Expect all but last added origin will be repaired back, and kOrigins[1]
251 // should be dropped due to absence of backing directory.
252 EXPECT_EQ(arraysize(kOrigins) - 2, origins_in_db.size());
253
254 const std::string kOrigin("piyo.example.org");
255 EXPECT_FALSE(database->HasOriginPath(kOrigin));
256 EXPECT_TRUE(database->GetPathForOrigin(kOrigin, &path));
257 EXPECT_FALSE(path.empty());
258 EXPECT_TRUE(database->HasOriginPath(kOrigin));
259
260 EXPECT_FALSE(base::PathExists(kGarbageFile));
261 EXPECT_FALSE(base::PathExists(kGarbageDir));
262 }
263
264 TEST(SandboxOriginDatabaseTest, DatabaseRecoveryForMissingDBFileTest) {
265 const leveldb::FileType kLevelDBFileTypes[] = {
266 leveldb::kLogFile,
267 leveldb::kDBLockFile,
268 leveldb::kTableFile,
269 leveldb::kDescriptorFile,
270 leveldb::kCurrentFile,
271 leveldb::kTempFile,
272 leveldb::kInfoLogFile,
273 };
274
275 for (size_t i = 0; i < arraysize(kLevelDBFileTypes); ++i) {
276 base::ScopedTempDir dir;
277 ASSERT_TRUE(dir.CreateUniqueTempDir());
278 const base::FilePath kFSDir = dir.GetPath().Append(kFileSystemDirName);
279 const base::FilePath kDBDir = kFSDir.Append(kOriginDatabaseName);
280 EXPECT_FALSE(base::PathExists(kFSDir));
281 EXPECT_TRUE(base::CreateDirectory(kFSDir));
282
283 const std::string kOrigin = "foo.example.com";
284 base::FilePath path;
285
286 std::unique_ptr<SandboxOriginDatabase> database(
287 new SandboxOriginDatabase(kFSDir, NULL));
288 EXPECT_FALSE(database->HasOriginPath(kOrigin));
289 EXPECT_TRUE(database->GetPathForOrigin(kOrigin, &path));
290 EXPECT_FALSE(path.empty());
291 EXPECT_TRUE(database->GetPathForOrigin(kOrigin, &path));
292 EXPECT_TRUE(base::CreateDirectory(kFSDir.Append(path)));
293 database.reset();
294
295 DeleteDatabaseFile(kDBDir, kLevelDBFileTypes[i]);
296
297 database.reset(new SandboxOriginDatabase(kFSDir, NULL));
298 std::vector<SandboxOriginDatabase::OriginRecord> origins_in_db;
299 EXPECT_TRUE(database->ListAllOrigins(&origins_in_db));
300
301 const std::string kOrigin2("piyo.example.org");
302 EXPECT_FALSE(database->HasOriginPath(kOrigin2));
303 EXPECT_TRUE(database->GetPathForOrigin(kOrigin2, &path));
304 EXPECT_FALSE(path.empty());
305 EXPECT_TRUE(database->HasOriginPath(kOrigin2));
306 }
307 }
308
309 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698