OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "webkit/fileapi/quota_file_util.h" | 5 #include "webkit/fileapi/quota_file_util.h" |
6 | 6 |
7 #include "base/file_path.h" | 7 #include "base/file_path.h" |
8 #include "base/memory/scoped_callback_factory.h" | 8 #include "base/memory/scoped_callback_factory.h" |
9 #include "base/message_loop_proxy.h" | 9 #include "base/message_loop_proxy.h" |
10 #include "base/platform_file.h" | 10 #include "base/platform_file.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 quota_test_helper_.file_system_context(), NULL); | 35 quota_test_helper_.file_system_context(), NULL); |
36 base_dir_ = obfuscated_test_helper_.GetOriginRootPath(); | 36 base_dir_ = obfuscated_test_helper_.GetOriginRootPath(); |
37 } | 37 } |
38 | 38 |
39 void TearDown() { | 39 void TearDown() { |
40 quota_test_helper_.TearDown(); | 40 quota_test_helper_.TearDown(); |
41 obfuscated_test_helper_.TearDown(); | 41 obfuscated_test_helper_.TearDown(); |
42 } | 42 } |
43 | 43 |
44 protected: | 44 protected: |
45 FileSystemOperationContext* NewContext( | 45 FileSystemOperationContext* NewContext() { |
46 int64 allowed_bytes_growth, | 46 return quota_test_helper_.NewOperationContext(); |
47 const FilePath& src_virtual_path, | |
48 const FilePath& dest_virtual_path) { | |
49 FileSystemOperationContext* context = | |
50 quota_test_helper_.NewOperationContext(); | |
51 context->set_allowed_bytes_growth(allowed_bytes_growth); | |
52 context->set_src_virtual_path(src_virtual_path); | |
53 context->set_dest_virtual_path(dest_virtual_path); | |
54 return context; | |
55 } | 47 } |
56 | 48 |
57 FilePath Path(const std::string& file_name) { | 49 FilePath Path(const std::string& file_name) { |
58 return base_dir_.AppendASCII(file_name); | 50 return base_dir_.AppendASCII(file_name); |
59 } | 51 } |
60 | 52 |
61 int64 ComputeFilePathCost(const char* file_name) { | 53 base::PlatformFileError CreateFile(const char* file_name, |
62 return quota_file_util_->ComputeFilePathCost( | 54 base::PlatformFile* file_handle, bool* created) { |
63 FilePath().AppendASCII(file_name)); | 55 int file_flags = base::PLATFORM_FILE_CREATE | |
| 56 base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_ASYNC; |
| 57 |
| 58 scoped_ptr<FileSystemOperationContext> context(NewContext()); |
| 59 return quota_file_util()->CreateOrOpen( |
| 60 context.get(), Path(file_name), file_flags, file_handle, created); |
64 } | 61 } |
65 | 62 |
66 base::PlatformFileError EnsureFileExists( | 63 base::PlatformFileError EnsureFileExists( |
67 const char* file_name, bool* created) { | 64 const char* file_name, bool* created) { |
68 int64 file_path_cost = ComputeFilePathCost(file_name); | 65 scoped_ptr<FileSystemOperationContext> context(NewContext()); |
69 scoped_ptr<FileSystemOperationContext> context(NewContext( | |
70 file_path_cost, Path(file_name), FilePath())); | |
71 return quota_file_util_->EnsureFileExists( | 66 return quota_file_util_->EnsureFileExists( |
72 context.get(), Path(file_name), created); | 67 context.get(), Path(file_name), created); |
73 } | 68 } |
74 | 69 |
75 base::PlatformFileError Truncate( | |
76 const char* file_name, int64 size, int64 quota) { | |
77 scoped_ptr<FileSystemOperationContext> context(NewContext( | |
78 quota, Path(file_name), FilePath())); | |
79 return quota_file_util_->Truncate( | |
80 context.get(), Path(file_name), size); | |
81 } | |
82 | |
83 void CheckUsage(int64 estimated_content, int64 estimated_path) { | |
84 ASSERT_EQ(estimated_content + estimated_path, | |
85 quota_test_helper().GetCachedOriginUsage()); | |
86 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage() + | |
87 estimated_path, | |
88 quota_test_helper().GetCachedOriginUsage()); | |
89 } | |
90 | |
91 QuotaFileUtil* quota_file_util() const { | 70 QuotaFileUtil* quota_file_util() const { |
92 return quota_file_util_.get(); | 71 return quota_file_util_.get(); |
93 } | 72 } |
94 | 73 |
95 const FileSystemTestOriginHelper& quota_test_helper() const { | 74 const FileSystemTestOriginHelper& quota_test_helper() const { |
96 return quota_test_helper_; | 75 return quota_test_helper_; |
97 } | 76 } |
98 | 77 |
99 private: | 78 private: |
100 ScopedTempDir data_dir_; | 79 ScopedTempDir data_dir_; |
101 FilePath base_dir_; | 80 FilePath base_dir_; |
102 FileSystemTestOriginHelper obfuscated_test_helper_; | 81 FileSystemTestOriginHelper obfuscated_test_helper_; |
103 FileSystemTestOriginHelper quota_test_helper_; | 82 FileSystemTestOriginHelper quota_test_helper_; |
104 scoped_ptr<QuotaFileUtil> quota_file_util_; | 83 scoped_ptr<QuotaFileUtil> quota_file_util_; |
105 base::ScopedCallbackFactory<QuotaFileUtilTest> callback_factory_; | 84 base::ScopedCallbackFactory<QuotaFileUtilTest> callback_factory_; |
106 | 85 |
107 DISALLOW_COPY_AND_ASSIGN(QuotaFileUtilTest); | 86 DISALLOW_COPY_AND_ASSIGN(QuotaFileUtilTest); |
108 }; | 87 }; |
109 | 88 |
110 TEST_F(QuotaFileUtilTest, CreateAndClose) { | 89 TEST_F(QuotaFileUtilTest, CreateAndClose) { |
111 const char *file_name = "test_file"; | 90 const char *file_name = "test_file"; |
112 int64 file_path_cost = ComputeFilePathCost(file_name); | |
113 | |
114 int file_flags = base::PLATFORM_FILE_CREATE | | |
115 base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_ASYNC; | |
116 base::PlatformFile file_handle; | 91 base::PlatformFile file_handle; |
117 bool created; | 92 bool created; |
118 scoped_ptr<FileSystemOperationContext> context; | 93 ASSERT_EQ(base::PLATFORM_FILE_OK, |
119 | 94 CreateFile(file_name, &file_handle, &created)); |
120 created = false; | |
121 context.reset(NewContext(file_path_cost - 1, Path(file_name), FilePath())); | |
122 ASSERT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, quota_file_util()->CreateOrOpen( | |
123 context.get(), Path(file_name), file_flags, &file_handle, &created)); | |
124 ASSERT_FALSE(created); | |
125 | |
126 created = false; | |
127 context.reset(NewContext(file_path_cost, Path(file_name), FilePath())); | |
128 ASSERT_EQ(base::PLATFORM_FILE_OK, quota_file_util()->CreateOrOpen( | |
129 context.get(), Path(file_name), file_flags, &file_handle, &created)); | |
130 ASSERT_TRUE(created); | 95 ASSERT_TRUE(created); |
131 | 96 |
132 context.reset(NewContext(0, FilePath(), FilePath())); | 97 scoped_ptr<FileSystemOperationContext> context(NewContext()); |
133 EXPECT_EQ(base::PLATFORM_FILE_OK, quota_file_util()->Close( | 98 EXPECT_EQ(base::PLATFORM_FILE_OK, |
134 context.get(), file_handle)); | 99 quota_file_util()->Close(context.get(), file_handle)); |
135 } | |
136 | |
137 TEST_F(QuotaFileUtilTest, EnsureFileExists) { | |
138 const char *file_name = "foobar"; | |
139 | |
140 bool created; | |
141 scoped_ptr<FileSystemOperationContext> context; | |
142 | |
143 created = false; | |
144 context.reset(NewContext( | |
145 ComputeFilePathCost(file_name) - 1, Path(file_name), FilePath())); | |
146 ASSERT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, | |
147 quota_file_util()->EnsureFileExists( | |
148 context.get(), Path(file_name), &created)); | |
149 ASSERT_FALSE(created); | |
150 | |
151 created = false; | |
152 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(file_name, &created)); | |
153 ASSERT_TRUE(created); | |
154 | |
155 created = false; | |
156 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(file_name, &created)); | |
157 ASSERT_FALSE(created); | |
158 } | 100 } |
159 | 101 |
160 TEST_F(QuotaFileUtilTest, Truncate) { | 102 TEST_F(QuotaFileUtilTest, Truncate) { |
161 const char *file_name = "truncated"; | 103 const char *file_name = "truncated"; |
162 bool created; | 104 bool created; |
163 | 105 |
164 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(file_name, &created)); | 106 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(file_name, &created)); |
165 ASSERT_TRUE(created); | 107 ASSERT_TRUE(created); |
166 | 108 |
167 scoped_ptr<FileSystemOperationContext> context; | 109 scoped_ptr<FileSystemOperationContext> truncate_context; |
168 | 110 |
169 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(file_name, 1020, 1020)); | 111 truncate_context.reset(NewContext()); |
170 CheckUsage(1020, ComputeFilePathCost(file_name)); | 112 truncate_context->set_allowed_bytes_growth(1020); |
171 | 113 ASSERT_EQ(base::PLATFORM_FILE_OK, |
172 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(file_name, 0, 0)); | 114 quota_file_util()->Truncate(truncate_context.get(), |
173 CheckUsage(0, ComputeFilePathCost(file_name)); | 115 Path(file_name), |
174 | 116 1020)); |
| 117 ASSERT_EQ(1020, quota_test_helper().GetCachedOriginUsage()); |
| 118 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 119 quota_test_helper().GetCachedOriginUsage()); |
| 120 |
| 121 truncate_context.reset(NewContext()); |
| 122 truncate_context->set_allowed_bytes_growth(0); |
| 123 ASSERT_EQ(base::PLATFORM_FILE_OK, |
| 124 quota_file_util()->Truncate(truncate_context.get(), |
| 125 Path(file_name), |
| 126 0)); |
| 127 ASSERT_EQ(0, quota_test_helper().GetCachedOriginUsage()); |
| 128 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 129 quota_test_helper().GetCachedOriginUsage()); |
| 130 |
| 131 truncate_context.reset(NewContext()); |
| 132 truncate_context->set_allowed_bytes_growth(1020); |
| 133 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, |
| 134 quota_file_util()->Truncate(truncate_context.get(), |
| 135 Path(file_name), |
| 136 1021)); |
| 137 ASSERT_EQ(0, quota_test_helper().GetCachedOriginUsage()); |
| 138 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 139 quota_test_helper().GetCachedOriginUsage()); |
| 140 } |
| 141 |
| 142 TEST_F(QuotaFileUtilTest, CopyFile) { |
| 143 const char *from_file = "fromfile"; |
| 144 const char *obstacle_file = "obstaclefile"; |
| 145 const char *to_file1 = "tofile1"; |
| 146 const char *to_file2 = "tofile2"; |
| 147 bool created; |
| 148 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file, &created)); |
| 149 ASSERT_TRUE(created); |
| 150 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(obstacle_file, &created)); |
| 151 ASSERT_TRUE(created); |
| 152 scoped_ptr<FileSystemOperationContext> context; |
| 153 |
| 154 context.reset(NewContext()); |
| 155 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
| 156 ASSERT_EQ(base::PLATFORM_FILE_OK, |
| 157 quota_file_util()->Truncate(context.get(), |
| 158 Path(from_file), |
| 159 1020)); |
| 160 ASSERT_EQ(1020, quota_test_helper().GetCachedOriginUsage()); |
| 161 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 162 quota_test_helper().GetCachedOriginUsage()); |
| 163 |
| 164 context.reset(NewContext()); |
| 165 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
| 166 ASSERT_EQ(base::PLATFORM_FILE_OK, |
| 167 quota_file_util()->Truncate(context.get(), |
| 168 Path(obstacle_file), |
| 169 1)); |
| 170 ASSERT_EQ(1021, quota_test_helper().GetCachedOriginUsage()); |
| 171 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 172 quota_test_helper().GetCachedOriginUsage()); |
| 173 |
| 174 context.reset(NewContext()); |
| 175 context->set_allowed_bytes_growth(1020); |
| 176 ASSERT_EQ(base::PLATFORM_FILE_OK, |
| 177 quota_file_util()->Copy(context.get(), |
| 178 Path(from_file), |
| 179 Path(to_file1))); |
| 180 ASSERT_EQ(2041, quota_test_helper().GetCachedOriginUsage()); |
| 181 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 182 quota_test_helper().GetCachedOriginUsage()); |
| 183 |
| 184 context.reset(NewContext()); |
| 185 context->set_allowed_bytes_growth(1019); |
175 ASSERT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, | 186 ASSERT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, |
176 Truncate(file_name, 1021, 1020)); | |
177 CheckUsage(0, ComputeFilePathCost(file_name)); | |
178 } | |
179 | |
180 TEST_F(QuotaFileUtilTest, CopyFile) { | |
181 int64 file_path_cost = 0; | |
182 const char *from_file = "fromfile"; | |
183 const char *prior_file = "obstaclefile"; | |
184 const char *to_file1 = "tofile1"; | |
185 const char *to_file2 = "tomuchlongerfile2"; | |
186 bool created; | |
187 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file, &created)); | |
188 ASSERT_TRUE(created); | |
189 file_path_cost += ComputeFilePathCost(from_file); | |
190 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(prior_file, &created)); | |
191 ASSERT_TRUE(created); | |
192 file_path_cost += ComputeFilePathCost(prior_file); | |
193 scoped_ptr<FileSystemOperationContext> context; | |
194 | |
195 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(from_file, 1020, 1020)); | |
196 CheckUsage(1020, file_path_cost); | |
197 | |
198 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(prior_file, 1, 1)); | |
199 CheckUsage(1021, file_path_cost); | |
200 | |
201 context.reset(NewContext(1020 + ComputeFilePathCost(to_file1), | |
202 Path(from_file), Path(to_file1))); | |
203 ASSERT_EQ(base::PLATFORM_FILE_OK, quota_file_util()->Copy( | |
204 context.get(), Path(from_file), Path(to_file1))); | |
205 file_path_cost += ComputeFilePathCost(to_file1); | |
206 CheckUsage(2041, file_path_cost); | |
207 | |
208 context.reset(NewContext(1020 + ComputeFilePathCost(to_file2) - 1, | |
209 Path(from_file), Path(to_file2))); | |
210 ASSERT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, | |
211 quota_file_util()->Copy(context.get(), | 187 quota_file_util()->Copy(context.get(), |
212 Path(from_file), | 188 Path(from_file), |
213 Path(to_file2))); | 189 Path(to_file2))); |
214 CheckUsage(2041, file_path_cost); | 190 ASSERT_EQ(2041, quota_test_helper().GetCachedOriginUsage()); |
215 | 191 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
216 context.reset(NewContext(1019, Path(from_file), Path(prior_file))); | 192 quota_test_helper().GetCachedOriginUsage()); |
217 ASSERT_EQ(base::PLATFORM_FILE_OK, | 193 |
218 quota_file_util()->Copy(context.get(), | 194 context.reset(NewContext()); |
219 Path(from_file), | 195 context->set_allowed_bytes_growth(1019); |
220 Path(prior_file))); | 196 ASSERT_EQ(base::PLATFORM_FILE_OK, |
221 CheckUsage(3060, file_path_cost); | 197 quota_file_util()->Copy(context.get(), |
| 198 Path(from_file), |
| 199 Path(obstacle_file))); |
| 200 ASSERT_EQ(3060, quota_test_helper().GetCachedOriginUsage()); |
| 201 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 202 quota_test_helper().GetCachedOriginUsage()); |
222 } | 203 } |
223 | 204 |
224 TEST_F(QuotaFileUtilTest, CopyDirectory) { | 205 TEST_F(QuotaFileUtilTest, CopyDirectory) { |
225 int64 file_path_cost = 0; | |
226 const char *from_dir = "fromdir"; | 206 const char *from_dir = "fromdir"; |
227 const char *from_file1 = "fromdir/fromfile1"; | 207 const char *from_file1 = "fromdir/fromfile1"; |
228 const char *from_file2 = "fromdir/fromlongerfile2"; | 208 const char *from_file2 = "fromdir/fromfile2"; |
229 const char *to_dir1 = "todir1"; | 209 const char *to_dir1 = "todir1"; |
230 const char *to_dir2 = "tolongerdir2"; | 210 const char *to_dir2 = "todir2"; |
231 bool created; | 211 bool created; |
232 scoped_ptr<FileSystemOperationContext> context; | 212 scoped_ptr<FileSystemOperationContext> context; |
233 | 213 |
234 context.reset(NewContext(ComputeFilePathCost(from_dir), | 214 context.reset(NewContext()); |
235 Path(from_dir), FilePath())); | |
236 ASSERT_EQ(base::PLATFORM_FILE_OK, | 215 ASSERT_EQ(base::PLATFORM_FILE_OK, |
237 quota_file_util()->CreateDirectory(context.get(), | 216 quota_file_util()->CreateDirectory(context.get(), |
238 Path(from_dir), | 217 Path(from_dir), |
239 false, false)); | 218 false, false)); |
240 file_path_cost += ComputeFilePathCost(from_dir); | |
241 | |
242 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file1, &created)); | 219 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file1, &created)); |
243 ASSERT_TRUE(created); | 220 ASSERT_TRUE(created); |
244 file_path_cost += ComputeFilePathCost(from_file1); | |
245 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file2, &created)); | 221 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file2, &created)); |
246 ASSERT_TRUE(created); | 222 ASSERT_TRUE(created); |
247 file_path_cost += ComputeFilePathCost(from_file2); | 223 |
248 | 224 context.reset(NewContext()); |
249 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(from_file1, 520, 520)); | 225 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
250 CheckUsage(520, file_path_cost); | 226 ASSERT_EQ(base::PLATFORM_FILE_OK, |
251 | 227 quota_file_util()->Truncate(context.get(), |
252 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(from_file2, 500, 500)); | 228 Path(from_file1), |
253 CheckUsage(1020, file_path_cost); | 229 520)); |
254 | 230 ASSERT_EQ(520, quota_test_helper().GetCachedOriginUsage()); |
255 context.reset(NewContext(1020 + | 231 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
256 ComputeFilePathCost(to_dir1) + | 232 quota_test_helper().GetCachedOriginUsage()); |
257 ComputeFilePathCost(from_file1) + | 233 |
258 ComputeFilePathCost(from_file2), | 234 context.reset(NewContext()); |
259 Path(from_dir), Path(to_dir1))); | 235 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
| 236 ASSERT_EQ(base::PLATFORM_FILE_OK, |
| 237 quota_file_util()->Truncate(context.get(), |
| 238 Path(from_file2), |
| 239 500)); |
| 240 ASSERT_EQ(1020, quota_test_helper().GetCachedOriginUsage()); |
| 241 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 242 quota_test_helper().GetCachedOriginUsage()); |
| 243 |
| 244 context.reset(NewContext()); |
| 245 context->set_allowed_bytes_growth(1020); |
260 ASSERT_EQ(base::PLATFORM_FILE_OK, | 246 ASSERT_EQ(base::PLATFORM_FILE_OK, |
261 quota_file_util()->Copy(context.get(), | 247 quota_file_util()->Copy(context.get(), |
262 Path(from_dir), | 248 Path(from_dir), |
263 Path(to_dir1))); | 249 Path(to_dir1))); |
264 file_path_cost += ComputeFilePathCost(to_dir1) + | 250 ASSERT_EQ(2040, quota_test_helper().GetCachedOriginUsage()); |
265 ComputeFilePathCost(from_file1) + | 251 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
266 ComputeFilePathCost(from_file2); | 252 quota_test_helper().GetCachedOriginUsage()); |
267 CheckUsage(2040, file_path_cost); | 253 |
268 | 254 context.reset(NewContext()); |
269 context.reset(NewContext(1020 + | 255 context->set_allowed_bytes_growth(1019); |
270 ComputeFilePathCost(to_dir2) + | |
271 ComputeFilePathCost(from_file1) + | |
272 ComputeFilePathCost(from_file2) - 1, | |
273 Path(from_dir), Path(to_dir2))); | |
274 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, | 256 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, |
275 quota_file_util()->Copy(context.get(), | 257 quota_file_util()->Copy(context.get(), |
276 Path(from_dir), | 258 Path(from_dir), |
277 Path(to_dir2))); | 259 Path(to_dir2))); |
278 int64 file_path_cost1 = file_path_cost + | 260 ASSERT_TRUE(2540 == quota_test_helper().GetCachedOriginUsage() || |
279 ComputeFilePathCost(to_dir2) + ComputeFilePathCost(from_file1); | 261 2560 == quota_test_helper().GetCachedOriginUsage()); |
280 int64 file_path_cost2 = file_path_cost + | 262 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
281 ComputeFilePathCost(to_dir2) + ComputeFilePathCost(from_file2); | 263 quota_test_helper().GetCachedOriginUsage()); |
282 ASSERT_TRUE((2560 + file_path_cost1) == | |
283 quota_test_helper().GetCachedOriginUsage() || | |
284 (2540 + file_path_cost2) == | |
285 quota_test_helper().GetCachedOriginUsage()); | |
286 ASSERT_TRUE((quota_test_helper().ComputeCurrentOriginUsage() + file_path_cost1 | |
287 == quota_test_helper().GetCachedOriginUsage()) || | |
288 (quota_test_helper().ComputeCurrentOriginUsage() + file_path_cost2 | |
289 == quota_test_helper().GetCachedOriginUsage())); | |
290 } | 264 } |
291 | 265 |
292 TEST_F(QuotaFileUtilTest, MoveFile) { | 266 TEST_F(QuotaFileUtilTest, MoveFile) { |
293 int64 file_path_cost = 0; | |
294 const char *from_file = "fromfile"; | 267 const char *from_file = "fromfile"; |
295 const char *prior_file = "obstaclelongnamefile"; | 268 const char *obstacle_file = "obstaclefile"; |
296 const char *to_file = "tofile"; | 269 const char *to_file = "tofile"; |
297 bool created; | 270 bool created; |
298 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file, &created)); | 271 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file, &created)); |
299 ASSERT_TRUE(created); | 272 ASSERT_TRUE(created); |
300 file_path_cost += ComputeFilePathCost(from_file); | 273 scoped_ptr<FileSystemOperationContext> context; |
301 scoped_ptr<FileSystemOperationContext> context; | 274 |
302 | 275 context.reset(NewContext()); |
303 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(from_file, 1020, 1020)); | 276 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
304 CheckUsage(1020, file_path_cost); | 277 ASSERT_EQ(base::PLATFORM_FILE_OK, |
305 | 278 quota_file_util()->Truncate(context.get(), |
306 context.reset(NewContext(0, Path(from_file), Path(to_file))); | 279 Path(from_file), |
| 280 1020)); |
| 281 ASSERT_EQ(1020, quota_test_helper().GetCachedOriginUsage()); |
| 282 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 283 quota_test_helper().GetCachedOriginUsage()); |
| 284 |
| 285 context.reset(NewContext()); |
| 286 context->set_allowed_bytes_growth(0); |
307 ASSERT_EQ(base::PLATFORM_FILE_OK, | 287 ASSERT_EQ(base::PLATFORM_FILE_OK, |
308 quota_file_util()->Move(context.get(), | 288 quota_file_util()->Move(context.get(), |
309 Path(from_file), | 289 Path(from_file), |
310 Path(to_file))); | 290 Path(to_file))); |
311 file_path_cost -= ComputeFilePathCost(from_file); | 291 ASSERT_EQ(1020, quota_test_helper().GetCachedOriginUsage()); |
312 file_path_cost += ComputeFilePathCost(to_file); | 292 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
313 CheckUsage(1020, file_path_cost); | 293 quota_test_helper().GetCachedOriginUsage()); |
314 | 294 |
315 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file, &created)); | 295 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file, &created)); |
316 ASSERT_TRUE(created); | 296 ASSERT_TRUE(created); |
317 file_path_cost += ComputeFilePathCost(from_file); | 297 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(obstacle_file, &created)); |
318 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(prior_file, &created)); | 298 ASSERT_TRUE(created); |
319 ASSERT_TRUE(created); | 299 |
320 file_path_cost += ComputeFilePathCost(prior_file); | 300 context.reset(NewContext()); |
321 | 301 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
322 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(from_file, 1020, 1020)); | 302 ASSERT_EQ(base::PLATFORM_FILE_OK, |
323 CheckUsage(2040, file_path_cost); | 303 quota_file_util()->Truncate(context.get(), |
324 | 304 Path(from_file), |
325 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(prior_file, 1, 1)); | 305 1020)); |
326 CheckUsage(2041, file_path_cost); | 306 ASSERT_EQ(2040, quota_test_helper().GetCachedOriginUsage()); |
327 | 307 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
328 context.reset(NewContext(ComputeFilePathCost(prior_file) - | 308 quota_test_helper().GetCachedOriginUsage()); |
329 ComputeFilePathCost(from_file) - 1 - 1, | 309 |
330 Path(from_file), Path(prior_file))); | 310 context.reset(NewContext()); |
331 ASSERT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, | 311 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
332 quota_file_util()->Move(context.get(), | 312 ASSERT_EQ(base::PLATFORM_FILE_OK, |
333 Path(from_file), | 313 quota_file_util()->Truncate(context.get(), |
334 Path(prior_file))); | 314 Path(obstacle_file), |
335 CheckUsage(2041, file_path_cost); | 315 1)); |
336 | 316 ASSERT_EQ(2041, quota_test_helper().GetCachedOriginUsage()); |
337 context.reset(NewContext(ComputeFilePathCost(prior_file) - | 317 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
338 ComputeFilePathCost(from_file) - 1, | 318 quota_test_helper().GetCachedOriginUsage()); |
339 Path(from_file), Path(prior_file))); | 319 |
340 ASSERT_EQ(base::PLATFORM_FILE_OK, | 320 context.reset(NewContext()); |
341 quota_file_util()->Move(context.get(), | 321 context->set_allowed_bytes_growth(0); |
342 Path(from_file), | 322 ASSERT_EQ(base::PLATFORM_FILE_OK, |
343 Path(prior_file))); | 323 quota_file_util()->Move(context.get(), |
344 file_path_cost -= ComputeFilePathCost(from_file); | 324 Path(from_file), |
345 file_path_cost += ComputeFilePathCost(prior_file); | 325 Path(obstacle_file))); |
346 CheckUsage(2040, file_path_cost); | 326 ASSERT_EQ(2040, quota_test_helper().GetCachedOriginUsage()); |
| 327 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 328 quota_test_helper().GetCachedOriginUsage()); |
347 } | 329 } |
348 | 330 |
349 TEST_F(QuotaFileUtilTest, MoveDirectory) { | 331 TEST_F(QuotaFileUtilTest, MoveDirectory) { |
350 int64 file_path_cost = 0; | |
351 const char *from_dir = "fromdir"; | 332 const char *from_dir = "fromdir"; |
352 const char *from_file = "fromdir/fromfile"; | 333 const char *from_file = "fromdir/fromfile"; |
353 const char *to_dir1 = "todir1"; | 334 const char *to_dir1 = "todir1"; |
354 const char *to_dir2 = "tolongnamedir2"; | 335 const char *to_dir2 = "todir2"; |
355 bool created; | 336 bool created; |
356 scoped_ptr<FileSystemOperationContext> context; | 337 scoped_ptr<FileSystemOperationContext> context; |
357 | 338 |
358 context.reset(NewContext(QuotaFileUtil::kNoLimit, | 339 context.reset(NewContext()); |
359 Path(from_dir), FilePath())); | |
360 ASSERT_EQ(base::PLATFORM_FILE_OK, | 340 ASSERT_EQ(base::PLATFORM_FILE_OK, |
361 quota_file_util()->CreateDirectory(context.get(), | 341 quota_file_util()->CreateDirectory(context.get(), |
362 Path(from_dir), | 342 Path(from_dir), |
363 false, false)); | 343 false, false)); |
364 file_path_cost += ComputeFilePathCost(from_dir); | 344 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file, &created)); |
365 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file, &created)); | 345 ASSERT_TRUE(created); |
366 ASSERT_TRUE(created); | 346 |
367 file_path_cost += ComputeFilePathCost(from_file); | 347 context.reset(NewContext()); |
368 | 348 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
369 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(from_file, 1020, 1020)); | 349 ASSERT_EQ(base::PLATFORM_FILE_OK, |
370 CheckUsage(1020, file_path_cost); | 350 quota_file_util()->Truncate(context.get(), |
371 | 351 Path(from_file), |
372 context.reset(NewContext(1020, Path(from_dir), Path(to_dir1))); | 352 1020)); |
| 353 ASSERT_EQ(1020, quota_test_helper().GetCachedOriginUsage()); |
| 354 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 355 quota_test_helper().GetCachedOriginUsage()); |
| 356 |
| 357 context.reset(NewContext()); |
| 358 context->set_allowed_bytes_growth(1020); |
373 ASSERT_EQ(base::PLATFORM_FILE_OK, | 359 ASSERT_EQ(base::PLATFORM_FILE_OK, |
374 quota_file_util()->Move(context.get(), | 360 quota_file_util()->Move(context.get(), |
375 Path(from_dir), | 361 Path(from_dir), |
376 Path(to_dir1))); | 362 Path(to_dir1))); |
377 file_path_cost -= ComputeFilePathCost(from_dir); | 363 ASSERT_EQ(1020, quota_test_helper().GetCachedOriginUsage()); |
378 file_path_cost += ComputeFilePathCost(to_dir1); | 364 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
379 CheckUsage(1020, file_path_cost); | 365 quota_test_helper().GetCachedOriginUsage()); |
380 | 366 |
381 context.reset(NewContext(QuotaFileUtil::kNoLimit, | 367 context.reset(NewContext()); |
382 Path(from_dir), FilePath())); | |
383 ASSERT_EQ(base::PLATFORM_FILE_OK, | 368 ASSERT_EQ(base::PLATFORM_FILE_OK, |
384 quota_file_util()->CreateDirectory(context.get(), | 369 quota_file_util()->CreateDirectory(context.get(), |
385 Path(from_dir), | 370 Path(from_dir), |
386 false, false)); | 371 false, false)); |
387 file_path_cost += ComputeFilePathCost(from_dir); | 372 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file, &created)); |
388 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(from_file, &created)); | 373 ASSERT_TRUE(created); |
389 ASSERT_TRUE(created); | 374 |
390 file_path_cost += ComputeFilePathCost(from_file); | 375 context.reset(NewContext()); |
391 | 376 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
392 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(from_file, 1020, 1020)); | 377 ASSERT_EQ(base::PLATFORM_FILE_OK, |
393 CheckUsage(2040, file_path_cost); | 378 quota_file_util()->Truncate(context.get(), |
394 | 379 Path(from_file), |
395 context.reset(NewContext(1019, Path(from_dir), Path(to_dir2))); | 380 1020)); |
| 381 ASSERT_EQ(2040, quota_test_helper().GetCachedOriginUsage()); |
| 382 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 383 quota_test_helper().GetCachedOriginUsage()); |
| 384 |
| 385 context.reset(NewContext()); |
| 386 context->set_allowed_bytes_growth(1019); |
396 EXPECT_EQ(base::PLATFORM_FILE_OK, | 387 EXPECT_EQ(base::PLATFORM_FILE_OK, |
397 quota_file_util()->Move(context.get(), | 388 quota_file_util()->Move(context.get(), |
398 Path(from_dir), | 389 Path(from_dir), |
399 Path(to_dir2))); | 390 Path(to_dir2))); |
400 file_path_cost -= ComputeFilePathCost(from_dir); | 391 ASSERT_EQ(2040, quota_test_helper().GetCachedOriginUsage()); |
401 file_path_cost += ComputeFilePathCost(to_dir2); | 392 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
402 CheckUsage(2040, file_path_cost); | 393 quota_test_helper().GetCachedOriginUsage()); |
403 } | 394 } |
404 | 395 |
405 TEST_F(QuotaFileUtilTest, Remove) { | 396 TEST_F(QuotaFileUtilTest, Remove) { |
406 int64 file_path_cost = 0; | |
407 const char *dir = "dir"; | 397 const char *dir = "dir"; |
408 const char *file = "file"; | 398 const char *file = "file"; |
409 const char *dfile1 = "dir/dfile1"; | 399 const char *dfile1 = "dir/dfile1"; |
410 const char *dfile2 = "dir/dfile2"; | 400 const char *dfile2 = "dir/dfile2"; |
411 bool created; | 401 bool created; |
412 scoped_ptr<FileSystemOperationContext> context; | 402 scoped_ptr<FileSystemOperationContext> context; |
413 | 403 |
414 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(file, &created)); | 404 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(file, &created)); |
415 ASSERT_TRUE(created); | 405 ASSERT_TRUE(created); |
416 file_path_cost += ComputeFilePathCost(file); | 406 context.reset(NewContext()); |
417 context.reset(NewContext(QuotaFileUtil::kNoLimit, Path(dir), FilePath())); | |
418 ASSERT_EQ(base::PLATFORM_FILE_OK, | 407 ASSERT_EQ(base::PLATFORM_FILE_OK, |
419 quota_file_util()->CreateDirectory(context.get(), | 408 quota_file_util()->CreateDirectory(context.get(), |
420 Path(dir), | 409 Path(dir), |
421 false, false)); | 410 false, false)); |
422 file_path_cost += ComputeFilePathCost(dir); | |
423 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(dfile1, &created)); | 411 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(dfile1, &created)); |
424 ASSERT_TRUE(created); | 412 ASSERT_TRUE(created); |
425 file_path_cost += ComputeFilePathCost(dfile1); | |
426 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(dfile2, &created)); | 413 ASSERT_EQ(base::PLATFORM_FILE_OK, EnsureFileExists(dfile2, &created)); |
427 ASSERT_TRUE(created); | 414 ASSERT_TRUE(created); |
428 file_path_cost += ComputeFilePathCost(dfile2); | |
429 | 415 |
430 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(file, 340, 340)); | 416 context.reset(NewContext()); |
431 CheckUsage(340, file_path_cost); | 417 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
| 418 ASSERT_EQ(base::PLATFORM_FILE_OK, |
| 419 quota_file_util()->Truncate(context.get(), |
| 420 Path(file), |
| 421 340)); |
| 422 ASSERT_EQ(340, quota_test_helper().GetCachedOriginUsage()); |
| 423 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 424 quota_test_helper().GetCachedOriginUsage()); |
432 | 425 |
433 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(dfile1, 1020, 1020)); | 426 context.reset(NewContext()); |
434 CheckUsage(1360, file_path_cost); | 427 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
| 428 ASSERT_EQ(base::PLATFORM_FILE_OK, |
| 429 quota_file_util()->Truncate(context.get(), |
| 430 Path(dfile1), |
| 431 1020)); |
| 432 ASSERT_EQ(1360, quota_test_helper().GetCachedOriginUsage()); |
| 433 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 434 quota_test_helper().GetCachedOriginUsage()); |
435 | 435 |
436 ASSERT_EQ(base::PLATFORM_FILE_OK, Truncate(dfile2, 120, 120)); | 436 context.reset(NewContext()); |
437 CheckUsage(1480, file_path_cost); | 437 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
| 438 ASSERT_EQ(base::PLATFORM_FILE_OK, |
| 439 quota_file_util()->Truncate(context.get(), |
| 440 Path(dfile2), |
| 441 120)); |
| 442 ASSERT_EQ(1480, quota_test_helper().GetCachedOriginUsage()); |
| 443 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 444 quota_test_helper().GetCachedOriginUsage()); |
438 | 445 |
439 context.reset(NewContext(QuotaFileUtil::kNoLimit, Path(file), FilePath())); | 446 context.reset(NewContext()); |
| 447 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
440 ASSERT_EQ(base::PLATFORM_FILE_OK, | 448 ASSERT_EQ(base::PLATFORM_FILE_OK, |
441 quota_file_util()->Delete(context.get(), | 449 quota_file_util()->Delete(context.get(), |
442 Path(file), | 450 Path(file), |
443 false)); | 451 false)); |
444 file_path_cost -= ComputeFilePathCost(file); | 452 ASSERT_EQ(1140, quota_test_helper().GetCachedOriginUsage()); |
445 CheckUsage(1140, file_path_cost); | 453 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 454 quota_test_helper().GetCachedOriginUsage()); |
446 | 455 |
447 context.reset(NewContext(QuotaFileUtil::kNoLimit, Path(dir), FilePath())); | 456 context.reset(NewContext()); |
| 457 context->set_allowed_bytes_growth(QuotaFileUtil::kNoLimit); |
448 ASSERT_EQ(base::PLATFORM_FILE_OK, | 458 ASSERT_EQ(base::PLATFORM_FILE_OK, |
449 quota_file_util()->Delete(context.get(), | 459 quota_file_util()->Delete(context.get(), |
450 Path(dir), | 460 Path(dir), |
451 true)); | 461 true)); |
452 file_path_cost = 0; | 462 ASSERT_EQ(0, quota_test_helper().GetCachedOriginUsage()); |
453 CheckUsage(0, 0); | 463 ASSERT_EQ(quota_test_helper().ComputeCurrentOriginUsage(), |
| 464 quota_test_helper().GetCachedOriginUsage()); |
454 } | 465 } |
455 | 466 |
456 } // namespace fileapi | 467 } // namespace fileapi |
OLD | NEW |