Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 "net/http/mock_http_cache.h" | 5 #include "net/http/mock_http_cache.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "net/base/completion_callback.h" | 9 #include "net/base/completion_callback.h" |
| 10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 43 } // namespace | 43 } // namespace |
| 44 | 44 |
| 45 //----------------------------------------------------------------------------- | 45 //----------------------------------------------------------------------------- |
| 46 | 46 |
| 47 struct MockDiskEntry::CallbackInfo { | 47 struct MockDiskEntry::CallbackInfo { |
| 48 scoped_refptr<MockDiskEntry> entry; | 48 scoped_refptr<MockDiskEntry> entry; |
| 49 net::CompletionCallback callback; | 49 net::CompletionCallback callback; |
| 50 int result; | 50 int result; |
| 51 }; | 51 }; |
| 52 | 52 |
| 53 MockDiskEntry::MockDiskEntry() | 53 MockDiskEntry::MockDiskEntry(MockDiskCache* backend, const std::string& key) |
| 54 : test_mode_(0), doomed_(false), sparse_(false), | |
| 55 fail_requests_(false), busy_(false), delayed_(false) { | |
| 56 } | |
| 57 | |
| 58 MockDiskEntry::MockDiskEntry(const std::string& key) | |
| 59 : key_(key), doomed_(false), sparse_(false), | 54 : key_(key), doomed_(false), sparse_(false), |
| 60 fail_requests_(false), busy_(false), delayed_(false) { | 55 fail_requests_(false), busy_(false), delayed_(false), backend_(backend) { |
| 61 test_mode_ = GetTestModeForEntry(key); | 56 test_mode_ = GetTestModeForEntry(key); |
| 57 DCHECK(backend); | |
| 62 } | 58 } |
| 63 | 59 |
| 64 void MockDiskEntry::Doom() { | 60 void MockDiskEntry::Doom() { |
| 65 doomed_ = true; | 61 doomed_ = true; |
| 66 } | 62 } |
| 67 | 63 |
| 68 void MockDiskEntry::Close() { | 64 void MockDiskEntry::Close() { |
| 69 Release(); | 65 Release(); |
| 70 } | 66 } |
| 71 | 67 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 132 if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_WRITE) | 128 if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_WRITE) |
| 133 return buf_len; | 129 return buf_len; |
| 134 | 130 |
| 135 CallbackLater(callback, buf_len); | 131 CallbackLater(callback, buf_len); |
| 136 return net::ERR_IO_PENDING; | 132 return net::ERR_IO_PENDING; |
| 137 } | 133 } |
| 138 | 134 |
| 139 int MockDiskEntry::ReadSparseData(int64 offset, net::IOBuffer* buf, int buf_len, | 135 int MockDiskEntry::ReadSparseData(int64 offset, net::IOBuffer* buf, int buf_len, |
| 140 const net::CompletionCallback& callback) { | 136 const net::CompletionCallback& callback) { |
| 141 DCHECK(!callback.is_null()); | 137 DCHECK(!callback.is_null()); |
| 138 backend_->NotifySparseIO(); | |
|
rvargas (doing something else)
2013/08/28 21:35:47
This is slightly problematic because the contract
pasko
2013/08/28 21:56:28
I did not quite understand this sentence, can you
rvargas (doing something else)
2013/08/28 22:33:40
The thing is that it is possible (valid, and used)
| |
| 139 if (fail_sparse_requests_) | |
| 140 return net::ERR_NOT_IMPLEMENTED; | |
| 142 if (!sparse_ || busy_) | 141 if (!sparse_ || busy_) |
| 143 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; | 142 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; |
| 144 if (offset < 0) | 143 if (offset < 0) |
| 145 return net::ERR_FAILED; | 144 return net::ERR_FAILED; |
| 146 | 145 |
| 147 if (fail_requests_) | 146 if (fail_requests_) |
| 148 return net::ERR_CACHE_READ_FAILURE; | 147 return net::ERR_CACHE_READ_FAILURE; |
| 149 | 148 |
| 150 DCHECK(offset < kint32max); | 149 DCHECK(offset < kint32max); |
| 151 int real_offset = static_cast<int>(offset); | 150 int real_offset = static_cast<int>(offset); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 162 CallbackLater(callback, num); | 161 CallbackLater(callback, num); |
| 163 busy_ = true; | 162 busy_ = true; |
| 164 delayed_ = false; | 163 delayed_ = false; |
| 165 return net::ERR_IO_PENDING; | 164 return net::ERR_IO_PENDING; |
| 166 } | 165 } |
| 167 | 166 |
| 168 int MockDiskEntry::WriteSparseData(int64 offset, net::IOBuffer* buf, | 167 int MockDiskEntry::WriteSparseData(int64 offset, net::IOBuffer* buf, |
| 169 int buf_len, | 168 int buf_len, |
| 170 const net::CompletionCallback& callback) { | 169 const net::CompletionCallback& callback) { |
| 171 DCHECK(!callback.is_null()); | 170 DCHECK(!callback.is_null()); |
| 171 backend_->NotifySparseIO(); | |
| 172 if (fail_sparse_requests_) | |
| 173 return net::ERR_NOT_IMPLEMENTED; | |
| 172 if (busy_) | 174 if (busy_) |
| 173 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; | 175 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; |
| 174 if (!sparse_) { | 176 if (!sparse_) { |
| 175 if (data_[1].size()) | 177 if (data_[1].size()) |
| 176 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; | 178 return net::ERR_CACHE_OPERATION_NOT_SUPPORTED; |
| 177 sparse_ = true; | 179 sparse_ = true; |
| 178 } | 180 } |
| 179 if (offset < 0) | 181 if (offset < 0) |
| 180 return net::ERR_FAILED; | 182 return net::ERR_FAILED; |
| 181 if (!buf_len) | 183 if (!buf_len) |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 230 } | 232 } |
| 231 } | 233 } |
| 232 if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_WRITE) | 234 if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_WRITE) |
| 233 return count; | 235 return count; |
| 234 | 236 |
| 235 CallbackLater(callback, count); | 237 CallbackLater(callback, count); |
| 236 return net::ERR_IO_PENDING; | 238 return net::ERR_IO_PENDING; |
| 237 } | 239 } |
| 238 | 240 |
| 239 bool MockDiskEntry::CouldBeSparse() const { | 241 bool MockDiskEntry::CouldBeSparse() const { |
| 242 backend_->NotifySparseIO(); | |
| 243 if (fail_sparse_requests_) | |
| 244 return false; | |
| 240 return sparse_; | 245 return sparse_; |
| 241 } | 246 } |
| 242 | 247 |
| 243 void MockDiskEntry::CancelSparseIO() { | 248 void MockDiskEntry::CancelSparseIO() { |
| 249 backend_->NotifySparseIO(); | |
| 244 cancel_ = true; | 250 cancel_ = true; |
| 245 } | 251 } |
| 246 | 252 |
| 247 int MockDiskEntry::ReadyForSparseIO(const net::CompletionCallback& callback) { | 253 int MockDiskEntry::ReadyForSparseIO(const net::CompletionCallback& callback) { |
| 254 backend_->NotifySparseIO(); | |
| 255 if (fail_sparse_requests_) | |
| 256 return net::ERR_NOT_IMPLEMENTED; | |
| 248 if (!cancel_) | 257 if (!cancel_) |
| 249 return net::OK; | 258 return net::OK; |
| 250 | 259 |
| 251 cancel_ = false; | 260 cancel_ = false; |
| 252 DCHECK(!callback.is_null()); | 261 DCHECK(!callback.is_null()); |
| 253 if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_READ) | 262 if (MockHttpCache::GetTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_READ) |
| 254 return net::OK; | 263 return net::OK; |
| 255 | 264 |
| 256 // The pending operation is already in the message loop (and hopefully | 265 // The pending operation is already in the message loop (and hopefully |
| 257 // already in the second pass). Just notify the caller that it finished. | 266 // already in the second pass). Just notify the caller that it finished. |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 325 } | 334 } |
| 326 } | 335 } |
| 327 | 336 |
| 328 // Statics. | 337 // Statics. |
| 329 bool MockDiskEntry::cancel_ = false; | 338 bool MockDiskEntry::cancel_ = false; |
| 330 bool MockDiskEntry::ignore_callbacks_ = false; | 339 bool MockDiskEntry::ignore_callbacks_ = false; |
| 331 | 340 |
| 332 //----------------------------------------------------------------------------- | 341 //----------------------------------------------------------------------------- |
| 333 | 342 |
| 334 MockDiskCache::MockDiskCache() | 343 MockDiskCache::MockDiskCache() |
| 335 : open_count_(0), create_count_(0), fail_requests_(false), | 344 : open_count_(0), create_count_(0), sparse_count_(0), fail_requests_(false), |
| 336 soft_failures_(false), double_create_check_(true) { | 345 soft_failures_(false), double_create_check_(true), |
| 346 fail_sparse_requests_(false) { | |
| 337 } | 347 } |
| 338 | 348 |
| 339 MockDiskCache::~MockDiskCache() { | 349 MockDiskCache::~MockDiskCache() { |
| 340 ReleaseAll(); | 350 ReleaseAll(); |
| 341 } | 351 } |
| 342 | 352 |
| 343 net::CacheType MockDiskCache::GetCacheType() const { | 353 net::CacheType MockDiskCache::GetCacheType() const { |
| 344 return net::DISK_CACHE; | 354 return net::DISK_CACHE; |
| 345 } | 355 } |
| 346 | 356 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 393 NOTREACHED(); | 403 NOTREACHED(); |
| 394 else | 404 else |
| 395 return net::ERR_CACHE_CREATE_FAILURE; | 405 return net::ERR_CACHE_CREATE_FAILURE; |
| 396 } | 406 } |
| 397 it->second->Release(); | 407 it->second->Release(); |
| 398 entries_.erase(it); | 408 entries_.erase(it); |
| 399 } | 409 } |
| 400 | 410 |
| 401 create_count_++; | 411 create_count_++; |
| 402 | 412 |
| 403 MockDiskEntry* new_entry = new MockDiskEntry(key); | 413 MockDiskEntry* new_entry = new MockDiskEntry(this, key); |
| 404 | 414 |
| 405 new_entry->AddRef(); | 415 new_entry->AddRef(); |
| 406 entries_[key] = new_entry; | 416 entries_[key] = new_entry; |
| 407 | 417 |
| 408 new_entry->AddRef(); | 418 new_entry->AddRef(); |
| 409 *entry = new_entry; | 419 *entry = new_entry; |
| 410 | 420 |
| 411 if (soft_failures_) | 421 if (soft_failures_) |
| 412 new_entry->set_fail_requests(); | 422 new_entry->set_fail_requests(); |
| 413 | 423 |
| 424 if (fail_sparse_requests_) | |
| 425 new_entry->set_fail_sparse_requests(); | |
| 426 | |
| 414 if (GetTestModeForEntry(key) & TEST_MODE_SYNC_CACHE_START) | 427 if (GetTestModeForEntry(key) & TEST_MODE_SYNC_CACHE_START) |
| 415 return net::OK; | 428 return net::OK; |
| 416 | 429 |
| 417 CallbackLater(callback, net::OK); | 430 CallbackLater(callback, net::OK); |
| 418 return net::ERR_IO_PENDING; | 431 return net::ERR_IO_PENDING; |
| 419 } | 432 } |
| 420 | 433 |
| 421 int MockDiskCache::DoomEntry(const std::string& key, | 434 int MockDiskCache::DoomEntry(const std::string& key, |
| 422 const net::CompletionCallback& callback) { | 435 const net::CompletionCallback& callback) { |
| 423 DCHECK(!callback.is_null()); | 436 DCHECK(!callback.is_null()); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 610 void MockBlockingBackendFactory::FinishCreation() { | 623 void MockBlockingBackendFactory::FinishCreation() { |
| 611 block_ = false; | 624 block_ = false; |
| 612 if (!callback_.is_null()) { | 625 if (!callback_.is_null()) { |
| 613 if (!fail_) | 626 if (!fail_) |
| 614 backend_->reset(new MockDiskCache()); | 627 backend_->reset(new MockDiskCache()); |
| 615 net::CompletionCallback cb = callback_; | 628 net::CompletionCallback cb = callback_; |
| 616 callback_.Reset(); | 629 callback_.Reset(); |
| 617 cb.Run(Result()); // This object can be deleted here. | 630 cb.Run(Result()); // This object can be deleted here. |
| 618 } | 631 } |
| 619 } | 632 } |
| OLD | NEW |