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

Side by Side Diff: webkit/fileapi/sandbox_origin_database_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698