Index: net/disk_cache/entry_unittest.cc |
=================================================================== |
--- net/disk_cache/entry_unittest.cc (revision 28049) |
+++ net/disk_cache/entry_unittest.cc (working copy) |
@@ -1343,3 +1343,50 @@ |
// We re-created one of the corrupt children. |
EXPECT_EQ(3, cache_->GetEntryCount()); |
} |
+ |
+TEST_F(DiskCacheEntryTest, CancelSparseIO) { |
+ InitCache(); |
+ std::string key("the first key"); |
+ disk_cache::Entry* entry; |
+ ASSERT_TRUE(cache_->CreateEntry(key, &entry)); |
+ |
+ const int kSize = 4 * 1024; |
+ scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize); |
+ CacheTestFillBuffer(buf->data(), kSize, false); |
+ |
+ SimpleCallbackTest cb1, cb2, cb3, cb4; |
+ int64 offset = 0; |
+ for (int ret = 0; ret != net::ERR_IO_PENDING; offset += kSize * 4) |
+ ret = entry->WriteSparseData(offset, buf, kSize, &cb1); |
+ |
+ // Cannot use the entry at this point. |
+ offset = 0; |
+ EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, |
+ entry->GetAvailableRange(offset, kSize, &offset)); |
+ EXPECT_EQ(net::OK, entry->ReadyForSparseIO(&cb2)); |
+ |
+ // We cancel the pending operation, and register multiple notifications. |
+ entry->CancelSparseIO(); |
+ EXPECT_EQ(net::ERR_IO_PENDING, entry->ReadyForSparseIO(&cb2)); |
+ EXPECT_EQ(net::ERR_IO_PENDING, entry->ReadyForSparseIO(&cb3)); |
+ entry->CancelSparseIO(); // Should be a no op at this point. |
+ EXPECT_EQ(net::ERR_IO_PENDING, entry->ReadyForSparseIO(&cb4)); |
+ |
+ offset = 0; |
+ EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, |
+ entry->GetAvailableRange(offset, kSize, &offset)); |
+ EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, |
+ entry->ReadSparseData(offset, buf, kSize, NULL)); |
+ EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, |
+ entry->WriteSparseData(offset, buf, kSize, NULL)); |
+ |
+ // Now see if we receive all notifications. |
+ EXPECT_EQ(kSize, cb1.GetResult(net::ERR_IO_PENDING)); |
+ EXPECT_EQ(net::OK, cb2.GetResult(net::ERR_IO_PENDING)); |
+ EXPECT_EQ(net::OK, cb3.GetResult(net::ERR_IO_PENDING)); |
+ EXPECT_EQ(net::OK, cb4.GetResult(net::ERR_IO_PENDING)); |
+ |
+ EXPECT_EQ(kSize, entry->GetAvailableRange(offset, kSize, &offset)); |
+ EXPECT_EQ(net::OK, entry->ReadyForSparseIO(&cb2)); |
+ entry->Close(); |
+} |