OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "base/basictypes.h" | |
6 #include "base/file_util.h" | |
7 #include "base/files/scoped_temp_dir.h" | |
8 #include "base/platform_file.h" | |
9 #include "testing/gtest/include/gtest/gtest.h" | |
10 #include "webkit/browser/fileapi/sandbox_origin_database.h" | |
11 #include "webkit/browser/fileapi/sandbox_prioritized_origin_database.h" | |
12 | |
13 namespace fileapi { | |
14 | |
15 TEST(SandboxPrioritizedOriginDatabaseTest, BasicTest) { | |
16 base::ScopedTempDir dir; | |
17 base::FilePath path; | |
18 ASSERT_TRUE(dir.CreateUniqueTempDir()); | |
19 | |
20 const std::string kOrigin1("origin1"); | |
21 const std::string kOrigin2("origin2"); | |
22 | |
23 SandboxPrioritizedOriginDatabase database(dir.path(), NULL); | |
24 | |
25 // Set the kOrigin1 as a parimary origin. | |
26 EXPECT_TRUE(database.InitializePrimaryOrigin(kOrigin1)); | |
27 | |
28 // Add two origins. | |
29 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path)); | |
30 EXPECT_TRUE(database.GetPathForOrigin(kOrigin2, &path)); | |
31 | |
32 // Verify them. | |
33 EXPECT_TRUE(database.HasOriginPath(kOrigin1)); | |
34 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path)); | |
35 EXPECT_FALSE(path.empty()); | |
36 EXPECT_TRUE(database.HasOriginPath(kOrigin2)); | |
37 EXPECT_TRUE(database.GetPathForOrigin(kOrigin2, &path)); | |
38 EXPECT_FALSE(path.empty()); | |
39 | |
40 std::vector<SandboxOriginDatabaseInterface::OriginRecord> origins; | |
41 database.ListAllOrigins(&origins); | |
42 ASSERT_EQ(2U, origins.size()); | |
43 EXPECT_TRUE(origins[0].origin == kOrigin1 || | |
44 origins[1].origin == kOrigin1); | |
45 EXPECT_TRUE(origins[0].origin == kOrigin2 || | |
46 origins[1].origin == kOrigin2); | |
47 EXPECT_NE(origins[0].path, origins[1].path); | |
48 | |
49 // Try remove path for kOrigin1. | |
50 database.RemovePathForOrigin(kOrigin1); | |
51 | |
52 // Verify the removal. | |
53 EXPECT_FALSE(database.HasOriginPath(kOrigin1)); | |
54 EXPECT_TRUE(database.HasOriginPath(kOrigin2)); | |
55 database.ListAllOrigins(&origins); | |
56 ASSERT_EQ(1U, origins.size()); | |
57 EXPECT_EQ(kOrigin2, origins[0].origin); | |
58 | |
59 // Try remove path for kOrigin2. | |
60 database.RemovePathForOrigin(kOrigin2); | |
61 | |
62 // Verify the removal. | |
63 EXPECT_FALSE(database.HasOriginPath(kOrigin1)); | |
64 EXPECT_FALSE(database.HasOriginPath(kOrigin2)); | |
65 database.ListAllOrigins(&origins); | |
66 EXPECT_TRUE(origins.empty()); | |
67 } | |
68 | |
69 TEST(SandboxPrioritizedOriginDatabaseTest, SetPrimaryLaterTest) { | |
70 base::ScopedTempDir dir; | |
71 base::FilePath path; | |
72 ASSERT_TRUE(dir.CreateUniqueTempDir()); | |
73 | |
74 const std::string kOrigin1("origin1"); | |
75 const std::string kOrigin2("origin2"); | |
76 | |
77 SandboxPrioritizedOriginDatabase database(dir.path(), NULL); | |
78 | |
79 EXPECT_TRUE(database.GetPrimaryOrigin().empty()); | |
80 | |
81 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path)); | |
82 EXPECT_TRUE(database.GetPathForOrigin(kOrigin2, &path)); | |
83 | |
84 // Set the kOrigin1 as a parimary origin. | |
85 EXPECT_TRUE(database.InitializePrimaryOrigin(kOrigin1)); | |
86 EXPECT_EQ(kOrigin1, database.GetPrimaryOrigin()); | |
87 | |
88 // Regardless of whether it is initialized as primary or not | |
89 // they should just work. | |
90 EXPECT_TRUE(database.HasOriginPath(kOrigin1)); | |
91 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path)); | |
92 EXPECT_FALSE(path.empty()); | |
93 EXPECT_TRUE(database.HasOriginPath(kOrigin2)); | |
94 EXPECT_TRUE(database.GetPathForOrigin(kOrigin2, &path)); | |
95 EXPECT_FALSE(path.empty()); | |
96 } | |
97 | |
98 TEST(SandboxPrioritizedOriginDatabaseTest, LostPrimaryOriginFileTest) { | |
99 base::ScopedTempDir dir; | |
100 base::FilePath path; | |
101 ASSERT_TRUE(dir.CreateUniqueTempDir()); | |
102 | |
103 const std::string kOrigin1("origin1"); | |
104 const std::string kData("foo"); | |
105 | |
106 SandboxPrioritizedOriginDatabase database(dir.path(), NULL); | |
107 | |
108 EXPECT_TRUE(database.GetPrimaryOrigin().empty()); | |
109 | |
110 // Set the kOrigin1 as a parimary origin. | |
111 EXPECT_TRUE(database.InitializePrimaryOrigin(kOrigin1)); | |
112 EXPECT_EQ(kOrigin1, database.GetPrimaryOrigin()); | |
113 | |
114 // Make sure it works. | |
115 EXPECT_TRUE(database.HasOriginPath(kOrigin1)); | |
116 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path)); | |
117 | |
118 // Reset the database. | |
119 database.DropDatabase(); | |
120 | |
121 // kOrigin1 should still be marked as primary. | |
122 EXPECT_TRUE(database.HasOriginPath(kOrigin1)); | |
123 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path)); | |
124 | |
125 // Corrupt the primary origin file. | |
126 base::WriteFile(database.primary_origin_file(), kData.data(), kData.size()); | |
127 | |
128 // Reset the database. | |
129 database.DropDatabase(); | |
130 | |
131 // kOrigin1 is no longer marked as primary, and unfortunately we fail | |
132 // to find the data for the origin. | |
133 EXPECT_FALSE(database.HasOriginPath(kOrigin1)); | |
134 } | |
135 | |
136 TEST(SandboxPrioritizedOriginDatabaseTest, MigrationTest) { | |
137 base::ScopedTempDir dir; | |
138 ASSERT_TRUE(dir.CreateUniqueTempDir()); | |
139 | |
140 const std::string kOrigin1("origin1"); | |
141 const std::string kOrigin2("origin2"); | |
142 const std::string kFakeDirectoryData1("0123456789"); | |
143 const std::string kFakeDirectoryData2("abcde"); | |
144 base::FilePath old_dir_db_path1, old_dir_db_path2; | |
145 base::FilePath path1, path2; | |
146 | |
147 // Initialize the directory with two origins using the regular | |
148 // SandboxOriginDatabase. | |
149 { | |
150 SandboxOriginDatabase database_old(dir.path(), NULL); | |
151 base::FilePath old_db_path = database_old.GetDatabasePath(); | |
152 EXPECT_FALSE(base::PathExists(old_db_path)); | |
153 | |
154 // Initialize paths for kOrigin1 and kOrigin2. | |
155 EXPECT_TRUE(database_old.GetPathForOrigin(kOrigin1, &path1)); | |
156 EXPECT_FALSE(path1.empty()); | |
157 EXPECT_TRUE(database_old.GetPathForOrigin(kOrigin2, &path2)); | |
158 EXPECT_FALSE(path2.empty()); | |
159 | |
160 EXPECT_TRUE(base::DirectoryExists(old_db_path)); | |
161 | |
162 // Populate the origin directory with some fake data. | |
163 old_dir_db_path1 = dir.path().Append(path1); | |
164 ASSERT_TRUE(base::CreateDirectory(old_dir_db_path1)); | |
165 EXPECT_EQ(static_cast<int>(kFakeDirectoryData1.size()), | |
166 base::WriteFile(old_dir_db_path1.AppendASCII("dummy"), | |
167 kFakeDirectoryData1.data(), | |
168 kFakeDirectoryData1.size())); | |
169 old_dir_db_path2 = dir.path().Append(path2); | |
170 ASSERT_TRUE(base::CreateDirectory(old_dir_db_path2)); | |
171 EXPECT_EQ(static_cast<int>(kFakeDirectoryData2.size()), | |
172 base::WriteFile(old_dir_db_path2.AppendASCII("dummy"), | |
173 kFakeDirectoryData2.data(), | |
174 kFakeDirectoryData2.size())); | |
175 } | |
176 | |
177 // Re-open the directory using sandboxPrioritizedOriginDatabase. | |
178 SandboxPrioritizedOriginDatabase database(dir.path(), NULL); | |
179 | |
180 // Set the kOrigin1 as a parimary origin. | |
181 // (Trying to initialize another origin should fail). | |
182 EXPECT_TRUE(database.InitializePrimaryOrigin(kOrigin1)); | |
183 EXPECT_FALSE(database.InitializePrimaryOrigin(kOrigin2)); | |
184 | |
185 EXPECT_EQ(kOrigin1, database.GetPrimaryOrigin()); | |
186 | |
187 // Regardless of whether the origin is registered as primary or not | |
188 // it should just work. | |
189 EXPECT_TRUE(database.HasOriginPath(kOrigin1)); | |
190 EXPECT_TRUE(database.GetPathForOrigin(kOrigin1, &path1)); | |
191 EXPECT_TRUE(database.HasOriginPath(kOrigin2)); | |
192 EXPECT_TRUE(database.GetPathForOrigin(kOrigin2, &path2)); | |
193 | |
194 // The directory content must be kept (or migrated if necessary) as well. | |
195 std::string origin_db_data; | |
196 base::FilePath dir_db_path = dir.path().Append(path1); | |
197 EXPECT_TRUE(base::PathExists(dir_db_path.AppendASCII("dummy"))); | |
198 EXPECT_TRUE(base::ReadFileToString( | |
199 dir_db_path.AppendASCII("dummy"), &origin_db_data)); | |
200 EXPECT_EQ(kFakeDirectoryData1, origin_db_data); | |
201 | |
202 origin_db_data.clear(); | |
203 dir_db_path = dir.path().Append(path2); | |
204 EXPECT_TRUE(base::PathExists(dir_db_path.AppendASCII("dummy"))); | |
205 EXPECT_TRUE(base::ReadFileToString( | |
206 dir_db_path.AppendASCII("dummy"), &origin_db_data)); | |
207 EXPECT_EQ(kFakeDirectoryData2, origin_db_data); | |
208 | |
209 // After the migration the kOrigin1 directory database path must be gone. | |
210 EXPECT_FALSE(base::PathExists(old_dir_db_path1)); | |
211 EXPECT_TRUE(base::PathExists(old_dir_db_path2)); | |
212 } | |
213 | |
214 } // namespace fileapi | |
OLD | NEW |