| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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/browser/fileapi/quota/quota_reservation_manager.h" | 5 #include "webkit/browser/fileapi/quota/quota_reservation_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 // For each open file for write, the client should create OpenFileHandle | 172 // For each open file for write, the client should create OpenFileHandle |
| 173 // object. | 173 // object. |
| 174 // It's OK to create multiple OpenFileHandle for single file. | 174 // It's OK to create multiple OpenFileHandle for single file. |
| 175 scoped_ptr<OpenFileHandle> open_file = | 175 scoped_ptr<OpenFileHandle> open_file = |
| 176 reservation->GetOpenFileHandle(file_path()); | 176 reservation->GetOpenFileHandle(file_path()); |
| 177 | 177 |
| 178 // Before reserved quota ran out, the client can perform any number of | 178 // Before reserved quota ran out, the client can perform any number of |
| 179 // operation for the file. | 179 // operation for the file. |
| 180 // The client should calculate how much quota is consumed by itself. | 180 // The client should calculate how much quota is consumed by itself. |
| 181 int64 remaining_quota = reservation->remaining_quota(); | 181 int64 remaining_quota = reservation->remaining_quota(); |
| 182 int64 base_file_size = open_file->base_file_size(); | 182 int64 base_file_size = open_file->GetEstimatedFileSize(); |
| 183 int64 max_written_offset = base_file_size; | 183 int64 max_written_offset = base_file_size; |
| 184 ExtendFileTo(90); | 184 ExtendFileTo(90); |
| 185 max_written_offset = 90; | 185 max_written_offset = 90; |
| 186 remaining_quota -= max_written_offset - base_file_size; | 186 remaining_quota -= max_written_offset - base_file_size; |
| 187 | 187 |
| 188 // When the reserved quota ran out, the client can request quota refresh | 188 // When the reserved quota ran out, the client can request quota refresh |
| 189 // through Reservation. Before requesting another portion of quota, the | 189 // through Reservation. Before requesting another portion of quota, the |
| 190 // client should report maximum written offset for each modified files. | 190 // client should report maximum written offset for each modified files. |
| 191 open_file->UpdateMaxWrittenOffset(max_written_offset); | 191 open_file->UpdateMaxWrittenOffset(max_written_offset); |
| 192 EXPECT_EQ(remaining_quota, reservation->remaining_quota()); | 192 EXPECT_EQ(remaining_quota, reservation->remaining_quota()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 218 EXPECT_EQ(100, reservation->remaining_quota()); | 218 EXPECT_EQ(100, reservation->remaining_quota()); |
| 219 | 219 |
| 220 { | 220 { |
| 221 scoped_ptr<OpenFileHandle> open_file1 = | 221 scoped_ptr<OpenFileHandle> open_file1 = |
| 222 reservation->GetOpenFileHandle(file_path()); | 222 reservation->GetOpenFileHandle(file_path()); |
| 223 scoped_ptr<OpenFileHandle> open_file2 = | 223 scoped_ptr<OpenFileHandle> open_file2 = |
| 224 reservation->GetOpenFileHandle(file_path()); | 224 reservation->GetOpenFileHandle(file_path()); |
| 225 | 225 |
| 226 int64 remaining_quota = reservation->remaining_quota(); | 226 int64 remaining_quota = reservation->remaining_quota(); |
| 227 | 227 |
| 228 int64 base_file_size_for_file1 = open_file1->base_file_size(); | 228 int64 base_file_size_for_file1 = open_file1->GetEstimatedFileSize(); |
| 229 int64 max_written_offset_for_file1 = base_file_size_for_file1; | 229 int64 max_written_offset_for_file1 = base_file_size_for_file1; |
| 230 | 230 |
| 231 int64 base_file_size_for_file2 = open_file2->base_file_size(); | 231 int64 base_file_size_for_file2 = open_file2->GetEstimatedFileSize(); |
| 232 int64 max_written_offset_for_file2 = base_file_size_for_file2; | 232 int64 max_written_offset_for_file2 = base_file_size_for_file2; |
| 233 | 233 |
| 234 // Each writer should maintain max_written_offset and base_file_size | 234 // Each writer should maintain max_written_offset and base_file_size |
| 235 // independently even if there are multiple writers for the same file. | 235 // independently even if there are multiple writers for the same file. |
| 236 max_written_offset_for_file1 = 50; | 236 max_written_offset_for_file1 = 50; |
| 237 ExtendFileTo(max_written_offset_for_file1); | 237 ExtendFileTo(max_written_offset_for_file1); |
| 238 remaining_quota -= max_written_offset_for_file1 - base_file_size_for_file1; | 238 remaining_quota -= max_written_offset_for_file1 - base_file_size_for_file1; |
| 239 base_file_size_for_file1 = max_written_offset_for_file1; | 239 base_file_size_for_file1 = max_written_offset_for_file1; |
| 240 | 240 |
| 241 max_written_offset_for_file2 = 90; | 241 max_written_offset_for_file2 = 90; |
| 242 ExtendFileTo(max_written_offset_for_file2); | 242 ExtendFileTo(max_written_offset_for_file2); |
| 243 remaining_quota -= max_written_offset_for_file2 - base_file_size_for_file2; | 243 remaining_quota -= max_written_offset_for_file2 - base_file_size_for_file2; |
| 244 base_file_size_for_file2 = max_written_offset_for_file2; | 244 base_file_size_for_file2 = max_written_offset_for_file2; |
| 245 | 245 |
| 246 // Before requesting quota refresh, each writer should report their | 246 // Before requesting quota refresh, each writer should report their |
| 247 // maximum_written_offset. UpdateMaxWrittenOffset returns updated | 247 // maximum_written_offset. UpdateMaxWrittenOffset returns updated |
| 248 // base_file_size that the writer should calculate quota consumption based | 248 // base_file_size that the writer should calculate quota consumption based |
| 249 // on that. | 249 // on that. |
| 250 base_file_size_for_file1 = | 250 open_file1->UpdateMaxWrittenOffset(max_written_offset_for_file1); |
| 251 open_file1->UpdateMaxWrittenOffset(max_written_offset_for_file1); | 251 base_file_size_for_file1 = open_file1->GetEstimatedFileSize(); |
| 252 max_written_offset_for_file1 = base_file_size_for_file1; | 252 max_written_offset_for_file1 = base_file_size_for_file1; |
| 253 EXPECT_EQ(100 - (50 - kInitialFileSize), reservation->remaining_quota()); | 253 EXPECT_EQ(100 - (50 - kInitialFileSize), reservation->remaining_quota()); |
| 254 | 254 |
| 255 base_file_size_for_file2 = | 255 open_file2->UpdateMaxWrittenOffset(max_written_offset_for_file2); |
| 256 open_file2->UpdateMaxWrittenOffset(max_written_offset_for_file2); | 256 base_file_size_for_file2 = open_file2->GetEstimatedFileSize(); |
| 257 max_written_offset_for_file2 = base_file_size_for_file2; | 257 max_written_offset_for_file2 = base_file_size_for_file2; |
| 258 EXPECT_EQ(100 - (50 - kInitialFileSize) - (90 - 50), | 258 EXPECT_EQ(100 - (50 - kInitialFileSize) - (90 - 50), |
| 259 reservation->remaining_quota()); | 259 reservation->remaining_quota()); |
| 260 | 260 |
| 261 RefreshQuota(reservation, 100); | 261 RefreshQuota(reservation, 100); |
| 262 EXPECT_EQ(100, reservation->remaining_quota()); | 262 EXPECT_EQ(100, reservation->remaining_quota()); |
| 263 } | 263 } |
| 264 | 264 |
| 265 EXPECT_EQ(90, GetFileSize()); | 265 EXPECT_EQ(90, GetFileSize()); |
| 266 EXPECT_EQ(100, fake_backend()->on_memory_usage()); | 266 EXPECT_EQ(100, fake_backend()->on_memory_usage()); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 290 EXPECT_EQ(500, reservation2->remaining_quota()); | 290 EXPECT_EQ(500, reservation2->remaining_quota()); |
| 291 | 291 |
| 292 // Attach a file to both of two reservations. | 292 // Attach a file to both of two reservations. |
| 293 scoped_ptr<OpenFileHandle> open_file1 = | 293 scoped_ptr<OpenFileHandle> open_file1 = |
| 294 reservation1->GetOpenFileHandle(file_path()); | 294 reservation1->GetOpenFileHandle(file_path()); |
| 295 scoped_ptr<OpenFileHandle> open_file2 = | 295 scoped_ptr<OpenFileHandle> open_file2 = |
| 296 reservation2->GetOpenFileHandle(file_path()); | 296 reservation2->GetOpenFileHandle(file_path()); |
| 297 | 297 |
| 298 // Each client should manage reserved quota and its consumption separately. | 298 // Each client should manage reserved quota and its consumption separately. |
| 299 int64 remaining_quota1 = reservation1->remaining_quota(); | 299 int64 remaining_quota1 = reservation1->remaining_quota(); |
| 300 int64 base_file_size1 = open_file1->base_file_size(); | 300 int64 base_file_size1 = open_file1->GetEstimatedFileSize(); |
| 301 int64 max_written_offset1 = base_file_size1; | 301 int64 max_written_offset1 = base_file_size1; |
| 302 | 302 |
| 303 int64 remaining_quota2 = reservation2->remaining_quota(); | 303 int64 remaining_quota2 = reservation2->remaining_quota(); |
| 304 int64 base_file_size2 = open_file2->base_file_size(); | 304 int64 base_file_size2 = open_file2->GetEstimatedFileSize(); |
| 305 int64 max_written_offset2 = base_file_size2; | 305 int64 max_written_offset2 = base_file_size2; |
| 306 | 306 |
| 307 max_written_offset1 = 50; | 307 max_written_offset1 = 50; |
| 308 remaining_quota1 -= max_written_offset1 - base_file_size1; | 308 remaining_quota1 -= max_written_offset1 - base_file_size1; |
| 309 base_file_size1 = max_written_offset1; | 309 base_file_size1 = max_written_offset1; |
| 310 ExtendFileTo(max_written_offset1); | 310 ExtendFileTo(max_written_offset1); |
| 311 | 311 |
| 312 max_written_offset2 = 400; | 312 max_written_offset2 = 400; |
| 313 remaining_quota2 -= max_written_offset2 - base_file_size2; | 313 remaining_quota2 -= max_written_offset2 - base_file_size2; |
| 314 base_file_size2 = max_written_offset2; | 314 base_file_size2 = max_written_offset2; |
| 315 ExtendFileTo(max_written_offset2); | 315 ExtendFileTo(max_written_offset2); |
| 316 | 316 |
| 317 // For multiple Reservation case, RefreshQuota needs usage report only from | 317 // For multiple Reservation case, RefreshQuota needs usage report only from |
| 318 // associated OpenFile's. | 318 // associated OpenFile's. |
| 319 base_file_size1 = | 319 open_file1->UpdateMaxWrittenOffset(max_written_offset1); |
| 320 open_file1->UpdateMaxWrittenOffset(max_written_offset1); | 320 base_file_size1 = open_file1->GetEstimatedFileSize(); |
| 321 max_written_offset1 = base_file_size1; | 321 max_written_offset1 = base_file_size1; |
| 322 EXPECT_EQ(100 - (50 - kInitialFileSize), reservation1->remaining_quota()); | 322 EXPECT_EQ(100 - (50 - kInitialFileSize), reservation1->remaining_quota()); |
| 323 | 323 |
| 324 RefreshQuota(reservation1, 200); | 324 RefreshQuota(reservation1, 200); |
| 325 EXPECT_EQ(200, reservation1->remaining_quota()); | 325 EXPECT_EQ(200, reservation1->remaining_quota()); |
| 326 | 326 |
| 327 base_file_size2 = | 327 open_file2->UpdateMaxWrittenOffset(max_written_offset2); |
| 328 open_file2->UpdateMaxWrittenOffset(max_written_offset2); | 328 base_file_size2 = open_file2->GetEstimatedFileSize(); |
| 329 max_written_offset2 = base_file_size2; | 329 max_written_offset2 = base_file_size2; |
| 330 EXPECT_EQ(500 - (400 - 50), reservation2->remaining_quota()); | 330 EXPECT_EQ(500 - (400 - 50), reservation2->remaining_quota()); |
| 331 | 331 |
| 332 RefreshQuota(reservation2, 150); | 332 RefreshQuota(reservation2, 150); |
| 333 EXPECT_EQ(150, reservation2->remaining_quota()); | 333 EXPECT_EQ(150, reservation2->remaining_quota()); |
| 334 | 334 |
| 335 open_file1.reset(); | 335 open_file1.reset(); |
| 336 open_file2.reset(); | 336 open_file2.reset(); |
| 337 | 337 |
| 338 EXPECT_EQ(400, GetFileSize()); | 338 EXPECT_EQ(400, GetFileSize()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 349 | 349 |
| 350 EXPECT_EQ(400, GetFileSize()); | 350 EXPECT_EQ(400, GetFileSize()); |
| 351 EXPECT_EQ(0, fake_backend()->on_memory_usage()); | 351 EXPECT_EQ(0, fake_backend()->on_memory_usage()); |
| 352 EXPECT_EQ(400 - kInitialFileSize, fake_backend()->on_disk_usage()); | 352 EXPECT_EQ(400 - kInitialFileSize, fake_backend()->on_disk_usage()); |
| 353 } | 353 } |
| 354 | 354 |
| 355 // TODO(tzik): Add Truncate test. | 355 // TODO(tzik): Add Truncate test. |
| 356 // TODO(tzik): Add PluginCrash test and DropReservationManager test. | 356 // TODO(tzik): Add PluginCrash test and DropReservationManager test. |
| 357 | 357 |
| 358 } // namespace fileapi | 358 } // namespace fileapi |
| OLD | NEW |