| Index: net/disk_cache/entry_unittest.cc
|
| ===================================================================
|
| --- net/disk_cache/entry_unittest.cc (revision 199883)
|
| +++ net/disk_cache/entry_unittest.cc (working copy)
|
| @@ -35,6 +35,7 @@
|
| protected:
|
| void InternalSyncIO();
|
| void InternalAsyncIO();
|
| + void InternalConcurrentIO();
|
| void ExternalSyncIO();
|
| void ExternalAsyncIO();
|
| void ReleaseBuffer();
|
| @@ -53,14 +54,19 @@
|
| 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 SimpleCacheMakeBadChecksumEntry(const char* key);
|
| + void CleanupSparseEntry();
|
| + void CancelSparseIO();
|
| + void ReadyForSparseIONoCancel();
|
| };
|
|
|
| // This part of the test runs on the background thread.
|
| @@ -68,14 +74,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, 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, 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, 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;
|
| @@ -85,33 +91,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, 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, 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, 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, kSize2, net::CompletionCallback()));
|
| + EXPECT_EQ(1500, entry->ReadData(1, 5000, buffer2.get(), kSize2,
|
| + net::CompletionCallback()));
|
|
|
| - EXPECT_EQ(0, entry->ReadData(
|
| - 1, 6500, buffer2, kSize2, net::CompletionCallback()));
|
| - EXPECT_EQ(6500, entry->ReadData(
|
| - 1, 0, buffer3, kSize3, net::CompletionCallback()));
|
| - EXPECT_EQ(8192, entry->WriteData(
|
| - 1, 0, buffer3, 8192, net::CompletionCallback(), false));
|
| - EXPECT_EQ(8192, entry->ReadData(
|
| - 1, 0, buffer3, 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
|
| @@ -163,19 +169,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;
|
| @@ -187,101 +188,66 @@
|
| CacheTestFillBuffer(buffer2->data(), kSize2, false);
|
| CacheTestFillBuffer(buffer3->data(), kSize3, false);
|
|
|
| - EXPECT_EQ(0, entry->ReadData(
|
| - 0, 15 * 1024, buffer1, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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++;
|
| @@ -301,6 +267,12 @@
|
| InternalAsyncIO();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3InternalAsyncIO) {
|
| + UseVersion3();
|
| + InitCache();
|
| + InternalAsyncIO();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryOnlyInternalAsyncIO) {
|
| SetMemoryOnlyMode();
|
| InitCache();
|
| @@ -316,39 +288,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, 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, 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, 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, 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, kSize2, net::CompletionCallback()));
|
| - EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000));
|
| - EXPECT_EQ(5000, entry->ReadData(
|
| - 1, 30000, buffer2, 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, kSize2, net::CompletionCallback()));
|
| - EXPECT_EQ(17000, entry->ReadData(
|
| - 1, 0, buffer1, kSize1, net::CompletionCallback()));
|
| - EXPECT_EQ(17000, entry->WriteData(
|
| - 1, 20000, buffer1, 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() {
|
| @@ -371,9 +342,15 @@
|
| ExternalSyncIO();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3ExternalSyncIO) {
|
| + UseVersion3();
|
| + InitCache();
|
| + ExternalSyncIO();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, ExternalSyncIONoBuffer) {
|
| InitCache();
|
| - cache_impl_->SetFlags(disk_cache::kNoBuffering);
|
| + SetNoBuffering();
|
| ExternalSyncIO();
|
| }
|
|
|
| @@ -391,15 +368,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;
|
| @@ -410,76 +382,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, 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, 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, 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, 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, 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, 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, kSize2,
|
| - base::Bind(&CallbackTest::Run, base::Unretained(&callback7))));
|
| - ret = entry->ReadData(
|
| - 1, 0, buffer1, kSize1,
|
| - base::Bind(&CallbackTest::Run, base::Unretained(&callback8)));
|
| + EXPECT_EQ(0,
|
| + 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, 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++;
|
| @@ -500,12 +435,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();
|
| @@ -523,17 +471,25 @@
|
| CacheTestFillBuffer(buffer->data(), kBufferSize, false);
|
|
|
| net::ReleaseBufferCompletionCallback cb(buffer);
|
| - int rv = entry->WriteData(0, 0, buffer, kBufferSize, cb.callback(), false);
|
| + 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();
|
| @@ -554,15 +510,15 @@
|
| }
|
| 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],
|
| + 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, kBufferSize));
|
| + EXPECT_EQ(kBufferSize, ReadData(entry, i, 0, buffer1.get(), kBufferSize));
|
| EXPECT_EQ(0, memcmp(reference_buffers[i]->data(), buffer1->data(),
|
| kBufferSize));
|
| }
|
| EXPECT_EQ(net::ERR_INVALID_ARGUMENT,
|
| - ReadData(entry, kNumStreams, 0, buffer1, kBufferSize));
|
| + ReadData(entry, kNumStreams, 0, buffer1.get(), kBufferSize));
|
| entry->Close();
|
|
|
| // Open the entry and read it in chunks, including a read past the end.
|
| @@ -574,13 +530,14 @@
|
| scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kReadBufferSize));
|
| for (int i = 0; i < kNumStreams; i++) {
|
| memset(buffer2->data(), 0, kReadBufferSize);
|
| - EXPECT_EQ(kReadBufferSize, ReadData(entry, i, 0, buffer2, kReadBufferSize));
|
| + EXPECT_EQ(kReadBufferSize,
|
| + ReadData(entry, i, 0, buffer2.get(), 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, kReadBufferSize));
|
| + buffer2.get(), kReadBufferSize));
|
| EXPECT_EQ(0, memcmp(reference_buffers[i]->data() + kReadBufferSize,
|
| buffer2->data(), kFinalReadSize));
|
| }
|
| @@ -593,6 +550,12 @@
|
| StreamAccess();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3StreamAccess) {
|
| + UseVersion3();
|
| + InitCache();
|
| + StreamAccess();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryOnlyStreamAccess) {
|
| SetMemoryOnlyMode();
|
| InitCache();
|
| @@ -605,6 +568,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);
|
| @@ -617,6 +581,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';
|
| @@ -624,6 +589,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';
|
| @@ -632,6 +598,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';
|
| @@ -647,6 +614,12 @@
|
| GetKey();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3GetKey) {
|
| + UseVersion3();
|
| + InitCache();
|
| + GetKey();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryOnlyGetKey) {
|
| SetMemoryOnlyMode();
|
| InitCache();
|
| @@ -678,7 +651,7 @@
|
| EXPECT_TRUE(t3 > t2);
|
| const int kSize = 200;
|
| scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
|
| - EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer.get(), kSize));
|
| if (type_ == net::APP_CACHE) {
|
| EXPECT_TRUE(entry->GetLastUsed() < t2);
|
| EXPECT_TRUE(entry->GetLastModified() < t2);
|
| @@ -697,6 +670,12 @@
|
| GetTimes();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3GetTimes) {
|
| + UseVersion3();
|
| + InitCache();
|
| + GetTimes();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryOnlyGetTimes) {
|
| SetMemoryOnlyMode();
|
| InitCache();
|
| @@ -727,53 +706,57 @@
|
| memset(buffer2->data(), 0, kSize);
|
|
|
| base::strlcpy(buffer1->data(), "the data", kSize);
|
| - EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1, 10, false));
|
| - EXPECT_EQ(10, ReadData(entry, 0, 0, buffer2, 10));
|
| + EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1.get(), 10, false));
|
| + EXPECT_EQ(10, ReadData(entry, 0, 0, buffer2.get(), 10));
|
| EXPECT_STREQ("the data", buffer2->data());
|
| EXPECT_EQ(10, entry->GetDataSize(0));
|
|
|
| - EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false));
|
| + EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1.get(), 2000, false));
|
| EXPECT_EQ(2000, entry->GetDataSize(0));
|
| - EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000));
|
| + EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2.get(), 2000));
|
| EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000));
|
|
|
| - EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, kSize, false));
|
| + EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1.get(), kSize, false));
|
| EXPECT_EQ(20000, entry->GetDataSize(0));
|
| - EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, kSize));
|
| + EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize));
|
| entry->Close();
|
|
|
| memset(buffer2->data(), 0, kSize);
|
| std::string key2("Second key");
|
| ASSERT_EQ(net::OK, CreateEntry(key2, &entry));
|
| - EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1, 10, false));
|
| + 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));
|
| - EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false));
|
| + EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1.get(), 2000, false));
|
| EXPECT_EQ(2000, entry->GetDataSize(0));
|
| - EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000));
|
| + 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.
|
| ASSERT_EQ(net::OK, OpenEntry(key2, &entry));
|
| - EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, kSize, false));
|
| + EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1.get(), kSize, false));
|
| EXPECT_EQ(20000, entry->GetDataSize(0));
|
| - EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, kSize));
|
| + 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));
|
| EXPECT_EQ(20000, entry->GetDataSize(0));
|
|
|
| // Now extend the entry without actual data.
|
| - EXPECT_EQ(0, WriteData(entry, 0, 45500, buffer1, 0, false));
|
| + 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));
|
| @@ -786,6 +769,12 @@
|
| GrowData();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3GrowData) {
|
| + UseVersion3();
|
| + InitCache();
|
| + GrowData();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, GrowDataNoBuffer) {
|
| InitCache();
|
| cache_impl_->SetFlags(disk_cache::kNoBuffering);
|
| @@ -812,47 +801,48 @@
|
| memset(buffer2->data(), 0, kSize2);
|
|
|
| // Simple truncation:
|
| - EXPECT_EQ(200, WriteData(entry, 0, 0, buffer1, 200, false));
|
| + EXPECT_EQ(200, WriteData(entry, 0, 0, buffer1.get(), 200, false));
|
| EXPECT_EQ(200, entry->GetDataSize(0));
|
| - EXPECT_EQ(100, WriteData(entry, 0, 0, buffer1, 100, false));
|
| + EXPECT_EQ(100, WriteData(entry, 0, 0, buffer1.get(), 100, false));
|
| EXPECT_EQ(200, entry->GetDataSize(0));
|
| - EXPECT_EQ(100, WriteData(entry, 0, 0, buffer1, 100, true));
|
| + EXPECT_EQ(100, WriteData(entry, 0, 0, buffer1.get(), 100, true));
|
| EXPECT_EQ(100, entry->GetDataSize(0));
|
| - EXPECT_EQ(0, WriteData(entry, 0, 50, buffer1, 0, true));
|
| + EXPECT_EQ(0, WriteData(entry, 0, 50, buffer1.get(), 0, true));
|
| EXPECT_EQ(50, entry->GetDataSize(0));
|
| - EXPECT_EQ(0, WriteData(entry, 0, 0, buffer1, 0, true));
|
| + 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.
|
| - EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, 20000, true));
|
| + EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1.get(), 20000, true));
|
| EXPECT_EQ(20000, entry->GetDataSize(0));
|
| - EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, 20000));
|
| + EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2.get(), 20000));
|
| EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 20000));
|
| memset(buffer2->data(), 0, kSize2);
|
|
|
| // External file truncation
|
| - EXPECT_EQ(18000, WriteData(entry, 0, 0, buffer1, 18000, false));
|
| + EXPECT_EQ(18000, WriteData(entry, 0, 0, buffer1.get(), 18000, false));
|
| EXPECT_EQ(20000, entry->GetDataSize(0));
|
| - EXPECT_EQ(18000, WriteData(entry, 0, 0, buffer1, 18000, true));
|
| + EXPECT_EQ(18000, WriteData(entry, 0, 0, buffer1.get(), 18000, true));
|
| EXPECT_EQ(18000, entry->GetDataSize(0));
|
| - EXPECT_EQ(0, WriteData(entry, 0, 17500, buffer1, 0, true));
|
| + EXPECT_EQ(0, WriteData(entry, 0, 17500, buffer1.get(), 0, true));
|
| EXPECT_EQ(17500, entry->GetDataSize(0));
|
|
|
| // And back to an internal block.
|
| - EXPECT_EQ(600, WriteData(entry, 0, 1000, buffer1, 600, true));
|
| + EXPECT_EQ(600, WriteData(entry, 0, 1000, buffer1.get(), 600, true));
|
| EXPECT_EQ(1600, entry->GetDataSize(0));
|
| - EXPECT_EQ(600, ReadData(entry, 0, 1000, buffer2, 600));
|
| + 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, 1000));
|
| + EXPECT_EQ(1000, ReadData(entry, 0, 0, buffer2.get(), 1000));
|
| 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, 20000, true));
|
| + EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1.get(), 20000, true));
|
| EXPECT_EQ(20000, entry->GetDataSize(0));
|
| - EXPECT_EQ(0, WriteData(entry, 0, 0, buffer1, 0, true));
|
| + EXPECT_EQ(0, WriteData(entry, 0, 0, buffer1.get(), 0, true));
|
| EXPECT_EQ(0, entry->GetDataSize(0));
|
|
|
| entry->Close();
|
| @@ -863,12 +853,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();
|
| @@ -899,15 +902,15 @@
|
| scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
|
|
|
| CacheTestFillBuffer(buffer->data(), kSize, false);
|
| - EXPECT_EQ(kSize, ReadData(entry, 0, 500, buffer, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 0, 500, buffer.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize));
|
|
|
| CacheTestFillBuffer(buffer->data(), kSize, false);
|
| - EXPECT_EQ(kSize, ReadData(entry, 0, 5000, buffer, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 0, 5000, buffer.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize));
|
|
|
| CacheTestFillBuffer(buffer->data(), kSize, false);
|
| - EXPECT_EQ(kSize, ReadData(entry, 0, 50000, buffer, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 0, 50000, buffer.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize));
|
|
|
| entry->Close();
|
| @@ -918,12 +921,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();
|
| @@ -943,66 +959,69 @@
|
| CacheTestFillBuffer(buffer1->data(), kSize, true);
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
|
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1, kSize, false));
|
| + 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));
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 5000, buffer1, kSize, false));
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2, kSize));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 5000, buffer1.get(), kSize, false));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
|
|
|
| // Now go to an external file.
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 18000, buffer1, kSize, false));
|
| + 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));
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 10000, buffer1, kSize, false));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 10000, buffer1.get(), kSize, false));
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 5000, buffer2, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 5000, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
|
|
|
| // Extend the file some more.
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1, kSize, false));
|
| + 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));
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1, kSize, false));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1.get(), kSize, false));
|
|
|
| // We should not overwrite the data at 18000 with this.
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1, kSize, false));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1.get(), kSize, false));
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 17000, buffer2, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 17000, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
|
|
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 22900, buffer1, kSize, false));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 22900, buffer1.get(), kSize, false));
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
| - EXPECT_EQ(100, ReadData(entry, 1, 23000, buffer2, kSize));
|
| + EXPECT_EQ(100, ReadData(entry, 1, 23000, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100));
|
|
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
| - EXPECT_EQ(100, ReadData(entry, 1, 23100, buffer2, kSize));
|
| + EXPECT_EQ(100, ReadData(entry, 1, 23100, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100));
|
|
|
| // Extend the file again and read before without closing the entry.
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, false));
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 45000, buffer1, kSize, false));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1.get(), kSize, false));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 45000, buffer1.get(), kSize, false));
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 25000, buffer2, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 25000, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 45000, buffer2, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 45000, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize));
|
|
|
| entry->Close();
|
| @@ -1013,12 +1032,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";
|
| @@ -1036,6 +1068,12 @@
|
| SizeAtCreate();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3SizeAtCreate) {
|
| + UseVersion3();
|
| + InitCache();
|
| + SizeAtCreate();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryOnlySizeAtCreate) {
|
| SetMemoryOnlyMode();
|
| InitCache();
|
| @@ -1056,67 +1094,73 @@
|
| CacheTestFillBuffer(buffer1->data(), kSize, true);
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
|
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1, kSize, true));
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1, kSize, true));
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1, kSize, true));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1.get(), kSize, true));
|
| + 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));
|
| EXPECT_EQ(23000 + kSize, entry->GetDataSize(1));
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, true));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1.get(), kSize, true));
|
| EXPECT_EQ(25000 + kSize, entry->GetDataSize(1));
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 24000, buffer2, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 24000, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), zeros, kSize));
|
|
|
| // Read at the end of the old file size.
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 23000 + kSize - 35, buffer2, kSize));
|
| + EXPECT_EQ(kSize,
|
| + ReadData(entry, 1, 23000 + kSize - 35, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + kSize - 35, 35));
|
|
|
| // Read slightly before the last write.
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 24900, buffer2, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 24900, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100));
|
| EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100));
|
|
|
| // Extend the entry a little more.
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 26000, buffer1, kSize, true));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 26000, buffer1.get(), kSize, true));
|
| EXPECT_EQ(26000 + kSize, entry->GetDataSize(1));
|
| CacheTestFillBuffer(buffer2->data(), kSize, true);
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 25900, buffer2, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 25900, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100));
|
| EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100));
|
|
|
| // And now reduce the size.
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, true));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1.get(), kSize, true));
|
| EXPECT_EQ(25000 + kSize, entry->GetDataSize(1));
|
| - EXPECT_EQ(28, ReadData(entry, 1, 25000 + kSize - 28, buffer2, kSize));
|
| + EXPECT_EQ(28, ReadData(entry, 1, 25000 + kSize - 28, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + kSize - 28, 28));
|
|
|
| // Reduce the size with a buffer that is not extending the size.
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 24000, buffer1, kSize, false));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 24000, buffer1.get(), kSize, false));
|
| EXPECT_EQ(25000 + kSize, entry->GetDataSize(1));
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 24500, buffer1, kSize, true));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 24500, buffer1.get(), kSize, true));
|
| EXPECT_EQ(24500 + kSize, entry->GetDataSize(1));
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 23900, buffer2, kSize));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 23900, buffer2.get(), kSize));
|
| EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100));
|
| EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100));
|
|
|
| // And now reduce the size below the old size.
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1, kSize, true));
|
| + 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, 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));
|
|
|
| // Extend the newly opened file with a zero length write, expect zero fill.
|
| - EXPECT_EQ(0, WriteData(entry, 1, 20000 + kSize, buffer1, 0, false));
|
| - EXPECT_EQ(kSize, ReadData(entry, 1, 19000 + kSize, buffer1, kSize));
|
| + EXPECT_EQ(0, WriteData(entry, 1, 20000 + kSize, buffer1.get(), 0, false));
|
| + EXPECT_EQ(kSize, ReadData(entry, 1, 19000 + kSize, buffer1.get(), kSize));
|
| EXPECT_EQ(0, memcmp(buffer1->data(), zeros, kSize));
|
|
|
| entry->Close();
|
| @@ -1127,12 +1171,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) {
|
| @@ -1148,9 +1205,10 @@
|
| CacheTestFillBuffer(buffer->data(), size, false);
|
|
|
| for (int i = 0; i < 15; i++) {
|
| - EXPECT_EQ(0, WriteData(entry, 0, 0, buffer, 0, true));
|
| - EXPECT_EQ(size, WriteData(entry, 0, 0, buffer, size, false));
|
| + 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));
|
| }
|
|
|
| @@ -1165,6 +1223,13 @@
|
| ReuseEntry(20 * 1024);
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3ReuseExternalEntry) {
|
| + UseVersion3();
|
| + SetMaxSize(200 * 1024);
|
| + InitCache();
|
| + ReuseEntry(20 * 1024);
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryOnlyReuseExternalEntry) {
|
| SetMemoryOnlyMode();
|
| SetMaxSize(200 * 1024);
|
| @@ -1178,6 +1243,13 @@
|
| ReuseEntry(10 * 1024);
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3ReuseInternalEntry) {
|
| + UseVersion3();
|
| + SetMaxSize(100 * 1024);
|
| + InitCache();
|
| + ReuseEntry(10 * 1024);
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryOnlyReuseInternalEntry) {
|
| SetMemoryOnlyMode();
|
| SetMaxSize(100 * 1024);
|
| @@ -1202,49 +1274,51 @@
|
| memset(buffer2->data(), 0, kSize2);
|
|
|
| // Simple data grow:
|
| - EXPECT_EQ(200, WriteData(entry, 0, 400, buffer1, 200, false));
|
| + EXPECT_EQ(200, WriteData(entry, 0, 400, buffer1.get(), 200, false));
|
| EXPECT_EQ(600, entry->GetDataSize(0));
|
| - EXPECT_EQ(100, ReadData(entry, 0, 300, buffer3, 100));
|
| + 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.
|
| - EXPECT_EQ(200, WriteData(entry, 0, 800, buffer1, 200, false));
|
| + EXPECT_EQ(200, WriteData(entry, 0, 800, buffer1.get(), 200, false));
|
| EXPECT_EQ(1000, entry->GetDataSize(0));
|
| - EXPECT_EQ(100, ReadData(entry, 0, 700, buffer3, 100));
|
| + 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.
|
| - EXPECT_EQ(200, WriteData(entry, 0, 1800, buffer1, 200, true));
|
| + EXPECT_EQ(200, WriteData(entry, 0, 1800, buffer1.get(), 200, true));
|
| EXPECT_EQ(2000, entry->GetDataSize(0));
|
| - EXPECT_EQ(100, ReadData(entry, 0, 1500, buffer3, 100));
|
| + EXPECT_EQ(100, ReadData(entry, 0, 1500, buffer3.get(), 100));
|
| EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100));
|
|
|
| // Go to an external file.
|
| - EXPECT_EQ(200, WriteData(entry, 0, 19800, buffer1, 200, false));
|
| + EXPECT_EQ(200, WriteData(entry, 0, 19800, buffer1.get(), 200, false));
|
| EXPECT_EQ(20000, entry->GetDataSize(0));
|
| - EXPECT_EQ(4000, ReadData(entry, 0, 14000, buffer3, 4000));
|
| + EXPECT_EQ(4000, ReadData(entry, 0, 14000, buffer3.get(), 4000));
|
| EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 4000));
|
|
|
| // And back to an internal block.
|
| - EXPECT_EQ(600, WriteData(entry, 0, 1000, buffer1, 600, true));
|
| + EXPECT_EQ(600, WriteData(entry, 0, 1000, buffer1.get(), 600, true));
|
| EXPECT_EQ(1600, entry->GetDataSize(0));
|
| - EXPECT_EQ(600, ReadData(entry, 0, 1000, buffer3, 600));
|
| + EXPECT_EQ(600, ReadData(entry, 0, 1000, buffer3.get(), 600));
|
| EXPECT_TRUE(!memcmp(buffer3->data(), buffer1->data(), 600));
|
|
|
| // Extend it again.
|
| - EXPECT_EQ(600, WriteData(entry, 0, 2000, buffer1, 600, false));
|
| + EXPECT_EQ(600, WriteData(entry, 0, 2000, buffer1.get(), 600, false));
|
| EXPECT_EQ(2600, entry->GetDataSize(0));
|
| - EXPECT_EQ(200, ReadData(entry, 0, 1800, buffer3, 200));
|
| + EXPECT_EQ(200, ReadData(entry, 0, 1800, buffer3.get(), 200));
|
| EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200));
|
|
|
| // And again (with truncation flag).
|
| - EXPECT_EQ(600, WriteData(entry, 0, 3000, buffer1, 600, true));
|
| + EXPECT_EQ(600, WriteData(entry, 0, 3000, buffer1.get(), 600, true));
|
| EXPECT_EQ(3600, entry->GetDataSize(0));
|
| - EXPECT_EQ(200, ReadData(entry, 0, 2800, buffer3, 200));
|
| + EXPECT_EQ(200, ReadData(entry, 0, 2800, buffer3.get(), 200));
|
| EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200));
|
|
|
| entry->Close();
|
| @@ -1255,12 +1329,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();
|
| @@ -1273,13 +1360,13 @@
|
| 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);
|
|
|
| net::TestCompletionCallback cb;
|
| EXPECT_EQ(net::ERR_IO_PENDING,
|
| - entry->WriteData(0, 0, buffer, kSize, cb.callback(), false));
|
| + entry->WriteData(0, 0, buffer.get(), kSize, cb.callback(), false));
|
|
|
| // Release our reference to the buffer.
|
| buffer = NULL;
|
| @@ -1290,7 +1377,7 @@
|
| CacheTestFillBuffer(buffer->data(), kSize, false);
|
|
|
| EXPECT_EQ(net::ERR_IO_PENDING,
|
| - entry->ReadData(0, 0, buffer, kSize, cb.callback()));
|
| + entry->ReadData(0, 0, buffer.get(), kSize, cb.callback()));
|
| buffer = NULL;
|
| EXPECT_EQ(kSize, cb.WaitForResult());
|
|
|
| @@ -1302,6 +1389,13 @@
|
| ReadWriteDestroyBuffer();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3ReadWriteDestroyBuffer) {
|
| + UseVersion3();
|
| + InitCache();
|
| + SetNoBuffering();
|
| + ReadWriteDestroyBuffer();
|
| +}
|
| +
|
| void DiskCacheEntryTest::DoomNormalEntry() {
|
| std::string key("the first key");
|
| disk_cache::Entry* entry;
|
| @@ -1316,8 +1410,8 @@
|
|
|
| key = buffer->data();
|
| ASSERT_EQ(net::OK, CreateEntry(key, &entry));
|
| - EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer, kSize, false));
|
| - EXPECT_EQ(20000, WriteData(entry, 1, 0, buffer, kSize, false));
|
| + EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer.get(), kSize, false));
|
| + EXPECT_EQ(20000, WriteData(entry, 1, 0, buffer.get(), kSize, false));
|
| entry->Doom();
|
| entry->Close();
|
|
|
| @@ -1330,6 +1424,12 @@
|
| DoomNormalEntry();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3DoomEntry) {
|
| + UseVersion3();
|
| + InitCache();
|
| + DoomNormalEntry();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryOnlyDoomEntry) {
|
| SetMemoryOnlyMode();
|
| InitCache();
|
| @@ -1366,6 +1466,12 @@
|
| DoomEntryNextToOpenEntry();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3DoomEntryNextToOpenEntry) {
|
| + UseVersion3();
|
| + InitCache();
|
| + DoomEntryNextToOpenEntry();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, NewEvictionDoomEntryNextToOpenEntry) {
|
| SetNewEviction();
|
| InitCache();
|
| @@ -1397,8 +1503,8 @@
|
| CacheTestFillBuffer(buffer1->data(), kSize1, false);
|
| memset(buffer2->data(), 0, kSize2);
|
|
|
| - EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false));
|
| - EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000));
|
| + EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1.get(), 2000, false));
|
| + EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2.get(), 2000));
|
| EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize1));
|
| EXPECT_EQ(key, entry->GetKey());
|
| EXPECT_TRUE(initial < entry->GetLastModified());
|
| @@ -1412,14 +1518,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");
|
| @@ -1430,23 +1541,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, 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(file_util::Delete(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, kSize));
|
| + EXPECT_EQ(net::ERR_FILE_NOT_FOUND,
|
| + 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) {
|
| @@ -1537,6 +1662,8 @@
|
| 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));
|
| @@ -1551,6 +1678,12 @@
|
| BasicSparseIO();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3BasicSparseIO) {
|
| + UseVersion3();
|
| + InitCache();
|
| + BasicSparseIO();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryOnlyBasicSparseIO) {
|
| SetMemoryOnlyMode();
|
| InitCache();
|
| @@ -1571,6 +1704,7 @@
|
| // Write at offset 0x20F0000 (33 MB - 64 KB).
|
| VerifySparseIO(entry, 0x20F0000, buf_1, kSize, buf_2);
|
| entry->Close();
|
| + WaitForEntryToClose(key);
|
|
|
| // Check it again.
|
| ASSERT_EQ(net::OK, OpenEntry(key, &entry));
|
| @@ -1583,13 +1717,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));
|
| @@ -1605,39 +1745,44 @@
|
| // 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));
|
| + //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(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, kSize, cb.callback());
|
| - EXPECT_EQ(0, cb.GetResult(rv));
|
| + EXPECT_EQ(0, GetAvailableRange(entry, 0x2100000, kSize, &start));
|
| + //rv = entry->GetAvailableRange(0x2100000, kSize, &start, cb.callback());
|
| + //EXPECT_EQ(0, cb.GetResult(rv));
|
| + EXPECT_EQ(0, ReadSparseData(entry, start, buf, kSize));
|
| + //rv = entry->ReadSparseData(start, buf, kSize, cb.callback());
|
| + //EXPECT_EQ(0, cb.GetResult(rv));
|
|
|
| start = 0;
|
| - rv = entry->GetAvailableRange(0x20F2000, kSize, &start, cb.callback());
|
| - EXPECT_EQ(0x2000, cb.GetResult(rv));
|
| + EXPECT_EQ(0x2000, GetAvailableRange(entry, 0x20F2000, kSize, &start));
|
| + //rv = entry->GetAvailableRange(0x20F2000, kSize, &start, cb.callback());
|
| + //EXPECT_EQ(0x2000, cb.GetResult(rv));
|
| EXPECT_EQ(0x20F2000, start);
|
| 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));
|
| + //rv = entry->GetAvailableRange(0x20F0001 - kSize, kSize, &start,
|
| + // cb.callback());
|
| + //EXPECT_EQ(1, cb.GetResult(rv));
|
| EXPECT_EQ(0x20F0000, start);
|
|
|
| entry->Close();
|
| @@ -1645,13 +1790,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() {
|
| @@ -1668,22 +1819,25 @@
|
|
|
| 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");
|
| ASSERT_EQ(net::OK, CreateEntry(key, &entry));
|
| EXPECT_FALSE(entry->CouldBeSparse());
|
|
|
| - EXPECT_EQ(kSize, WriteData(entry, 0, 0, buf, kSize, false));
|
| - EXPECT_EQ(kSize, WriteData(entry, 1, 0, buf, kSize, false));
|
| - EXPECT_EQ(kSize, WriteData(entry, 2, 0, buf, kSize, false));
|
| + EXPECT_EQ(kSize, WriteData(entry, 0, 0, buf.get(), kSize, false));
|
| + EXPECT_EQ(kSize, WriteData(entry, 1, 0, buf.get(), kSize, false));
|
| + EXPECT_EQ(kSize, WriteData(entry, 2, 0, buf.get(), kSize, false));
|
|
|
| EXPECT_FALSE(entry->CouldBeSparse());
|
| entry->Close();
|
| + WaitForEntryToClose(key);
|
|
|
| ASSERT_EQ(net::OK, OpenEntry(key, &entry));
|
| EXPECT_FALSE(entry->CouldBeSparse());
|
| @@ -1695,6 +1849,12 @@
|
| CouldBeSparse();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3CouldBeSparse) {
|
| + UseVersion3();
|
| + InitCache();
|
| + CouldBeSparse();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryCouldBeSparse) {
|
| SetMemoryOnlyMode();
|
| InitCache();
|
| @@ -1745,16 +1905,16 @@
|
| ASSERT_EQ(net::OK, CreateEntry(key, &entry));
|
|
|
| // Writes in the middle of an entry.
|
| - 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()));
|
| + 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, 8192, net::CompletionCallback()));
|
| + EXPECT_EQ(8192, entry->WriteSparseData(50000, buf, 8192,
|
| + net::CompletionCallback()));
|
|
|
| int64 start;
|
| net::TestCompletionCallback cb;
|
| @@ -1830,6 +1990,13 @@
|
| UpdateSparseEntry();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3UpdateSparseEntry) {
|
| + UseVersion3();
|
| + SetCacheType(net::MEDIA_CACHE);
|
| + InitCache();
|
| + UpdateSparseEntry();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryOnlyUpdateSparseEntry) {
|
| SetMemoryOnlyMode();
|
| SetCacheType(net::MEDIA_CACHE);
|
| @@ -1871,6 +2038,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));
|
| @@ -1878,7 +2047,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.
|
| - MessageLoop::current()->RunUntilIdle();
|
| + WaitForEntryToClose(key2);
|
|
|
| if (memory_only_) {
|
| EXPECT_EQ(0, cache_->GetEntryCount());
|
| @@ -1888,7 +2057,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));
|
| - MessageLoop::current()->RunUntilIdle();
|
| + FlushQueueForTest();
|
| }
|
| EXPECT_EQ(0, cache_->GetEntryCount());
|
| }
|
| @@ -1900,6 +2069,13 @@
|
| DoomSparseEntry();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3DoomSparseEntry) {
|
| + UseVersion3();
|
| + UseCurrentThread();
|
| + InitCache();
|
| + DoomSparseEntry();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryOnlyDoomSparseEntry) {
|
| SetMemoryOnlyMode();
|
| InitCache();
|
| @@ -1928,8 +2104,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;
|
| @@ -1949,15 +2126,28 @@
|
| EXPECT_EQ(9, cache_->GetEntryCount());
|
|
|
| entry->Close();
|
| + WaitForEntryToClose(key);
|
| +
|
| SparseTestCompletionCallback cb(cache_);
|
| int rv = cache_->DoomEntry(key, cb.callback());
|
| EXPECT_EQ(net::ERR_IO_PENDING, rv);
|
| EXPECT_EQ(net::OK, cb.WaitForResult());
|
|
|
| - // TearDown will attempt to delete the cache_.
|
| + // TearDown will attempt to delete the cache.
|
| cache_ = NULL;
|
| + 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;
|
| @@ -1977,6 +2167,7 @@
|
| 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));
|
| @@ -2047,6 +2238,12 @@
|
| PartialSparseEntry();
|
| }
|
|
|
| +TEST_F(DiskCacheEntryTest, V3PartialSparseEntry) {
|
| + UseVersion3();
|
| + InitCache();
|
| + PartialSparseEntry();
|
| +}
|
| +
|
| TEST_F(DiskCacheEntryTest, MemoryPartialSparseEntry) {
|
| SetMemoryOnlyMode();
|
| InitCache();
|
| @@ -2054,8 +2251,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));
|
| @@ -2066,8 +2264,11 @@
|
|
|
| const int k1Meg = 1024 * 1024;
|
| 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());
|
|
|
| @@ -2084,7 +2285,7 @@
|
| for (int i = 0; i < 2; i++) {
|
| ASSERT_EQ(net::OK, OpenEntry(child_key[i], &entry));
|
| // Overwrite the header's magic and signature.
|
| - EXPECT_EQ(12, WriteData(entry, 2, 0, buf1, 12, false));
|
| + EXPECT_EQ(12, WriteData(entry, 2, 0, buf1.get(), 12, false));
|
| entry->Close();
|
| }
|
|
|
| @@ -2104,9 +2305,18 @@
|
| 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));
|
| @@ -2117,8 +2327,8 @@
|
|
|
| // This will open and write two "real" entries.
|
| net::TestCompletionCallback cb1, cb2, cb3, cb4, cb5;
|
| - int rv = entry->WriteSparseData(
|
| - 1024 * 1024 - 4096, buf, 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;
|
| @@ -2149,7 +2359,7 @@
|
| // 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());
|
| @@ -2159,6 +2369,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) {
|
| @@ -2185,8 +2437,9 @@
|
| DisableIntegrityCheck();
|
| }
|
|
|
| -// The simple cache backend isn't intended to work on Windows, which has very
|
| -// different file system guarantees from Linux.
|
| +// The Simple Cache backend requires a few guarantees from the filesystem like
|
| +// atomic renaming of recently open files. Those guarantees are not provided in
|
| +// general on Windows.
|
| #if defined(OS_POSIX)
|
|
|
| TEST_F(DiskCacheEntryTest, SimpleCacheInternalAsyncIO) {
|
|
|