Index: net/disk_cache/entry_unittest.cc |
=================================================================== |
--- net/disk_cache/entry_unittest.cc (revision 232523) |
+++ net/disk_cache/entry_unittest.cc (working copy) |
@@ -38,6 +38,7 @@ |
protected: |
void InternalSyncIO(); |
void InternalAsyncIO(); |
+ void InternalConcurrentIO(); |
void ExternalSyncIO(); |
void ExternalAsyncIO(); |
void ReleaseBuffer(); |
@@ -56,13 +57,18 @@ |
void DoomNormalEntry(); |
void DoomEntryNextToOpenEntry(); |
void DoomedEntry(); |
+ void MissingData(); |
void BasicSparseIO(); |
void HugeSparseIO(); |
- void GetAvailableRange(); |
+ void SparseGetAvailableRange(); |
void CouldBeSparse(); |
void UpdateSparseEntry(); |
void DoomSparseEntry(); |
+ void DoomSparseEntry2(); |
void PartialSparseEntry(); |
+ void CleanupSparseEntry(); |
+ void CancelSparseIO(); |
+ void ReadyForSparseIONoCancel(); |
bool SimpleCacheMakeBadChecksumEntry(const std::string& key, int* data_size); |
bool SimpleCacheThirdStreamFileExists(const char* key); |
void SyncDoomEntry(const char* key); |
@@ -73,17 +79,14 @@ |
const int kSize1 = 10; |
scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); |
CacheTestFillBuffer(buffer1->data(), kSize1, false); |
- EXPECT_EQ( |
- 0, |
- entry->ReadData(0, 0, buffer1.get(), kSize1, net::CompletionCallback())); |
+ EXPECT_EQ(0, entry->ReadData(0, 0, buffer1.get(), kSize1, |
+ net::CompletionCallback())); |
base::strlcpy(buffer1->data(), "the data", kSize1); |
- EXPECT_EQ(10, |
- entry->WriteData( |
- 0, 0, buffer1.get(), kSize1, net::CompletionCallback(), false)); |
+ EXPECT_EQ(10, entry->WriteData(0, 0, buffer1.get(), kSize1, |
+ net::CompletionCallback(), false)); |
memset(buffer1->data(), 0, kSize1); |
- EXPECT_EQ( |
- 10, |
- entry->ReadData(0, 0, buffer1.get(), kSize1, net::CompletionCallback())); |
+ EXPECT_EQ(10, entry->ReadData(0, 0, buffer1.get(), kSize1, |
+ net::CompletionCallback())); |
EXPECT_STREQ("the data", buffer1->data()); |
const int kSize2 = 5000; |
@@ -93,42 +96,33 @@ |
memset(buffer3->data(), 0, kSize3); |
CacheTestFillBuffer(buffer2->data(), kSize2, false); |
base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); |
- EXPECT_EQ( |
- 5000, |
- entry->WriteData( |
- 1, 1500, buffer2.get(), kSize2, net::CompletionCallback(), false)); |
+ EXPECT_EQ(5000, entry->WriteData(1, 1500, buffer2.get(), kSize2, |
+ net::CompletionCallback(), false)); |
memset(buffer2->data(), 0, kSize2); |
- EXPECT_EQ(4989, |
- entry->ReadData( |
- 1, 1511, buffer2.get(), kSize2, net::CompletionCallback())); |
+ EXPECT_EQ(4989, entry->ReadData(1, 1511, buffer2.get(), kSize2, |
+ net::CompletionCallback())); |
EXPECT_STREQ("big data goes here", buffer2->data()); |
- EXPECT_EQ( |
- 5000, |
- entry->ReadData(1, 0, buffer2.get(), kSize2, net::CompletionCallback())); |
+ EXPECT_EQ(5000, entry->ReadData(1, 0, buffer2.get(), kSize2, |
+ net::CompletionCallback())); |
EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); |
- EXPECT_EQ(1500, |
- entry->ReadData( |
- 1, 5000, buffer2.get(), kSize2, net::CompletionCallback())); |
+ EXPECT_EQ(1500, entry->ReadData(1, 5000, buffer2.get(), kSize2, |
+ net::CompletionCallback())); |
- EXPECT_EQ(0, |
- entry->ReadData( |
- 1, 6500, buffer2.get(), kSize2, net::CompletionCallback())); |
- EXPECT_EQ( |
- 6500, |
- entry->ReadData(1, 0, buffer3.get(), kSize3, net::CompletionCallback())); |
- EXPECT_EQ(8192, |
- entry->WriteData( |
- 1, 0, buffer3.get(), 8192, net::CompletionCallback(), false)); |
- EXPECT_EQ( |
- 8192, |
- entry->ReadData(1, 0, buffer3.get(), kSize3, net::CompletionCallback())); |
+ EXPECT_EQ(0, entry->ReadData(1, 6500, buffer2.get(), kSize2, |
+ net::CompletionCallback())); |
+ EXPECT_EQ(6500, entry->ReadData(1, 0, buffer3.get(), kSize3, |
+ net::CompletionCallback())); |
+ EXPECT_EQ(8192, entry->WriteData(1, 0, buffer3.get(), 8192, |
+ net::CompletionCallback(), false)); |
+ EXPECT_EQ(8192, entry->ReadData(1, 0, buffer3.get(), kSize3, |
+ net::CompletionCallback())); |
EXPECT_EQ(8192, entry->GetDataSize(1)); |
// We need to delete the memory buffer on this thread. |
- EXPECT_EQ(0, entry->WriteData( |
- 0, 0, NULL, 0, net::CompletionCallback(), true)); |
- EXPECT_EQ(0, entry->WriteData( |
- 1, 0, NULL, 0, net::CompletionCallback(), true)); |
+ EXPECT_EQ(0, |
+ entry->WriteData(0, 0, NULL, 0, net::CompletionCallback(), true)); |
+ EXPECT_EQ(0, |
+ entry->WriteData(1, 0, NULL, 0, net::CompletionCallback(), true)); |
} |
// We need to support synchronous IO even though it is not a supported operation |
@@ -180,19 +174,14 @@ |
MessageLoopHelper helper; |
// Let's verify that each IO goes to the right callback object. |
- CallbackTest callback1(&helper, false); |
- CallbackTest callback2(&helper, false); |
- CallbackTest callback3(&helper, false); |
- CallbackTest callback4(&helper, false); |
- CallbackTest callback5(&helper, false); |
- CallbackTest callback6(&helper, false); |
- CallbackTest callback7(&helper, false); |
- CallbackTest callback8(&helper, false); |
- CallbackTest callback9(&helper, false); |
- CallbackTest callback10(&helper, false); |
- CallbackTest callback11(&helper, false); |
- CallbackTest callback12(&helper, false); |
- CallbackTest callback13(&helper, false); |
+ CallbackTest cb1(&helper, false); |
+ CallbackTest cb2(&helper, false); |
+ CallbackTest cb3(&helper, false); |
+ CallbackTest cb4(&helper, false); |
+ CallbackTest cb5(&helper, false); |
+ CallbackTest cb6(&helper, false); |
+ CallbackTest cb7(&helper, false); |
+ CallbackTest cb8(&helper, false); |
const int kSize1 = 10; |
const int kSize2 = 5000; |
@@ -204,141 +193,66 @@ |
CacheTestFillBuffer(buffer2->data(), kSize2, false); |
CacheTestFillBuffer(buffer3->data(), kSize3, false); |
- EXPECT_EQ(0, |
- entry->ReadData( |
- 0, |
- 15 * 1024, |
- buffer1.get(), |
- kSize1, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback1)))); |
- base::strlcpy(buffer1->data(), "the data", kSize1); |
+ int ret = entry->ReadData(0, 15 * 1024, buffer1.get(), kSize1, |
+ cb1.callback()); |
int expected = 0; |
- int ret = entry->WriteData( |
- 0, |
- 0, |
- buffer1.get(), |
- kSize1, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback2)), |
- false); |
- EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); |
+ EXPECT_TRUE(0 == ret || net::ERR_IO_PENDING == ret); |
if (net::ERR_IO_PENDING == ret) |
expected++; |
- EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
- memset(buffer2->data(), 0, kSize2); |
- ret = entry->ReadData( |
- 0, |
- 0, |
- buffer2.get(), |
- kSize1, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback3))); |
+ base::strlcpy(buffer1->data(), "the data", kSize1); |
+ ret = entry->WriteData(0, 0, buffer1.get(), kSize1, cb2.callback(), false); |
EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); |
if (net::ERR_IO_PENDING == ret) |
expected++; |
EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
+ |
+ memset(buffer2->data(), 0, kSize2); |
+ EXPECT_EQ(10, ReadData(entry, 0, 0, buffer2.get(), kSize1)); |
EXPECT_STREQ("the data", buffer2->data()); |
base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); |
- ret = entry->WriteData( |
- 1, |
- 1500, |
- buffer2.get(), |
- kSize2, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback4)), |
- true); |
- EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); |
- if (net::ERR_IO_PENDING == ret) |
- expected++; |
+ EXPECT_EQ(5000, WriteData(entry, 1, 1500, buffer2.get(), kSize2, true)); |
- EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
memset(buffer3->data(), 0, kSize3); |
- ret = entry->ReadData( |
- 1, |
- 1511, |
- buffer3.get(), |
- kSize2, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback5))); |
- EXPECT_TRUE(4989 == ret || net::ERR_IO_PENDING == ret); |
- if (net::ERR_IO_PENDING == ret) |
- expected++; |
- |
- EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
+ EXPECT_EQ(4989, ReadData(entry, 1, 1511, buffer3.get(), kSize2)); |
EXPECT_STREQ("big data goes here", buffer3->data()); |
- ret = entry->ReadData( |
- 1, |
- 0, |
- buffer2.get(), |
- kSize2, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback6))); |
- EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); |
- if (net::ERR_IO_PENDING == ret) |
- expected++; |
+ ret = ReadData(entry, 1, 0, buffer2.get(), kSize2); |
+ EXPECT_TRUE(ret == 1500 || ret == 5000); |
memset(buffer3->data(), 0, kSize3); |
+ EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); |
- EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
- EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); |
- ret = entry->ReadData( |
- 1, |
- 5000, |
- buffer2.get(), |
- kSize2, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback7))); |
+ ret = entry->ReadData(1, 5000, buffer2.get(), kSize2, cb3.callback()); |
EXPECT_TRUE(1500 == ret || net::ERR_IO_PENDING == ret); |
if (net::ERR_IO_PENDING == ret) |
expected++; |
- ret = entry->ReadData( |
- 1, |
- 0, |
- buffer3.get(), |
- kSize3, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback9))); |
+ ret = entry->ReadData(1, 0, buffer3.get(), kSize3, cb4.callback()); |
EXPECT_TRUE(6500 == ret || net::ERR_IO_PENDING == ret); |
if (net::ERR_IO_PENDING == ret) |
expected++; |
- ret = entry->WriteData( |
- 1, |
- 0, |
- buffer3.get(), |
- 8192, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback10)), |
- true); |
+ ret = entry->WriteData(1, 0, buffer3.get(), 8192, cb5.callback(), true); |
EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); |
if (net::ERR_IO_PENDING == ret) |
expected++; |
EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
- ret = entry->ReadData( |
- 1, |
- 0, |
- buffer3.get(), |
- kSize3, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback11))); |
+ ret = entry->ReadData(1, 0, buffer3.get(), kSize3, cb6.callback()); |
EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); |
if (net::ERR_IO_PENDING == ret) |
expected++; |
EXPECT_EQ(8192, entry->GetDataSize(1)); |
- ret = entry->ReadData( |
- 0, |
- 0, |
- buffer1.get(), |
- kSize1, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback12))); |
+ ret = entry->ReadData(0, 0, buffer1.get(), kSize1, cb7.callback()); |
EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); |
if (net::ERR_IO_PENDING == ret) |
expected++; |
- ret = entry->ReadData( |
- 1, |
- 0, |
- buffer2.get(), |
- kSize2, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback13))); |
+ ret = entry->ReadData(1, 0, buffer2.get(), kSize2, cb8.callback()); |
EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); |
if (net::ERR_IO_PENDING == ret) |
expected++; |
@@ -358,6 +272,12 @@ |
InternalAsyncIO(); |
} |
+TEST_F(DiskCacheEntryTest, V3InternalAsyncIO) { |
+ UseVersion3(); |
+ InitCache(); |
+ InternalAsyncIO(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyInternalAsyncIO) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -373,49 +293,38 @@ |
CacheTestFillBuffer(buffer1->data(), kSize1, false); |
CacheTestFillBuffer(buffer2->data(), kSize2, false); |
base::strlcpy(buffer1->data(), "the data", kSize1); |
- EXPECT_EQ(17000, |
- entry->WriteData( |
- 0, 0, buffer1.get(), kSize1, net::CompletionCallback(), false)); |
+ EXPECT_EQ(17000, entry->WriteData(0, 0, buffer1.get(), kSize1, |
+ net::CompletionCallback(), false)); |
memset(buffer1->data(), 0, kSize1); |
- EXPECT_EQ( |
- 17000, |
- entry->ReadData(0, 0, buffer1.get(), kSize1, net::CompletionCallback())); |
+ EXPECT_EQ(17000, entry->ReadData(0, 0, buffer1.get(), kSize1, |
+ net::CompletionCallback())); |
EXPECT_STREQ("the data", buffer1->data()); |
base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); |
- EXPECT_EQ( |
- 25000, |
- entry->WriteData( |
- 1, 10000, buffer2.get(), kSize2, net::CompletionCallback(), false)); |
+ EXPECT_EQ(25000, entry->WriteData(1, 10000, buffer2.get(), kSize2, |
+ net::CompletionCallback(), false)); |
memset(buffer2->data(), 0, kSize2); |
- EXPECT_EQ(24989, |
- entry->ReadData( |
- 1, 10011, buffer2.get(), kSize2, net::CompletionCallback())); |
+ EXPECT_EQ(24989, entry->ReadData(1, 10011, buffer2.get(), kSize2, |
+ net::CompletionCallback())); |
EXPECT_STREQ("big data goes here", buffer2->data()); |
- EXPECT_EQ( |
- 25000, |
- entry->ReadData(1, 0, buffer2.get(), kSize2, net::CompletionCallback())); |
- EXPECT_EQ(5000, |
- entry->ReadData( |
- 1, 30000, buffer2.get(), kSize2, net::CompletionCallback())); |
+ EXPECT_EQ(25000, entry->ReadData(1, 0, buffer2.get(), kSize2, |
+ net::CompletionCallback())); |
+ EXPECT_EQ(5000, entry->ReadData(1, 30000, buffer2.get(), kSize2, |
+ net::CompletionCallback())); |
- EXPECT_EQ(0, |
- entry->ReadData( |
- 1, 35000, buffer2.get(), kSize2, net::CompletionCallback())); |
- EXPECT_EQ( |
- 17000, |
- entry->ReadData(1, 0, buffer1.get(), kSize1, net::CompletionCallback())); |
- EXPECT_EQ( |
- 17000, |
- entry->WriteData( |
- 1, 20000, buffer1.get(), kSize1, net::CompletionCallback(), false)); |
+ EXPECT_EQ(0, entry->ReadData(1, 35000, buffer2.get(), kSize2, |
+ net::CompletionCallback())); |
+ EXPECT_EQ(17000, entry->ReadData(1, 0, buffer1.get(), kSize1, |
+ net::CompletionCallback())); |
+ EXPECT_EQ(17000, entry->WriteData(1, 20000, buffer1.get(), kSize1, |
+ net::CompletionCallback(), false)); |
EXPECT_EQ(37000, entry->GetDataSize(1)); |
// We need to delete the memory buffer on this thread. |
- EXPECT_EQ(0, entry->WriteData( |
- 0, 0, NULL, 0, net::CompletionCallback(), true)); |
- EXPECT_EQ(0, entry->WriteData( |
- 1, 0, NULL, 0, net::CompletionCallback(), true)); |
+ EXPECT_EQ(0, |
+ entry->WriteData(0, 0, NULL, 0, net::CompletionCallback(), true)); |
+ EXPECT_EQ(0, |
+ entry->WriteData(1, 0, NULL, 0, net::CompletionCallback(), true)); |
} |
void DiskCacheEntryTest::ExternalSyncIO() { |
@@ -438,9 +347,15 @@ |
ExternalSyncIO(); |
} |
+TEST_F(DiskCacheEntryTest, V3ExternalSyncIO) { |
+ UseVersion3(); |
+ InitCache(); |
+ ExternalSyncIO(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, ExternalSyncIONoBuffer) { |
InitCache(); |
- cache_impl_->SetFlags(disk_cache::kNoBuffering); |
+ SetNoBuffering(); |
ExternalSyncIO(); |
} |
@@ -458,15 +373,10 @@ |
MessageLoopHelper helper; |
// Let's verify that each IO goes to the right callback object. |
- CallbackTest callback1(&helper, false); |
- CallbackTest callback2(&helper, false); |
- CallbackTest callback3(&helper, false); |
- CallbackTest callback4(&helper, false); |
- CallbackTest callback5(&helper, false); |
- CallbackTest callback6(&helper, false); |
- CallbackTest callback7(&helper, false); |
- CallbackTest callback8(&helper, false); |
- CallbackTest callback9(&helper, false); |
+ CallbackTest cb1(&helper, false); |
+ CallbackTest cb2(&helper, false); |
+ CallbackTest cb3(&helper, false); |
+ CallbackTest cb4(&helper, false); |
const int kSize1 = 17000; |
const int kSize2 = 25000; |
@@ -477,107 +387,39 @@ |
CacheTestFillBuffer(buffer1->data(), kSize1, false); |
CacheTestFillBuffer(buffer2->data(), kSize2, false); |
CacheTestFillBuffer(buffer3->data(), kSize3, false); |
+ |
base::strlcpy(buffer1->data(), "the data", kSize1); |
- int ret = entry->WriteData( |
- 0, |
- 0, |
- buffer1.get(), |
- kSize1, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback1)), |
- false); |
- EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); |
- if (net::ERR_IO_PENDING == ret) |
- expected++; |
+ EXPECT_EQ(17000, WriteData(entry, 0, 0, buffer1.get(), kSize1, false)); |
- EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
- |
memset(buffer2->data(), 0, kSize1); |
- ret = entry->ReadData( |
- 0, |
- 0, |
- buffer2.get(), |
- kSize1, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback2))); |
- EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); |
- if (net::ERR_IO_PENDING == ret) |
- expected++; |
- |
- EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
+ EXPECT_EQ(17000, ReadData(entry, 0, 0, buffer2.get(), kSize1)); |
EXPECT_STREQ("the data", buffer2->data()); |
base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); |
- ret = entry->WriteData( |
- 1, |
- 10000, |
- buffer2.get(), |
- kSize2, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback3)), |
- false); |
- EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret); |
- if (net::ERR_IO_PENDING == ret) |
- expected++; |
+ EXPECT_EQ(25000, WriteData(entry, 1, 10000, buffer2.get(), kSize2, false)); |
- EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
- |
memset(buffer3->data(), 0, kSize3); |
- ret = entry->ReadData( |
- 1, |
- 10011, |
- buffer3.get(), |
- kSize3, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback4))); |
- EXPECT_TRUE(24989 == ret || net::ERR_IO_PENDING == ret); |
- if (net::ERR_IO_PENDING == ret) |
- expected++; |
- |
- EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
+ EXPECT_EQ(24989, ReadData(entry, 1, 10011, buffer3.get(), kSize3)); |
EXPECT_STREQ("big data goes here", buffer3->data()); |
- ret = entry->ReadData( |
- 1, |
- 0, |
- buffer2.get(), |
- kSize2, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback5))); |
- EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret); |
- if (net::ERR_IO_PENDING == ret) |
- expected++; |
- EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
+ EXPECT_EQ(25000, ReadData(entry, 1, 0, buffer2.get(), kSize2)); |
memset(buffer3->data(), 0, kSize3); |
EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 10000)); |
- ret = entry->ReadData( |
- 1, |
- 30000, |
- buffer2.get(), |
- kSize2, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback6))); |
+ |
+ int ret = entry->ReadData(1, 30000, buffer2.get(), kSize2, cb1.callback()); |
EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); |
if (net::ERR_IO_PENDING == ret) |
expected++; |
EXPECT_EQ(0, |
- entry->ReadData( |
- 1, |
- 35000, |
- buffer2.get(), |
- kSize2, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback7)))); |
- ret = entry->ReadData( |
- 1, |
- 0, |
- buffer1.get(), |
- kSize1, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback8))); |
+ entry->ReadData(1, 35000, buffer2.get(), kSize2, cb2.callback())); |
+ ret = entry->ReadData(1, 0, buffer1.get(), kSize1, cb3.callback()); |
EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); |
if (net::ERR_IO_PENDING == ret) |
expected++; |
- ret = entry->WriteData( |
- 1, |
- 20000, |
- buffer3.get(), |
- kSize1, |
- base::Bind(&CallbackTest::Run, base::Unretained(&callback9)), |
- false); |
+ |
+ ret = entry->WriteData(1, 20000, buffer3.get(), kSize1, cb4.callback(), |
+ false); |
EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); |
if (net::ERR_IO_PENDING == ret) |
expected++; |
@@ -598,12 +440,25 @@ |
ExternalAsyncIO(); |
} |
+TEST_F(DiskCacheEntryTest, V3ExternalAsyncIO) { |
+ UseVersion3(); |
+ InitCache(); |
+ ExternalAsyncIO(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, ExternalAsyncIONoBuffer) { |
InitCache(); |
cache_impl_->SetFlags(disk_cache::kNoBuffering); |
ExternalAsyncIO(); |
} |
+TEST_F(DiskCacheEntryTest, V3ExternalAsyncIONoBuffer) { |
+ UseVersion3(); |
+ InitCache(); |
+ SetNoBuffering(); |
+ ExternalAsyncIO(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyExternalAsyncIO) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -620,19 +475,26 @@ |
scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); |
CacheTestFillBuffer(buffer->data(), kBufferSize, false); |
- net::ReleaseBufferCompletionCallback cb(buffer.get()); |
- int rv = |
- entry->WriteData(0, 0, buffer.get(), kBufferSize, cb.callback(), false); |
+ net::ReleaseBufferCompletionCallback cb(buffer); |
+ int rv = entry->WriteData(0, 0, buffer.get(), kBufferSize, cb.callback(), |
+ false); |
EXPECT_EQ(kBufferSize, cb.GetResult(rv)); |
entry->Close(); |
} |
TEST_F(DiskCacheEntryTest, ReleaseBuffer) { |
InitCache(); |
- cache_impl_->SetFlags(disk_cache::kNoBuffering); |
+ SetNoBuffering(); |
ReleaseBuffer(); |
} |
+TEST_F(DiskCacheEntryTest, V3ReleaseBuffer) { |
+ UseVersion3(); |
+ InitCache(); |
+ SetNoBuffering(); |
+ ReleaseBuffer(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyReleaseBuffer) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -653,13 +515,12 @@ |
} |
scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kBufferSize)); |
for (int i = 0; i < kNumStreams; i++) { |
- EXPECT_EQ( |
- kBufferSize, |
- WriteData(entry, i, 0, reference_buffers[i].get(), kBufferSize, false)); |
+ EXPECT_EQ(kBufferSize, WriteData(entry, i, 0, reference_buffers[i].get(), |
+ kBufferSize, false)); |
memset(buffer1->data(), 0, kBufferSize); |
EXPECT_EQ(kBufferSize, ReadData(entry, i, 0, buffer1.get(), kBufferSize)); |
- EXPECT_EQ( |
- 0, memcmp(reference_buffers[i]->data(), buffer1->data(), kBufferSize)); |
+ EXPECT_EQ(0, memcmp(reference_buffers[i]->data(), buffer1->data(), |
+ kBufferSize)); |
} |
EXPECT_EQ(net::ERR_INVALID_ARGUMENT, |
ReadData(entry, kNumStreams, 0, buffer1.get(), kBufferSize)); |
@@ -676,18 +537,14 @@ |
memset(buffer2->data(), 0, kReadBufferSize); |
EXPECT_EQ(kReadBufferSize, |
ReadData(entry, i, 0, buffer2.get(), kReadBufferSize)); |
- EXPECT_EQ( |
- 0, |
- memcmp(reference_buffers[i]->data(), buffer2->data(), kReadBufferSize)); |
+ EXPECT_EQ(0, memcmp(reference_buffers[i]->data(), buffer2->data(), |
+ kReadBufferSize)); |
memset(buffer2->data(), 0, kReadBufferSize); |
- EXPECT_EQ( |
- kFinalReadSize, |
- ReadData(entry, i, kReadBufferSize, buffer2.get(), kReadBufferSize)); |
- EXPECT_EQ(0, |
- memcmp(reference_buffers[i]->data() + kReadBufferSize, |
- buffer2->data(), |
- kFinalReadSize)); |
+ EXPECT_EQ(kFinalReadSize, ReadData(entry, i, kReadBufferSize, |
+ buffer2.get(), kReadBufferSize)); |
+ EXPECT_EQ(0, memcmp(reference_buffers[i]->data() + kReadBufferSize, |
+ buffer2->data(), kFinalReadSize)); |
} |
entry->Close(); |
@@ -698,6 +555,12 @@ |
StreamAccess(); |
} |
+TEST_F(DiskCacheEntryTest, V3StreamAccess) { |
+ UseVersion3(); |
+ InitCache(); |
+ StreamAccess(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyStreamAccess) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -710,6 +573,7 @@ |
ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
EXPECT_EQ(key, entry->GetKey()) << "short key"; |
entry->Close(); |
+ WaitForEntryToClose(key); |
int seed = static_cast<int>(Time::Now().ToInternalValue()); |
srand(seed); |
@@ -722,6 +586,7 @@ |
ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
EXPECT_TRUE(key == entry->GetKey()) << "1000 bytes key"; |
entry->Close(); |
+ WaitForEntryToClose(key); |
key_buffer[1000] = 'p'; |
key_buffer[3000] = '\0'; |
@@ -729,6 +594,7 @@ |
ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
EXPECT_TRUE(key == entry->GetKey()) << "medium size key"; |
entry->Close(); |
+ WaitForEntryToClose(key); |
CacheTestFillBuffer(key_buffer, sizeof(key_buffer), true); |
key_buffer[19999] = '\0'; |
@@ -737,6 +603,7 @@ |
ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
EXPECT_TRUE(key == entry->GetKey()) << "long key"; |
entry->Close(); |
+ WaitForEntryToClose(key); |
CacheTestFillBuffer(key_buffer, 0x4000, true); |
key_buffer[0x4000] = '\0'; |
@@ -752,6 +619,12 @@ |
GetKey(); |
} |
+TEST_F(DiskCacheEntryTest, V3GetKey) { |
+ UseVersion3(); |
+ InitCache(); |
+ GetKey(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyGetKey) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -802,6 +675,12 @@ |
GetTimes(); |
} |
+TEST_F(DiskCacheEntryTest, V3GetTimes) { |
+ UseVersion3(); |
+ InitCache(); |
+ GetTimes(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyGetTimes) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -854,6 +733,7 @@ |
EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1.get(), 10, false)); |
EXPECT_EQ(10, entry->GetDataSize(0)); |
entry->Close(); |
+ WaitForEntryToClose(key2); |
// Go from an internal address to a bigger block size. |
ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
@@ -862,6 +742,7 @@ |
EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2.get(), 2000)); |
EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); |
entry->Close(); |
+ WaitForEntryToClose(key2); |
memset(buffer2->data(), 0, kSize); |
// Go from an internal address to an external one. |
@@ -871,6 +752,7 @@ |
EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2.get(), kSize)); |
EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); |
entry->Close(); |
+ WaitForEntryToClose(key2); |
// Double check the size from disk. |
ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
@@ -879,6 +761,7 @@ |
// Now extend the entry without actual data. |
EXPECT_EQ(0, WriteData(entry, 0, 45500, buffer1.get(), 0, false)); |
entry->Close(); |
+ WaitForEntryToClose(key2); |
// And check again from disk. |
ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
@@ -891,6 +774,12 @@ |
GrowData(); |
} |
+TEST_F(DiskCacheEntryTest, V3GrowData) { |
+ UseVersion3(); |
+ InitCache(); |
+ GrowData(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, GrowDataNoBuffer) { |
InitCache(); |
cache_impl_->SetFlags(disk_cache::kNoBuffering); |
@@ -928,6 +817,7 @@ |
EXPECT_EQ(0, WriteData(entry, 0, 0, buffer1.get(), 0, true)); |
EXPECT_EQ(0, entry->GetDataSize(0)); |
entry->Close(); |
+ WaitForEntryToClose(key); |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
// Go to an external file. |
@@ -951,8 +841,8 @@ |
EXPECT_EQ(600, ReadData(entry, 0, 1000, buffer2.get(), 600)); |
EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 600)); |
EXPECT_EQ(1000, ReadData(entry, 0, 0, buffer2.get(), 1000)); |
- EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 1000)) |
- << "Preserves previous data"; |
+ EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 1000)) << |
+ "Preserves previous data"; |
// Go from external file to zero length. |
EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1.get(), 20000, true)); |
@@ -968,12 +858,25 @@ |
TruncateData(); |
} |
+TEST_F(DiskCacheEntryTest, V3TruncateData) { |
+ UseVersion3(); |
+ InitCache(); |
+ TruncateData(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, TruncateDataNoBuffer) { |
InitCache(); |
- cache_impl_->SetFlags(disk_cache::kNoBuffering); |
+ SetNoBuffering(); |
TruncateData(); |
} |
+TEST_F(DiskCacheEntryTest, V3TruncateDataNoBuffer) { |
+ UseVersion3(); |
+ InitCache(); |
+ SetNoBuffering(); |
+ TruncateData(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyTruncateData) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -1023,12 +926,25 @@ |
ZeroLengthIO(); |
} |
+TEST_F(DiskCacheEntryTest, V3ZeroLengthIO) { |
+ UseVersion3(); |
+ InitCache(); |
+ ZeroLengthIO(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, ZeroLengthIONoBuffer) { |
InitCache(); |
- cache_impl_->SetFlags(disk_cache::kNoBuffering); |
+ SetNoBuffering(); |
ZeroLengthIO(); |
} |
+TEST_F(DiskCacheEntryTest, V3ZeroLengthIONoBuffer) { |
+ UseVersion3(); |
+ InitCache(); |
+ SetNoBuffering(); |
+ ZeroLengthIO(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyZeroLengthIO) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -1050,6 +966,7 @@ |
EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1.get(), kSize, false)); |
entry->Close(); |
+ WaitForEntryToClose(key); |
// Write a little more and read what we wrote before. |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
@@ -1060,6 +977,7 @@ |
// Now go to an external file. |
EXPECT_EQ(kSize, WriteData(entry, 1, 18000, buffer1.get(), kSize, false)); |
entry->Close(); |
+ WaitForEntryToClose(key); |
// Write something else and verify old data. |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
@@ -1077,6 +995,7 @@ |
// Extend the file some more. |
EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1.get(), kSize, false)); |
entry->Close(); |
+ WaitForEntryToClose(key); |
// And now make sure that we can deal with data in both places (ram/disk). |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
@@ -1118,12 +1037,25 @@ |
Buffering(); |
} |
+TEST_F(DiskCacheEntryTest, V3Buffering) { |
+ UseVersion3(); |
+ InitCache(); |
+ Buffering(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, BufferingNoBuffer) { |
InitCache(); |
- cache_impl_->SetFlags(disk_cache::kNoBuffering); |
+ SetNoBuffering(); |
Buffering(); |
} |
+TEST_F(DiskCacheEntryTest, V3BufferingNoBuffer) { |
+ UseVersion3(); |
+ InitCache(); |
+ SetNoBuffering(); |
+ Buffering(); |
+} |
+ |
// Checks that entries are zero length when created. |
void DiskCacheEntryTest::SizeAtCreate() { |
const char key[] = "the first key"; |
@@ -1141,6 +1073,12 @@ |
SizeAtCreate(); |
} |
+TEST_F(DiskCacheEntryTest, V3SizeAtCreate) { |
+ UseVersion3(); |
+ InitCache(); |
+ SizeAtCreate(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlySizeAtCreate) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -1165,6 +1103,7 @@ |
EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1.get(), kSize, true)); |
EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1.get(), kSize, true)); |
entry->Close(); |
+ WaitForEntryToClose(key); |
// Extend the file and read between the old size and the new write. |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
@@ -1211,12 +1150,16 @@ |
// And now reduce the size below the old size. |
EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1.get(), kSize, true)); |
EXPECT_EQ(19000 + kSize, entry->GetDataSize(1)); |
- EXPECT_EQ(kSize, ReadData(entry, 1, 18900, buffer2.get(), kSize)); |
+ |
+ // Repeat the last write to make results consistent across backends. |
+ EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1.get(), kSize, false)); |
+ |
+ EXPECT_EQ(100, ReadData(entry, 1, 18900, buffer2.get(), kSize)); |
EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); |
- EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); |
// Verify that the actual file is truncated. |
entry->Close(); |
+ WaitForEntryToClose(key); |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
EXPECT_EQ(19000 + kSize, entry->GetDataSize(1)); |
@@ -1233,12 +1176,25 @@ |
SizeChanges(); |
} |
+TEST_F(DiskCacheEntryTest, V3SizeChanges) { |
+ UseVersion3(); |
+ InitCache(); |
+ SizeChanges(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, SizeChangesNoBuffer) { |
InitCache(); |
- cache_impl_->SetFlags(disk_cache::kNoBuffering); |
+ SetNoBuffering(); |
SizeChanges(); |
} |
+TEST_F(DiskCacheEntryTest, V3SizeChangesNoBuffer) { |
+ UseVersion3(); |
+ InitCache(); |
+ SetNoBuffering(); |
+ SizeChanges(); |
+} |
+ |
// Write more than the total cache capacity but to a single entry. |size| is the |
// amount of bytes to write each time. |
void DiskCacheEntryTest::ReuseEntry(int size) { |
@@ -1257,6 +1213,7 @@ |
EXPECT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, true)); |
EXPECT_EQ(size, WriteData(entry, 0, 0, buffer.get(), size, false)); |
entry->Close(); |
+ WaitForEntryToClose(key2); |
ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
} |
@@ -1271,6 +1228,13 @@ |
ReuseEntry(20 * 1024); |
} |
+TEST_F(DiskCacheEntryTest, V3ReuseExternalEntry) { |
+ UseVersion3(); |
+ SetMaxSize(200 * 1024); |
+ InitCache(); |
+ ReuseEntry(20 * 1024); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyReuseExternalEntry) { |
SetMemoryOnlyMode(); |
SetMaxSize(200 * 1024); |
@@ -1284,6 +1248,13 @@ |
ReuseEntry(10 * 1024); |
} |
+TEST_F(DiskCacheEntryTest, V3ReuseInternalEntry) { |
+ UseVersion3(); |
+ SetMaxSize(100 * 1024); |
+ InitCache(); |
+ ReuseEntry(10 * 1024); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyReuseInternalEntry) { |
SetMemoryOnlyMode(); |
SetMaxSize(100 * 1024); |
@@ -1313,6 +1284,7 @@ |
EXPECT_EQ(100, ReadData(entry, 0, 300, buffer3.get(), 100)); |
EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); |
entry->Close(); |
+ WaitForEntryToClose(key); |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
// The entry is now on disk. Load it and extend it. |
@@ -1321,6 +1293,7 @@ |
EXPECT_EQ(100, ReadData(entry, 0, 700, buffer3.get(), 100)); |
EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); |
entry->Close(); |
+ WaitForEntryToClose(key); |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
// This time using truncate. |
@@ -1361,12 +1334,25 @@ |
InvalidData(); |
} |
+TEST_F(DiskCacheEntryTest, V3InvalidData) { |
+ UseVersion3(); |
+ InitCache(); |
+ InvalidData(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, InvalidDataNoBuffer) { |
InitCache(); |
- cache_impl_->SetFlags(disk_cache::kNoBuffering); |
+ SetNoBuffering(); |
InvalidData(); |
} |
+TEST_F(DiskCacheEntryTest, V3InvalidDataNoBuffer) { |
+ UseVersion3(); |
+ InitCache(); |
+ SetNoBuffering(); |
+ InvalidData(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyInvalidData) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -1379,7 +1365,7 @@ |
disk_cache::Entry* entry; |
ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
- const int kSize = 200; |
+ const int kSize = 20000; |
scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
CacheTestFillBuffer(buffer->data(), kSize, false); |
@@ -1408,6 +1394,13 @@ |
ReadWriteDestroyBuffer(); |
} |
+TEST_F(DiskCacheEntryTest, V3ReadWriteDestroyBuffer) { |
+ UseVersion3(); |
+ InitCache(); |
+ SetNoBuffering(); |
+ ReadWriteDestroyBuffer(); |
+} |
+ |
void DiskCacheEntryTest::DoomNormalEntry() { |
std::string key("the first key"); |
disk_cache::Entry* entry; |
@@ -1436,6 +1429,12 @@ |
DoomNormalEntry(); |
} |
+TEST_F(DiskCacheEntryTest, V3DoomEntry) { |
+ UseVersion3(); |
+ InitCache(); |
+ DoomNormalEntry(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyDoomEntry) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -1472,6 +1471,12 @@ |
DoomEntryNextToOpenEntry(); |
} |
+TEST_F(DiskCacheEntryTest, V3DoomEntryNextToOpenEntry) { |
+ UseVersion3(); |
+ InitCache(); |
+ DoomEntryNextToOpenEntry(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, NewEvictionDoomEntryNextToOpenEntry) { |
SetNewEviction(); |
InitCache(); |
@@ -1518,14 +1523,19 @@ |
DoomedEntry(); |
} |
+TEST_F(DiskCacheEntryTest, V3DoomedEntry) { |
+ UseVersion3(); |
+ InitCache(); |
+ DoomedEntry(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyDoomedEntry) { |
SetMemoryOnlyMode(); |
InitCache(); |
DoomedEntry(); |
} |
-// Tests that we discard entries if the data is missing. |
-TEST_F(DiskCacheEntryTest, MissingData) { |
+void DiskCacheEntryTest::MissingData() { |
InitCache(); |
std::string key("the first key"); |
@@ -1536,24 +1546,37 @@ |
const int kSize = 20000; |
scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize)); |
CacheTestFillBuffer(buffer->data(), kSize, false); |
- EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false)); |
+ EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer.get(), kSize, false)); |
entry->Close(); |
FlushQueueForTest(); |
disk_cache::Addr address(0x80000001); |
- base::FilePath name = cache_impl_->GetFileName(address); |
+ if (cache_impl_v3_) |
+ address.set_value(0x80040000); |
+ |
+ std::string tmp = base::StringPrintf("f_%06x", address.FileNumber()); |
+ base::FilePath name = cache_path_.AppendASCII(tmp); |
EXPECT_TRUE(base::DeleteFile(name, false)); |
// Attempt to read the data. |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
EXPECT_EQ(net::ERR_FILE_NOT_FOUND, |
- ReadData(entry, 0, 0, buffer.get(), kSize)); |
+ ReadData(entry, 1, 0, buffer.get(), kSize)); |
entry->Close(); |
// The entry should be gone. |
ASSERT_NE(net::OK, OpenEntry(key, &entry)); |
} |
+TEST_F(DiskCacheEntryTest, MissingData) { |
+ MissingData(); |
+} |
+ |
+TEST_F(DiskCacheEntryTest, V3MissingData) { |
+ UseVersion3(); |
+ MissingData(); |
+} |
+ |
// Test that child entries in a memory cache backend are not visible from |
// enumerations. |
TEST_F(DiskCacheEntryTest, MemoryOnlyEnumerationWithSparseEntries) { |
@@ -1569,14 +1592,12 @@ |
ASSERT_EQ(net::OK, CreateEntry(key, &parent_entry)); |
// Writes to the parent entry. |
- EXPECT_EQ(kSize, |
- parent_entry->WriteSparseData( |
- 0, buf.get(), kSize, net::CompletionCallback())); |
+ EXPECT_EQ(kSize, parent_entry->WriteSparseData(0, buf, kSize, |
+ net::CompletionCallback())); |
// This write creates a child entry and writes to it. |
- EXPECT_EQ(kSize, |
- parent_entry->WriteSparseData( |
- 8192, buf.get(), kSize, net::CompletionCallback())); |
+ EXPECT_EQ(kSize, parent_entry->WriteSparseData(8192, buf, kSize, |
+ net::CompletionCallback())); |
parent_entry->Close(); |
@@ -1621,7 +1642,7 @@ |
scoped_refptr<net::IOBuffer> buf_1(new net::IOBuffer(size)); |
memset(buf_1->data(), 0, size); |
- int ret = entry->ReadSparseData(offset, buf_1.get(), size, cb.callback()); |
+ int ret = entry->ReadSparseData(offset, buf_1, size, cb.callback()); |
EXPECT_EQ(size, cb.GetResult(ret)); |
EXPECT_EQ(0, memcmp(buf_1->data(), buffer, size)); |
} |
@@ -1637,15 +1658,17 @@ |
CacheTestFillBuffer(buf_1->data(), kSize, false); |
// Write at offset 0. |
- VerifySparseIO(entry, 0, buf_1.get(), kSize, buf_2.get()); |
+ VerifySparseIO(entry, 0, buf_1, kSize, buf_2); |
// Write at offset 0x400000 (4 MB). |
- VerifySparseIO(entry, 0x400000, buf_1.get(), kSize, buf_2.get()); |
+ VerifySparseIO(entry, 0x400000, buf_1, kSize, buf_2); |
// Write at offset 0x800000000 (32 GB). |
- VerifySparseIO(entry, 0x800000000LL, buf_1.get(), kSize, buf_2.get()); |
+ VerifySparseIO(entry, 0x800000000LL, buf_1, kSize, buf_2); |
entry->Close(); |
+ AddDelayForTest(40); // We need to close multiple entries. |
+ WaitForEntryToClose(key); |
// Check everything again. |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
@@ -1660,6 +1683,12 @@ |
BasicSparseIO(); |
} |
+TEST_F(DiskCacheEntryTest, V3BasicSparseIO) { |
+ UseVersion3(); |
+ InitCache(); |
+ BasicSparseIO(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyBasicSparseIO) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -1678,8 +1707,9 @@ |
CacheTestFillBuffer(buf_1->data(), kSize, false); |
// Write at offset 0x20F0000 (33 MB - 64 KB). |
- VerifySparseIO(entry, 0x20F0000, buf_1.get(), kSize, buf_2.get()); |
+ VerifySparseIO(entry, 0x20F0000, buf_1, kSize, buf_2); |
entry->Close(); |
+ WaitForEntryToClose(key); |
// Check it again. |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
@@ -1692,13 +1722,19 @@ |
HugeSparseIO(); |
} |
+TEST_F(DiskCacheEntryTest, V3HugeSparseIO) { |
+ UseVersion3(); |
+ InitCache(); |
+ HugeSparseIO(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyHugeSparseIO) { |
SetMemoryOnlyMode(); |
InitCache(); |
HugeSparseIO(); |
} |
-void DiskCacheEntryTest::GetAvailableRange() { |
+void DiskCacheEntryTest::SparseGetAvailableRange() { |
std::string key("the first key"); |
disk_cache::Entry* entry; |
ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
@@ -1708,45 +1744,36 @@ |
CacheTestFillBuffer(buf->data(), kSize, false); |
// Write at offset 0x20F0000 (33 MB - 64 KB), and 0x20F4400 (33 MB - 47 KB). |
- EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf.get(), kSize)); |
- EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F4400, buf.get(), kSize)); |
+ EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf, kSize)); |
+ EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F4400, buf, kSize)); |
// We stop at the first empty block. |
int64 start; |
net::TestCompletionCallback cb; |
- int rv = entry->GetAvailableRange( |
- 0x20F0000, kSize * 2, &start, cb.callback()); |
+ int rv = entry->GetAvailableRange(0x20F0000, kSize * 2, &start, |
+ cb.callback()); |
EXPECT_EQ(kSize, cb.GetResult(rv)); |
EXPECT_EQ(0x20F0000, start); |
start = 0; |
- rv = entry->GetAvailableRange(0, kSize, &start, cb.callback()); |
- EXPECT_EQ(0, cb.GetResult(rv)); |
- rv = entry->GetAvailableRange( |
- 0x20F0000 - kSize, kSize, &start, cb.callback()); |
- EXPECT_EQ(0, cb.GetResult(rv)); |
- rv = entry->GetAvailableRange(0, 0x2100000, &start, cb.callback()); |
- EXPECT_EQ(kSize, cb.GetResult(rv)); |
+ EXPECT_EQ(0, GetAvailableRange(entry, 0, kSize, &start)); |
+ EXPECT_EQ(0, GetAvailableRange(entry, 0x20F0000 - kSize, kSize, &start)); |
+ EXPECT_EQ(kSize, GetAvailableRange(entry, 0, 0x2100000, &start)); |
EXPECT_EQ(0x20F0000, start); |
// We should be able to Read based on the results of GetAvailableRange. |
start = -1; |
- rv = entry->GetAvailableRange(0x2100000, kSize, &start, cb.callback()); |
- EXPECT_EQ(0, cb.GetResult(rv)); |
- rv = entry->ReadSparseData(start, buf.get(), kSize, cb.callback()); |
- EXPECT_EQ(0, cb.GetResult(rv)); |
+ EXPECT_EQ(0, GetAvailableRange(entry, 0x2100000, kSize, &start)); |
+ EXPECT_EQ(0, ReadSparseData(entry, start, buf, kSize)); |
start = 0; |
- rv = entry->GetAvailableRange(0x20F2000, kSize, &start, cb.callback()); |
- EXPECT_EQ(0x2000, cb.GetResult(rv)); |
+ EXPECT_EQ(0x2000, GetAvailableRange(entry, 0x20F2000, kSize, &start)); |
EXPECT_EQ(0x20F2000, start); |
- EXPECT_EQ(0x2000, ReadSparseData(entry, start, buf.get(), kSize)); |
+ EXPECT_EQ(0x2000, ReadSparseData(entry, start, buf, kSize)); |
// Make sure that we respect the |len| argument. |
start = 0; |
- rv = entry->GetAvailableRange( |
- 0x20F0001 - kSize, kSize, &start, cb.callback()); |
- EXPECT_EQ(1, cb.GetResult(rv)); |
+ EXPECT_EQ(1, GetAvailableRange(entry, 0x20F0001 - kSize, kSize, &start)); |
EXPECT_EQ(0x20F0000, start); |
entry->Close(); |
@@ -1754,13 +1781,19 @@ |
TEST_F(DiskCacheEntryTest, GetAvailableRange) { |
InitCache(); |
- GetAvailableRange(); |
+ SparseGetAvailableRange(); |
} |
+TEST_F(DiskCacheEntryTest, V3GetAvailableRange) { |
+ UseVersion3(); |
+ InitCache(); |
+ SparseGetAvailableRange(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyGetAvailableRange) { |
SetMemoryOnlyMode(); |
InitCache(); |
- GetAvailableRange(); |
+ SparseGetAvailableRange(); |
} |
void DiskCacheEntryTest::CouldBeSparse() { |
@@ -1773,14 +1806,16 @@ |
CacheTestFillBuffer(buf->data(), kSize, false); |
// Write at offset 0x20F0000 (33 MB - 64 KB). |
- EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf.get(), kSize)); |
+ EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf, kSize)); |
EXPECT_TRUE(entry->CouldBeSparse()); |
entry->Close(); |
+ WaitForEntryToClose(key); |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
EXPECT_TRUE(entry->CouldBeSparse()); |
entry->Close(); |
+ WaitForEntryToClose(key); |
// Now verify a regular entry. |
key.assign("another key"); |
@@ -1793,6 +1828,7 @@ |
EXPECT_FALSE(entry->CouldBeSparse()); |
entry->Close(); |
+ WaitForEntryToClose(key); |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
EXPECT_FALSE(entry->CouldBeSparse()); |
@@ -1804,6 +1840,12 @@ |
CouldBeSparse(); |
} |
+TEST_F(DiskCacheEntryTest, V3CouldBeSparse) { |
+ UseVersion3(); |
+ InitCache(); |
+ CouldBeSparse(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryCouldBeSparse) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -1827,8 +1869,8 @@ |
for (int i = 0; i < kSize; i += 1024) { |
scoped_refptr<net::WrappedIOBuffer> buf_3( |
new net::WrappedIOBuffer(buf_1->data() + i)); |
- VerifySparseIO(entry, i, buf_3.get(), 1024, buf_2.get()); |
- VerifySparseIO(entry, 9000 + i, buf_3.get(), 1024, buf_2.get()); |
+ VerifySparseIO(entry, i, buf_3, 1024, buf_2); |
+ VerifySparseIO(entry, 9000 + i, buf_3, 1024, buf_2); |
} |
// Make sure we have data written. |
@@ -1836,7 +1878,7 @@ |
VerifyContentSparseIO(entry, 9000, buf_1->data(), kSize); |
// This tests a large write that spans 3 entries from a misaligned offset. |
- VerifySparseIO(entry, 20481, buf_1.get(), 8192, buf_2.get()); |
+ VerifySparseIO(entry, 20481, buf_1, 8192, buf_2); |
entry->Close(); |
} |
@@ -1854,20 +1896,16 @@ |
ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
// Writes in the middle of an entry. |
- EXPECT_EQ( |
- 1024, |
- entry->WriteSparseData(0, buf.get(), 1024, net::CompletionCallback())); |
- EXPECT_EQ( |
- 1024, |
- entry->WriteSparseData(5120, buf.get(), 1024, net::CompletionCallback())); |
- EXPECT_EQ(1024, |
- entry->WriteSparseData( |
- 10000, buf.get(), 1024, net::CompletionCallback())); |
+ EXPECT_EQ(1024, entry->WriteSparseData(0, buf, 1024, |
+ net::CompletionCallback())); |
+ EXPECT_EQ(1024, entry->WriteSparseData(5120, buf, 1024, |
+ net::CompletionCallback())); |
+ EXPECT_EQ(1024, entry->WriteSparseData(10000, buf, 1024, |
+ net::CompletionCallback())); |
// Writes in the middle of an entry and spans 2 child entries. |
- EXPECT_EQ(8192, |
- entry->WriteSparseData( |
- 50000, buf.get(), 8192, net::CompletionCallback())); |
+ EXPECT_EQ(8192, entry->WriteSparseData(50000, buf, 8192, |
+ net::CompletionCallback())); |
int64 start; |
net::TestCompletionCallback cb; |
@@ -1918,12 +1956,12 @@ |
CacheTestFillBuffer(buf_1->data(), kSize, false); |
// Write at offset 0. |
- VerifySparseIO(entry1, 0, buf_1.get(), kSize, buf_2.get()); |
+ VerifySparseIO(entry1, 0, buf_1, kSize, buf_2); |
entry1->Close(); |
// Write at offset 2048. |
ASSERT_EQ(net::OK, OpenEntry(key, &entry1)); |
- VerifySparseIO(entry1, 2048, buf_1.get(), kSize, buf_2.get()); |
+ VerifySparseIO(entry1, 2048, buf_1, kSize, buf_2); |
disk_cache::Entry* entry2; |
ASSERT_EQ(net::OK, CreateEntry("the second key", &entry2)); |
@@ -1943,6 +1981,13 @@ |
UpdateSparseEntry(); |
} |
+TEST_F(DiskCacheEntryTest, V3UpdateSparseEntry) { |
+ UseVersion3(); |
+ SetCacheType(net::MEDIA_CACHE); |
+ InitCache(); |
+ UpdateSparseEntry(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyUpdateSparseEntry) { |
SetMemoryOnlyMode(); |
SetCacheType(net::MEDIA_CACHE); |
@@ -1981,6 +2026,8 @@ |
entry1->Doom(); |
entry1->Close(); |
entry2->Close(); |
+ WaitForEntryToClose(key1); |
+ WaitForEntryToClose(key2); |
// Doom the second entry after it's fully saved. |
EXPECT_EQ(net::OK, DoomEntry(key2)); |
@@ -1988,7 +2035,7 @@ |
// Make sure we do all needed work. This may fail for entry2 if between Close |
// and DoomEntry the system decides to remove all traces of the file from the |
// system cache so we don't see that there is pending IO. |
- base::MessageLoop::current()->RunUntilIdle(); |
+ WaitForEntryToClose(key2); |
if (memory_only_) { |
EXPECT_EQ(0, cache_->GetEntryCount()); |
@@ -1998,7 +2045,7 @@ |
// (it's always async on Posix so it is easy to miss). Unfortunately we |
// don't have any signal to watch for so we can only wait. |
base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(500)); |
- base::MessageLoop::current()->RunUntilIdle(); |
+ FlushQueueForTest(); |
} |
EXPECT_EQ(0, cache_->GetEntryCount()); |
} |
@@ -2010,6 +2057,13 @@ |
DoomSparseEntry(); |
} |
+TEST_F(DiskCacheEntryTest, V3DoomSparseEntry) { |
+ UseVersion3(); |
+ UseCurrentThread(); |
+ InitCache(); |
+ DoomSparseEntry(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryOnlyDoomSparseEntry) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -2038,8 +2092,9 @@ |
// Tests that we don't crash when the backend is deleted while we are working |
// deleting the sub-entries of a sparse entry. |
-TEST_F(DiskCacheEntryTest, DoomSparseEntry2) { |
+void DiskCacheEntryTest::DoomSparseEntry2() { |
UseCurrentThread(); |
+ ForceRandomCacheDir(); |
InitCache(); |
std::string key("the key"); |
disk_cache::Entry* entry; |
@@ -2052,21 +2107,34 @@ |
int64 offset = 1024; |
// Write to a bunch of ranges. |
for (int i = 0; i < 12; i++) { |
- EXPECT_EQ(kSize, |
- entry->WriteSparseData( |
- offset, buf.get(), kSize, net::CompletionCallback())); |
+ EXPECT_EQ(kSize, entry->WriteSparseData(offset, buf, kSize, |
+ net::CompletionCallback())); |
offset *= 4; |
} |
EXPECT_EQ(9, cache_->GetEntryCount()); |
entry->Close(); |
+ WaitForEntryToClose(key); |
+ |
disk_cache::Backend* cache = cache_.get(); |
SparseTestCompletionCallback cb(cache_.Pass()); |
int rv = cache->DoomEntry(key, cb.callback()); |
EXPECT_EQ(net::ERR_IO_PENDING, rv); |
EXPECT_EQ(net::OK, cb.WaitForResult()); |
+ |
+ cache_impl_ = NULL; |
+ cache_impl_v3_ = NULL; |
} |
+TEST_F(DiskCacheEntryTest, DoomSparseEntry2) { |
+ DoomSparseEntry2(); |
+} |
+ |
+TEST_F(DiskCacheEntryTest, V3DoomSparseEntry2) { |
+ UseVersion3(); |
+ DoomSparseEntry2(); |
+} |
+ |
void DiskCacheEntryTest::PartialSparseEntry() { |
std::string key("the first key"); |
disk_cache::Entry* entry; |
@@ -2082,25 +2150,25 @@ |
// The first write is just to extend the entry. The third write occupies |
// a 1KB block partially, it may not be written internally depending on the |
// implementation. |
- EXPECT_EQ(kSize, WriteSparseData(entry, 20000, buf1.get(), kSize)); |
- EXPECT_EQ(kSize, WriteSparseData(entry, 500, buf1.get(), kSize)); |
- EXPECT_EQ(kSmallSize, |
- WriteSparseData(entry, 1080321, buf1.get(), kSmallSize)); |
+ EXPECT_EQ(kSize, WriteSparseData(entry, 20000, buf1, kSize)); |
+ EXPECT_EQ(kSize, WriteSparseData(entry, 500, buf1, kSize)); |
+ EXPECT_EQ(kSmallSize, WriteSparseData(entry, 1080321, buf1, kSmallSize)); |
entry->Close(); |
+ WaitForEntryToClose(key); |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
scoped_refptr<net::IOBuffer> buf2(new net::IOBuffer(kSize)); |
memset(buf2->data(), 0, kSize); |
- EXPECT_EQ(0, ReadSparseData(entry, 8000, buf2.get(), kSize)); |
+ EXPECT_EQ(0, ReadSparseData(entry, 8000, buf2, kSize)); |
- EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2.get(), kSize)); |
+ EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2, kSize)); |
EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); |
- EXPECT_EQ(0, ReadSparseData(entry, 0, buf2.get(), kSize)); |
+ EXPECT_EQ(0, ReadSparseData(entry, 0, buf2, kSize)); |
// This read should not change anything. |
- EXPECT_EQ(96, ReadSparseData(entry, 24000, buf2.get(), kSize)); |
- EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2.get(), kSize)); |
- EXPECT_EQ(0, ReadSparseData(entry, 99, buf2.get(), kSize)); |
+ EXPECT_EQ(96, ReadSparseData(entry, 24000, buf2, kSize)); |
+ EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2, kSize)); |
+ EXPECT_EQ(0, ReadSparseData(entry, 99, buf2, kSize)); |
int rv; |
int64 start; |
@@ -2141,11 +2209,11 @@ |
EXPECT_EQ(4600, start); |
// Now make another write and verify that there is no hole in between. |
- EXPECT_EQ(kSize, WriteSparseData(entry, 500 + kSize, buf1.get(), kSize)); |
+ EXPECT_EQ(kSize, WriteSparseData(entry, 500 + kSize, buf1, kSize)); |
rv = entry->GetAvailableRange(1024, 10000, &start, cb.callback()); |
EXPECT_EQ(7 * 1024 + 500, cb.GetResult(rv)); |
EXPECT_EQ(1024, start); |
- EXPECT_EQ(kSize, ReadSparseData(entry, kSize, buf2.get(), kSize)); |
+ EXPECT_EQ(kSize, ReadSparseData(entry, kSize, buf2, kSize)); |
EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); |
EXPECT_EQ(0, memcmp(buf2->data() + 500, buf1->data(), kSize - 500)); |
@@ -2157,6 +2225,12 @@ |
PartialSparseEntry(); |
} |
+TEST_F(DiskCacheEntryTest, V3PartialSparseEntry) { |
+ UseVersion3(); |
+ InitCache(); |
+ PartialSparseEntry(); |
+} |
+ |
TEST_F(DiskCacheEntryTest, MemoryPartialSparseEntry) { |
SetMemoryOnlyMode(); |
InitCache(); |
@@ -2164,8 +2238,9 @@ |
} |
// Tests that corrupt sparse children are removed automatically. |
-TEST_F(DiskCacheEntryTest, CleanupSparseEntry) { |
+void DiskCacheEntryTest::CleanupSparseEntry() { |
InitCache(); |
+ SetNoBuffering(); |
std::string key("the first key"); |
disk_cache::Entry* entry; |
ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
@@ -2175,9 +2250,12 @@ |
CacheTestFillBuffer(buf1->data(), kSize, false); |
const int k1Meg = 1024 * 1024; |
- EXPECT_EQ(kSize, WriteSparseData(entry, 8192, buf1.get(), kSize)); |
- EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 8192, buf1.get(), kSize)); |
- EXPECT_EQ(kSize, WriteSparseData(entry, 2 * k1Meg + 8192, buf1.get(), kSize)); |
+ EXPECT_EQ(kSize, WriteSparseData(entry, 8192, buf1, kSize)); |
+ AddDelayForTest(70); |
+ EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 8192, buf1, kSize)); |
+ AddDelayForTest(70); |
+ EXPECT_EQ(kSize, WriteSparseData(entry, 2 * k1Meg + 8192, buf1, kSize)); |
+ AddDelayForTest(70); |
entry->Close(); |
EXPECT_EQ(4, cache_->GetEntryCount()); |
@@ -2202,21 +2280,30 @@ |
ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
// Two children should be gone. One while reading and one while writing. |
- EXPECT_EQ(0, ReadSparseData(entry, 2 * k1Meg + 8192, buf1.get(), kSize)); |
- EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 16384, buf1.get(), kSize)); |
- EXPECT_EQ(0, ReadSparseData(entry, k1Meg + 8192, buf1.get(), kSize)); |
+ EXPECT_EQ(0, ReadSparseData(entry, 2 * k1Meg + 8192, buf1, kSize)); |
+ EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 16384, buf1, kSize)); |
+ EXPECT_EQ(0, ReadSparseData(entry, k1Meg + 8192, buf1, kSize)); |
// We never touched this one. |
- EXPECT_EQ(kSize, ReadSparseData(entry, 8192, buf1.get(), kSize)); |
+ EXPECT_EQ(kSize, ReadSparseData(entry, 8192, buf1, kSize)); |
entry->Close(); |
// We re-created one of the corrupt children. |
EXPECT_EQ(3, cache_->GetEntryCount()); |
} |
-TEST_F(DiskCacheEntryTest, CancelSparseIO) { |
- UseCurrentThread(); |
+TEST_F(DiskCacheEntryTest, CleanupSparseEntry) { |
+ CleanupSparseEntry(); |
+} |
+ |
+TEST_F(DiskCacheEntryTest, V3CleanupSparseEntry) { |
+ UseVersion3(); |
+ CleanupSparseEntry(); |
+} |
+ |
+void DiskCacheEntryTest::CancelSparseIO() { |
InitCache(); |
+ SetNoBuffering(); |
std::string key("the first key"); |
disk_cache::Entry* entry; |
ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
@@ -2227,8 +2314,8 @@ |
// This will open and write two "real" entries. |
net::TestCompletionCallback cb1, cb2, cb3, cb4, cb5; |
- int rv = entry->WriteSparseData( |
- 1024 * 1024 - 4096, buf.get(), kSize, cb1.callback()); |
+ int rv = entry->WriteSparseData(1024 * 1024 - kSize / 2, buf, kSize, |
+ cb1.callback()); |
EXPECT_EQ(net::ERR_IO_PENDING, rv); |
int64 offset = 0; |
@@ -2249,17 +2336,17 @@ |
if (!cb1.have_result()) { |
EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, |
- entry->ReadSparseData( |
- offset, buf.get(), kSize, net::CompletionCallback())); |
+ entry->ReadSparseData(offset, buf, kSize, |
+ net::CompletionCallback())); |
EXPECT_EQ(net::ERR_CACHE_OPERATION_NOT_SUPPORTED, |
- entry->WriteSparseData( |
- offset, buf.get(), kSize, net::CompletionCallback())); |
+ entry->WriteSparseData(offset, buf, kSize, |
+ net::CompletionCallback())); |
} |
// Now see if we receive all notifications. Note that we should not be able |
// to write everything (unless the timing of the system is really weird). |
rv = cb1.WaitForResult(); |
- EXPECT_TRUE(rv == 4096 || rv == kSize); |
+ EXPECT_TRUE(rv == kSize / 2 || rv == kSize); |
EXPECT_EQ(net::OK, cb2.WaitForResult()); |
EXPECT_EQ(net::OK, cb3.WaitForResult()); |
EXPECT_EQ(net::OK, cb4.WaitForResult()); |
@@ -2269,6 +2356,48 @@ |
entry->Close(); |
} |
+TEST_F(DiskCacheEntryTest, CancelSparseIO) { |
+ UseCurrentThread(); |
+ CancelSparseIO(); |
+} |
+ |
+TEST_F(DiskCacheEntryTest, V3CancelSparseIO) { |
+ UseVersion3(); |
+ CancelSparseIO(); |
+} |
+ |
+// Tests a squence of Close + Open + ReadyForSparseIO + ReadSparseData. |
+void DiskCacheEntryTest::ReadyForSparseIONoCancel() { |
+ InitCache(); |
+ SetNoBuffering(); |
+ std::string key("the key"); |
+ disk_cache::Entry* entry; |
+ ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
+ |
+ const int kSize = 4 * 1024; |
+ scoped_refptr<net::IOBuffer> buf1(new net::IOBuffer(kSize)); |
+ CacheTestFillBuffer(buf1->data(), kSize, false); |
+ EXPECT_EQ(kSize, WriteSparseData(entry, 1024 * 1024 - kSize, buf1, kSize)); |
+ |
+ entry->Close(); |
+ WaitForEntryToClose(key); |
+ ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
+ net::TestCompletionCallback cb; |
+ EXPECT_EQ(net::OK, cb.GetResult(entry->ReadyForSparseIO(cb.callback()))); |
+ EXPECT_EQ(kSize, ReadSparseData(entry, 1024 * 1024 - kSize, buf1, kSize)); |
+ entry->Close(); |
+} |
+ |
+TEST_F(DiskCacheEntryTest, ReadyForSparseIONoCancel) { |
+ UseVersion3(); |
+ ReadyForSparseIONoCancel(); |
+} |
+ |
+TEST_F(DiskCacheEntryTest, V3ReadyForSparseIONoCancel) { |
+ UseVersion3(); |
+ ReadyForSparseIONoCancel(); |
+} |
+ |
// Tests that we perform sanity checks on an entry's key. Note that there are |
// other tests that exercise sanity checks by using saved corrupt files. |
TEST_F(DiskCacheEntryTest, KeySanityCheck) { |