| 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) {
|
|
|