[Mac] PepperFlash default on DEV channel.
[chromium-blink-merge.git] / webkit / fileapi / file_system_origin_database_unittest.cc
blob68ad6e33c2c5b348f3f9dd40f9e1b2f57c198d64
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.
5 #include <algorithm>
6 #include <functional>
7 #include <limits>
8 #include <string>
10 #include "base/file_path.h"
11 #include "base/file_util.h"
12 #include "base/platform_file.h"
13 #include "base/scoped_temp_dir.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_database_test_helper.h"
19 #include "webkit/fileapi/file_system_origin_database.h"
20 #include "webkit/fileapi/file_system_util.h"
22 namespace fileapi {
24 namespace {
25 const FilePath::CharType kFileSystemDirName[] =
26 FILE_PATH_LITERAL("File System");
27 const FilePath::CharType kOriginDatabaseName[] = FILE_PATH_LITERAL("Origins");
28 } // namespace
30 TEST(FileSystemOriginDatabaseTest, BasicTest) {
31 ScopedTempDir dir;
32 ASSERT_TRUE(dir.CreateUniqueTempDir());
33 const FilePath kFSDir = dir.path().Append(kFileSystemDirName);
34 EXPECT_FALSE(file_util::PathExists(kFSDir));
35 EXPECT_TRUE(file_util::CreateDirectory(kFSDir));
37 FileSystemOriginDatabase database(kFSDir);
38 std::string origin("origin");
40 EXPECT_FALSE(database.HasOriginPath(origin));
41 // Double-check to make sure that had no side effects.
42 EXPECT_FALSE(database.HasOriginPath(origin));
44 FilePath path0;
45 FilePath path1;
47 // Empty strings aren't valid origins.
48 EXPECT_FALSE(database.GetPathForOrigin(std::string(), &path0));
50 EXPECT_TRUE(database.GetPathForOrigin(origin, &path0));
51 EXPECT_TRUE(database.HasOriginPath(origin));
52 EXPECT_TRUE(database.GetPathForOrigin(origin, &path1));
53 EXPECT_FALSE(path0.empty());
54 EXPECT_FALSE(path1.empty());
55 EXPECT_EQ(path0, path1);
57 EXPECT_TRUE(file_util::PathExists(kFSDir.Append(kOriginDatabaseName)));
60 TEST(FileSystemOriginDatabaseTest, TwoPathTest) {
61 ScopedTempDir dir;
62 ASSERT_TRUE(dir.CreateUniqueTempDir());
63 const FilePath kFSDir = dir.path().Append(kFileSystemDirName);
64 EXPECT_FALSE(file_util::PathExists(kFSDir));
65 EXPECT_TRUE(file_util::CreateDirectory(kFSDir));
67 FileSystemOriginDatabase database(kFSDir);
68 std::string origin0("origin0");
69 std::string origin1("origin1");
71 EXPECT_FALSE(database.HasOriginPath(origin0));
72 EXPECT_FALSE(database.HasOriginPath(origin1));
74 FilePath path0;
75 FilePath path1;
76 EXPECT_TRUE(database.GetPathForOrigin(origin0, &path0));
77 EXPECT_TRUE(database.HasOriginPath(origin0));
78 EXPECT_FALSE(database.HasOriginPath(origin1));
79 EXPECT_TRUE(database.GetPathForOrigin(origin1, &path1));
80 EXPECT_TRUE(database.HasOriginPath(origin1));
81 EXPECT_FALSE(path0.empty());
82 EXPECT_FALSE(path1.empty());
83 EXPECT_NE(path0, path1);
85 EXPECT_TRUE(file_util::PathExists(kFSDir.Append(kOriginDatabaseName)));
88 TEST(FileSystemOriginDatabaseTest, DropDatabaseTest) {
89 ScopedTempDir dir;
90 ASSERT_TRUE(dir.CreateUniqueTempDir());
91 const FilePath kFSDir = dir.path().Append(kFileSystemDirName);
92 EXPECT_FALSE(file_util::PathExists(kFSDir));
93 EXPECT_TRUE(file_util::CreateDirectory(kFSDir));
95 FileSystemOriginDatabase database(kFSDir);
96 std::string origin("origin");
98 EXPECT_FALSE(database.HasOriginPath(origin));
100 FilePath path0;
101 EXPECT_TRUE(database.GetPathForOrigin(origin, &path0));
102 EXPECT_TRUE(database.HasOriginPath(origin));
103 EXPECT_FALSE(path0.empty());
105 EXPECT_TRUE(file_util::PathExists(kFSDir.Append(kOriginDatabaseName)));
107 database.DropDatabase();
109 FilePath path1;
110 EXPECT_TRUE(database.HasOriginPath(origin));
111 EXPECT_TRUE(database.GetPathForOrigin(origin, &path1));
112 EXPECT_FALSE(path1.empty());
113 EXPECT_EQ(path0, path1);
116 TEST(FileSystemOriginDatabaseTest, DeleteOriginTest) {
117 ScopedTempDir dir;
118 ASSERT_TRUE(dir.CreateUniqueTempDir());
119 const FilePath kFSDir = dir.path().Append(kFileSystemDirName);
120 EXPECT_FALSE(file_util::PathExists(kFSDir));
121 EXPECT_TRUE(file_util::CreateDirectory(kFSDir));
123 FileSystemOriginDatabase database(kFSDir);
124 std::string origin("origin");
126 EXPECT_FALSE(database.HasOriginPath(origin));
127 EXPECT_TRUE(database.RemovePathForOrigin(origin));
129 FilePath path0;
130 EXPECT_TRUE(database.GetPathForOrigin(origin, &path0));
131 EXPECT_TRUE(database.HasOriginPath(origin));
132 EXPECT_FALSE(path0.empty());
134 EXPECT_TRUE(database.RemovePathForOrigin(origin));
135 EXPECT_FALSE(database.HasOriginPath(origin));
137 FilePath path1;
138 EXPECT_TRUE(database.GetPathForOrigin(origin, &path1));
139 EXPECT_FALSE(path1.empty());
140 EXPECT_NE(path0, path1);
143 TEST(FileSystemOriginDatabaseTest, ListOriginsTest) {
144 ScopedTempDir dir;
145 ASSERT_TRUE(dir.CreateUniqueTempDir());
146 const FilePath kFSDir = dir.path().Append(kFileSystemDirName);
147 EXPECT_FALSE(file_util::PathExists(kFSDir));
148 EXPECT_TRUE(file_util::CreateDirectory(kFSDir));
150 std::vector<FileSystemOriginDatabase::OriginRecord> origins;
152 FileSystemOriginDatabase database(kFSDir);
153 EXPECT_TRUE(database.ListAllOrigins(&origins));
154 EXPECT_TRUE(origins.empty());
155 origins.clear();
157 std::string origin0("origin0");
158 std::string origin1("origin1");
160 EXPECT_FALSE(database.HasOriginPath(origin0));
161 EXPECT_FALSE(database.HasOriginPath(origin1));
163 FilePath path0;
164 FilePath path1;
165 EXPECT_TRUE(database.GetPathForOrigin(origin0, &path0));
166 EXPECT_TRUE(database.ListAllOrigins(&origins));
167 EXPECT_EQ(origins.size(), 1UL);
168 EXPECT_EQ(origins[0].origin, origin0);
169 EXPECT_EQ(origins[0].path, path0);
170 origins.clear();
171 EXPECT_TRUE(database.GetPathForOrigin(origin1, &path1));
172 EXPECT_TRUE(database.ListAllOrigins(&origins));
173 EXPECT_EQ(origins.size(), 2UL);
174 if (origins[0].origin == origin0) {
175 EXPECT_EQ(origins[0].path, path0);
176 EXPECT_EQ(origins[1].origin, origin1);
177 EXPECT_EQ(origins[1].path, path1);
178 } else {
179 EXPECT_EQ(origins[0].origin, origin1);
180 EXPECT_EQ(origins[0].path, path1);
181 EXPECT_EQ(origins[1].origin, origin0);
182 EXPECT_EQ(origins[1].path, path0);
186 TEST(FileSystemOriginDatabaseTest, DatabaseRecoveryTest) {
187 // Checks if FileSystemOriginDatabase properly handles database corruption.
188 // In this test, we'll register some origins to the origin database, then
189 // corrupt database and its log file.
190 // After repairing, the origin database should be consistent even when some
191 // entries lost.
193 ScopedTempDir dir;
194 ASSERT_TRUE(dir.CreateUniqueTempDir());
195 const FilePath kFSDir = dir.path().Append(kFileSystemDirName);
196 const FilePath kDBDir = kFSDir.Append(kOriginDatabaseName);
197 EXPECT_FALSE(file_util::PathExists(kFSDir));
198 EXPECT_TRUE(file_util::CreateDirectory(kFSDir));
200 const std::string kOrigins[] = {
201 "foo.example.com",
202 "bar.example.com",
203 "baz.example.com",
204 "hoge.example.com",
205 "fuga.example.com",
208 scoped_ptr<FileSystemOriginDatabase> database(
209 new FileSystemOriginDatabase(kFSDir));
210 for (size_t i = 0; i < arraysize(kOrigins); ++i) {
211 FilePath path;
212 EXPECT_FALSE(database->HasOriginPath(kOrigins[i]));
213 EXPECT_TRUE(database->GetPathForOrigin(kOrigins[i], &path));
214 EXPECT_FALSE(path.empty());
215 EXPECT_TRUE(database->GetPathForOrigin(kOrigins[i], &path));
217 if (i != 1)
218 EXPECT_TRUE(file_util::CreateDirectory(kFSDir.Append(path)));
220 database.reset();
222 const FilePath kGarbageDir = kFSDir.AppendASCII("foo");
223 const FilePath kGarbageFile = kGarbageDir.AppendASCII("bar");
224 EXPECT_TRUE(file_util::CreateDirectory(kGarbageDir));
225 bool created = false;
226 base::PlatformFileError error;
227 base::PlatformFile file = base::CreatePlatformFile(
228 kGarbageFile,
229 base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_WRITE,
230 &created, &error);
231 EXPECT_EQ(base::PLATFORM_FILE_OK, error);
232 EXPECT_TRUE(created);
233 EXPECT_TRUE(base::ClosePlatformFile(file));
235 // Corrupt database itself and last log entry to drop last 1 database
236 // operation. The database should detect the corruption and should recover
237 // its consistency after recovery.
238 CorruptDatabase(kDBDir, leveldb::kDescriptorFile,
239 0, std::numeric_limits<size_t>::max());
240 CorruptDatabase(kDBDir, leveldb::kLogFile, -1, 1);
242 FilePath path;
243 database.reset(new FileSystemOriginDatabase(kFSDir));
244 std::vector<FileSystemOriginDatabase::OriginRecord> origins_in_db;
245 EXPECT_TRUE(database->ListAllOrigins(&origins_in_db));
247 // Expect all but last added origin will be repaired back, and kOrigins[1]
248 // should be dropped due to absence of backing directory.
249 EXPECT_EQ(arraysize(kOrigins) - 2, origins_in_db.size());
251 const std::string kOrigin("piyo.example.org");
252 EXPECT_FALSE(database->HasOriginPath(kOrigin));
253 EXPECT_TRUE(database->GetPathForOrigin(kOrigin, &path));
254 EXPECT_FALSE(path.empty());
255 EXPECT_TRUE(database->HasOriginPath(kOrigin));
257 EXPECT_FALSE(file_util::PathExists(kGarbageFile));
258 EXPECT_FALSE(file_util::PathExists(kGarbageDir));
261 } // namespace fileapi