| OLD | NEW |
| 1 // Copyright (c) 2006-2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/platform_thread.h" | 6 #include "base/platform_thread.h" |
| 7 #include "base/timer.h" | 7 #include "base/timer.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "net/base/io_buffer.h" | 9 #include "net/base/io_buffer.h" |
| 10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 void ExternalAsyncIO(); | 29 void ExternalAsyncIO(); |
| 30 void StreamAccess(); | 30 void StreamAccess(); |
| 31 void GetKey(); | 31 void GetKey(); |
| 32 void GrowData(); | 32 void GrowData(); |
| 33 void TruncateData(); | 33 void TruncateData(); |
| 34 void ZeroLengthIO(); | 34 void ZeroLengthIO(); |
| 35 void ReuseEntry(int size); | 35 void ReuseEntry(int size); |
| 36 void InvalidData(); | 36 void InvalidData(); |
| 37 void DoomNormalEntry(); | 37 void DoomNormalEntry(); |
| 38 void DoomedEntry(); | 38 void DoomedEntry(); |
| 39 void BasicSparseIO(bool async); | 39 void BasicSparseIO(); |
| 40 void HugeSparseIO(bool async); | 40 void HugeSparseIO(); |
| 41 void GetAvailableRange(); | 41 void GetAvailableRange(); |
| 42 void CouldBeSparse(); | 42 void CouldBeSparse(); |
| 43 void DoomSparseEntry(); | 43 void DoomSparseEntry(); |
| 44 void PartialSparseEntry(); | 44 void PartialSparseEntry(); |
| 45 }; | 45 }; |
| 46 | 46 |
| 47 // We need to support synchronous IO even though it is not a supported operation |
| 48 // from the point of view of the disk cache's public interface, because we use |
| 49 // it internally, not just by a few tests, but as part of the implementation |
| 50 // (see sparse_control.cc, for example). |
| 47 void DiskCacheEntryTest::InternalSyncIO() { | 51 void DiskCacheEntryTest::InternalSyncIO() { |
| 48 disk_cache::Entry *entry1 = NULL; | 52 disk_cache::Entry* entry = NULL; |
| 49 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); | 53 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); |
| 50 ASSERT_TRUE(NULL != entry1); | 54 ASSERT_TRUE(NULL != entry); |
| 51 | 55 |
| 52 const int kSize1 = 10; | 56 const int kSize1 = 10; |
| 53 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); | 57 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); |
| 54 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 58 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 55 EXPECT_EQ(0, entry1->ReadData(0, 0, buffer1, kSize1, NULL)); | 59 EXPECT_EQ(0, entry->ReadData(0, 0, buffer1, kSize1, NULL)); |
| 56 base::strlcpy(buffer1->data(), "the data", kSize1); | 60 base::strlcpy(buffer1->data(), "the data", kSize1); |
| 57 EXPECT_EQ(10, entry1->WriteData(0, 0, buffer1, kSize1, NULL, false)); | 61 EXPECT_EQ(10, entry->WriteData(0, 0, buffer1, kSize1, NULL, false)); |
| 58 memset(buffer1->data(), 0, kSize1); | 62 memset(buffer1->data(), 0, kSize1); |
| 59 EXPECT_EQ(10, entry1->ReadData(0, 0, buffer1, kSize1, NULL)); | 63 EXPECT_EQ(10, entry->ReadData(0, 0, buffer1, kSize1, NULL)); |
| 60 EXPECT_STREQ("the data", buffer1->data()); | 64 EXPECT_STREQ("the data", buffer1->data()); |
| 61 | 65 |
| 62 const int kSize2 = 5000; | 66 const int kSize2 = 5000; |
| 63 const int kSize3 = 10000; | 67 const int kSize3 = 10000; |
| 64 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); | 68 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); |
| 65 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3); | 69 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3); |
| 66 memset(buffer3->data(), 0, kSize3); | 70 memset(buffer3->data(), 0, kSize3); |
| 67 CacheTestFillBuffer(buffer2->data(), kSize2, false); | 71 CacheTestFillBuffer(buffer2->data(), kSize2, false); |
| 68 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); | 72 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); |
| 69 EXPECT_EQ(5000, entry1->WriteData(1, 1500, buffer2, kSize2, NULL, false)); | 73 EXPECT_EQ(5000, entry->WriteData(1, 1500, buffer2, kSize2, NULL, false)); |
| 70 memset(buffer2->data(), 0, kSize2); | 74 memset(buffer2->data(), 0, kSize2); |
| 71 EXPECT_EQ(4989, entry1->ReadData(1, 1511, buffer2, kSize2, NULL)); | 75 EXPECT_EQ(4989, entry->ReadData(1, 1511, buffer2, kSize2, NULL)); |
| 72 EXPECT_STREQ("big data goes here", buffer2->data()); | 76 EXPECT_STREQ("big data goes here", buffer2->data()); |
| 73 EXPECT_EQ(5000, entry1->ReadData(1, 0, buffer2, kSize2, NULL)); | 77 EXPECT_EQ(5000, entry->ReadData(1, 0, buffer2, kSize2, NULL)); |
| 74 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); | 78 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); |
| 75 EXPECT_EQ(1500, entry1->ReadData(1, 5000, buffer2, kSize2, NULL)); | 79 EXPECT_EQ(1500, entry->ReadData(1, 5000, buffer2, kSize2, NULL)); |
| 76 | 80 |
| 77 EXPECT_EQ(0, entry1->ReadData(1, 6500, buffer2, kSize2, NULL)); | 81 EXPECT_EQ(0, entry->ReadData(1, 6500, buffer2, kSize2, NULL)); |
| 78 EXPECT_EQ(6500, entry1->ReadData(1, 0, buffer3, kSize3, NULL)); | 82 EXPECT_EQ(6500, entry->ReadData(1, 0, buffer3, kSize3, NULL)); |
| 79 EXPECT_EQ(8192, entry1->WriteData(1, 0, buffer3, 8192, NULL, false)); | 83 EXPECT_EQ(8192, entry->WriteData(1, 0, buffer3, 8192, NULL, false)); |
| 80 EXPECT_EQ(8192, entry1->ReadData(1, 0, buffer3, kSize3, NULL)); | 84 EXPECT_EQ(8192, entry->ReadData(1, 0, buffer3, kSize3, NULL)); |
| 81 EXPECT_EQ(8192, entry1->GetDataSize(1)); | 85 EXPECT_EQ(8192, entry->GetDataSize(1)); |
| 82 | 86 |
| 83 entry1->Doom(); | 87 // We need to delete the memory buffer on this thread. |
| 84 entry1->Close(); | 88 EXPECT_EQ(0, entry->WriteData(0, 0, NULL, 0, NULL, true)); |
| 89 EXPECT_EQ(0, entry->WriteData(1, 0, NULL, 0, NULL, true)); |
| 90 |
| 91 entry->Doom(); |
| 92 entry->Close(); |
| 85 FlushQueueForTest(); | 93 FlushQueueForTest(); |
| 86 EXPECT_EQ(0, cache_->GetEntryCount()); | 94 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 87 } | 95 } |
| 88 | 96 |
| 89 TEST_F(DiskCacheEntryTest, InternalSyncIO) { | 97 TEST_F(DiskCacheEntryTest, InternalSyncIO) { |
| 90 SetDirectMode(); | 98 SetDirectMode(); |
| 91 InitCache(); | 99 InitCache(); |
| 92 InternalSyncIO(); | 100 InternalSyncIO(); |
| 93 } | 101 } |
| 94 | 102 |
| 95 TEST_F(DiskCacheEntryTest, MemoryOnlyInternalSyncIO) { | 103 TEST_F(DiskCacheEntryTest, MemoryOnlyInternalSyncIO) { |
| 96 SetMemoryOnlyMode(); | 104 SetMemoryOnlyMode(); |
| 97 InitCache(); | 105 InitCache(); |
| 98 InternalSyncIO(); | 106 InternalSyncIO(); |
| 99 } | 107 } |
| 100 | 108 |
| 101 void DiskCacheEntryTest::InternalAsyncIO() { | 109 void DiskCacheEntryTest::InternalAsyncIO() { |
| 102 disk_cache::Entry *entry1 = NULL; | 110 disk_cache::Entry* entry = NULL; |
| 103 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); | 111 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); |
| 104 ASSERT_TRUE(NULL != entry1); | 112 ASSERT_TRUE(NULL != entry); |
| 105 | 113 |
| 106 // Avoid using internal buffers for the test. We have to write something to | 114 // Avoid using internal buffers for the test. We have to write something to |
| 107 // the entry and close it so that we flush the internal buffer to disk. After | 115 // the entry and close it so that we flush the internal buffer to disk. After |
| 108 // that, IO operations will be really hitting the disk. We don't care about | 116 // that, IO operations will be really hitting the disk. We don't care about |
| 109 // the content, so just extending the entry is enough (all extensions zero- | 117 // the content, so just extending the entry is enough (all extensions zero- |
| 110 // fill any holes). | 118 // fill any holes). |
| 111 EXPECT_EQ(0, entry1->WriteData(0, 15 * 1024, NULL, 0, NULL, false)); | 119 EXPECT_EQ(0, WriteData(entry, 0, 15 * 1024, NULL, 0, false)); |
| 112 EXPECT_EQ(0, entry1->WriteData(1, 15 * 1024, NULL, 0, NULL, false)); | 120 EXPECT_EQ(0, WriteData(entry, 1, 15 * 1024, NULL, 0, false)); |
| 113 entry1->Close(); | 121 entry->Close(); |
| 114 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1)); | 122 ASSERT_EQ(net::OK, OpenEntry("the first key", &entry)); |
| 115 | 123 |
| 116 // Let's verify that each IO goes to the right callback object. | 124 // Let's verify that each IO goes to the right callback object. |
| 117 CallbackTest callback1(false); | 125 CallbackTest callback1(false); |
| 118 CallbackTest callback2(false); | 126 CallbackTest callback2(false); |
| 119 CallbackTest callback3(false); | 127 CallbackTest callback3(false); |
| 120 CallbackTest callback4(false); | 128 CallbackTest callback4(false); |
| 121 CallbackTest callback5(false); | 129 CallbackTest callback5(false); |
| 122 CallbackTest callback6(false); | 130 CallbackTest callback6(false); |
| 123 CallbackTest callback7(false); | 131 CallbackTest callback7(false); |
| 124 CallbackTest callback8(false); | 132 CallbackTest callback8(false); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 136 const int kSize1 = 10; | 144 const int kSize1 = 10; |
| 137 const int kSize2 = 5000; | 145 const int kSize2 = 5000; |
| 138 const int kSize3 = 10000; | 146 const int kSize3 = 10000; |
| 139 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); | 147 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); |
| 140 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); | 148 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); |
| 141 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3); | 149 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3); |
| 142 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 150 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 143 CacheTestFillBuffer(buffer2->data(), kSize2, false); | 151 CacheTestFillBuffer(buffer2->data(), kSize2, false); |
| 144 CacheTestFillBuffer(buffer3->data(), kSize3, false); | 152 CacheTestFillBuffer(buffer3->data(), kSize3, false); |
| 145 | 153 |
| 146 EXPECT_EQ(0, entry1->ReadData(0, 15 * 1024, buffer1, kSize1, &callback1)); | 154 EXPECT_EQ(0, entry->ReadData(0, 15 * 1024, buffer1, kSize1, &callback1)); |
| 147 base::strlcpy(buffer1->data(), "the data", kSize1); | 155 base::strlcpy(buffer1->data(), "the data", kSize1); |
| 148 int expected = 0; | 156 int expected = 0; |
| 149 int ret = entry1->WriteData(0, 0, buffer1, kSize1, &callback2, false); | 157 int ret = entry->WriteData(0, 0, buffer1, kSize1, &callback2, false); |
| 150 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); | 158 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); |
| 151 if (net::ERR_IO_PENDING == ret) | 159 if (net::ERR_IO_PENDING == ret) |
| 152 expected++; | 160 expected++; |
| 153 | 161 |
| 154 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 162 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 155 memset(buffer2->data(), 0, kSize2); | 163 memset(buffer2->data(), 0, kSize2); |
| 156 ret = entry1->ReadData(0, 0, buffer2, kSize1, &callback3); | 164 ret = entry->ReadData(0, 0, buffer2, kSize1, &callback3); |
| 157 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); | 165 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); |
| 158 if (net::ERR_IO_PENDING == ret) | 166 if (net::ERR_IO_PENDING == ret) |
| 159 expected++; | 167 expected++; |
| 160 | 168 |
| 161 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 169 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 162 EXPECT_STREQ("the data", buffer2->data()); | 170 EXPECT_STREQ("the data", buffer2->data()); |
| 163 | 171 |
| 164 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); | 172 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); |
| 165 ret = entry1->WriteData(1, 1500, buffer2, kSize2, &callback4, true); | 173 ret = entry->WriteData(1, 1500, buffer2, kSize2, &callback4, true); |
| 166 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); | 174 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); |
| 167 if (net::ERR_IO_PENDING == ret) | 175 if (net::ERR_IO_PENDING == ret) |
| 168 expected++; | 176 expected++; |
| 169 | 177 |
| 170 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 178 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 171 memset(buffer3->data(), 0, kSize3); | 179 memset(buffer3->data(), 0, kSize3); |
| 172 ret = entry1->ReadData(1, 1511, buffer3, kSize2, &callback5); | 180 ret = entry->ReadData(1, 1511, buffer3, kSize2, &callback5); |
| 173 EXPECT_TRUE(4989 == ret || net::ERR_IO_PENDING == ret); | 181 EXPECT_TRUE(4989 == ret || net::ERR_IO_PENDING == ret); |
| 174 if (net::ERR_IO_PENDING == ret) | 182 if (net::ERR_IO_PENDING == ret) |
| 175 expected++; | 183 expected++; |
| 176 | 184 |
| 177 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 185 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 178 EXPECT_STREQ("big data goes here", buffer3->data()); | 186 EXPECT_STREQ("big data goes here", buffer3->data()); |
| 179 ret = entry1->ReadData(1, 0, buffer2, kSize2, &callback6); | 187 ret = entry->ReadData(1, 0, buffer2, kSize2, &callback6); |
| 180 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); | 188 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); |
| 181 if (net::ERR_IO_PENDING == ret) | 189 if (net::ERR_IO_PENDING == ret) |
| 182 expected++; | 190 expected++; |
| 183 | 191 |
| 184 memset(buffer3->data(), 0, kSize3); | 192 memset(buffer3->data(), 0, kSize3); |
| 185 | 193 |
| 186 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 194 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 187 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); | 195 EXPECT_EQ(0, memcmp(buffer2->data(), buffer3->data(), 1500)); |
| 188 ret = entry1->ReadData(1, 5000, buffer2, kSize2, &callback7); | 196 ret = entry->ReadData(1, 5000, buffer2, kSize2, &callback7); |
| 189 EXPECT_TRUE(1500 == ret || net::ERR_IO_PENDING == ret); | 197 EXPECT_TRUE(1500 == ret || net::ERR_IO_PENDING == ret); |
| 190 if (net::ERR_IO_PENDING == ret) | 198 if (net::ERR_IO_PENDING == ret) |
| 191 expected++; | 199 expected++; |
| 192 | 200 |
| 193 ret = entry1->ReadData(1, 0, buffer3, kSize3, &callback9); | 201 ret = entry->ReadData(1, 0, buffer3, kSize3, &callback9); |
| 194 EXPECT_TRUE(6500 == ret || net::ERR_IO_PENDING == ret); | 202 EXPECT_TRUE(6500 == ret || net::ERR_IO_PENDING == ret); |
| 195 if (net::ERR_IO_PENDING == ret) | 203 if (net::ERR_IO_PENDING == ret) |
| 196 expected++; | 204 expected++; |
| 197 | 205 |
| 198 ret = entry1->WriteData(1, 0, buffer3, 8192, &callback10, true); | 206 ret = entry->WriteData(1, 0, buffer3, 8192, &callback10, true); |
| 199 EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); | 207 EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); |
| 200 if (net::ERR_IO_PENDING == ret) | 208 if (net::ERR_IO_PENDING == ret) |
| 201 expected++; | 209 expected++; |
| 202 | 210 |
| 203 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 211 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 204 ret = entry1->ReadData(1, 0, buffer3, kSize3, &callback11); | 212 ret = entry->ReadData(1, 0, buffer3, kSize3, &callback11); |
| 205 EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); | 213 EXPECT_TRUE(8192 == ret || net::ERR_IO_PENDING == ret); |
| 206 if (net::ERR_IO_PENDING == ret) | 214 if (net::ERR_IO_PENDING == ret) |
| 207 expected++; | 215 expected++; |
| 208 | 216 |
| 209 EXPECT_EQ(8192, entry1->GetDataSize(1)); | 217 EXPECT_EQ(8192, entry->GetDataSize(1)); |
| 210 | 218 |
| 211 ret = entry1->ReadData(0, 0, buffer1, kSize1, &callback12); | 219 ret = entry->ReadData(0, 0, buffer1, kSize1, &callback12); |
| 212 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); | 220 EXPECT_TRUE(10 == ret || net::ERR_IO_PENDING == ret); |
| 213 if (net::ERR_IO_PENDING == ret) | 221 if (net::ERR_IO_PENDING == ret) |
| 214 expected++; | 222 expected++; |
| 215 | 223 |
| 216 ret = entry1->ReadData(1, 0, buffer2, kSize2, &callback13); | 224 ret = entry->ReadData(1, 0, buffer2, kSize2, &callback13); |
| 217 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); | 225 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); |
| 218 if (net::ERR_IO_PENDING == ret) | 226 if (net::ERR_IO_PENDING == ret) |
| 219 expected++; | 227 expected++; |
| 220 | 228 |
| 221 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 229 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 222 | 230 |
| 223 EXPECT_FALSE(g_cache_tests_error); | 231 EXPECT_FALSE(g_cache_tests_error); |
| 224 EXPECT_EQ(expected, g_cache_tests_received); | 232 EXPECT_EQ(expected, g_cache_tests_received); |
| 225 | 233 |
| 226 entry1->Doom(); | 234 entry->Doom(); |
| 227 entry1->Close(); | 235 entry->Close(); |
| 228 FlushQueueForTest(); | 236 FlushQueueForTest(); |
| 229 EXPECT_EQ(0, cache_->GetEntryCount()); | 237 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 230 } | 238 } |
| 231 | 239 |
| 232 TEST_F(DiskCacheEntryTest, InternalAsyncIO) { | 240 TEST_F(DiskCacheEntryTest, InternalAsyncIO) { |
| 233 SetDirectMode(); | 241 SetDirectMode(); |
| 234 InitCache(); | 242 InitCache(); |
| 235 InternalAsyncIO(); | 243 InternalAsyncIO(); |
| 236 } | 244 } |
| 237 | 245 |
| 238 TEST_F(DiskCacheEntryTest, MemoryOnlyInternalAsyncIO) { | 246 TEST_F(DiskCacheEntryTest, MemoryOnlyInternalAsyncIO) { |
| 239 SetMemoryOnlyMode(); | 247 SetMemoryOnlyMode(); |
| 240 InitCache(); | 248 InitCache(); |
| 241 InternalAsyncIO(); | 249 InternalAsyncIO(); |
| 242 } | 250 } |
| 243 | 251 |
| 244 void DiskCacheEntryTest::ExternalSyncIO() { | 252 void DiskCacheEntryTest::ExternalSyncIO() { |
| 245 disk_cache::Entry *entry1; | 253 disk_cache::Entry* entry; |
| 246 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); | 254 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); |
| 247 | 255 |
| 248 const int kSize1 = 17000; | 256 const int kSize1 = 17000; |
| 249 const int kSize2 = 25000; | 257 const int kSize2 = 25000; |
| 250 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); | 258 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); |
| 251 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); | 259 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); |
| 252 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 260 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 253 CacheTestFillBuffer(buffer2->data(), kSize2, false); | 261 CacheTestFillBuffer(buffer2->data(), kSize2, false); |
| 254 base::strlcpy(buffer1->data(), "the data", kSize1); | 262 base::strlcpy(buffer1->data(), "the data", kSize1); |
| 255 EXPECT_EQ(17000, entry1->WriteData(0, 0, buffer1, kSize1, NULL, false)); | 263 EXPECT_EQ(17000, entry->WriteData(0, 0, buffer1, kSize1, NULL, false)); |
| 256 memset(buffer1->data(), 0, kSize1); | 264 memset(buffer1->data(), 0, kSize1); |
| 257 EXPECT_EQ(17000, entry1->ReadData(0, 0, buffer1, kSize1, NULL)); | 265 EXPECT_EQ(17000, entry->ReadData(0, 0, buffer1, kSize1, NULL)); |
| 258 EXPECT_STREQ("the data", buffer1->data()); | 266 EXPECT_STREQ("the data", buffer1->data()); |
| 259 | 267 |
| 260 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); | 268 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); |
| 261 EXPECT_EQ(25000, entry1->WriteData(1, 10000, buffer2, kSize2, NULL, false)); | 269 EXPECT_EQ(25000, entry->WriteData(1, 10000, buffer2, kSize2, NULL, false)); |
| 262 memset(buffer2->data(), 0, kSize2); | 270 memset(buffer2->data(), 0, kSize2); |
| 263 EXPECT_EQ(24989, entry1->ReadData(1, 10011, buffer2, kSize2, NULL)); | 271 EXPECT_EQ(24989, entry->ReadData(1, 10011, buffer2, kSize2, NULL)); |
| 264 EXPECT_STREQ("big data goes here", buffer2->data()); | 272 EXPECT_STREQ("big data goes here", buffer2->data()); |
| 265 EXPECT_EQ(25000, entry1->ReadData(1, 0, buffer2, kSize2, NULL)); | 273 EXPECT_EQ(25000, entry->ReadData(1, 0, buffer2, kSize2, NULL)); |
| 266 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000)); | 274 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000)); |
| 267 EXPECT_EQ(5000, entry1->ReadData(1, 30000, buffer2, kSize2, NULL)); | 275 EXPECT_EQ(5000, entry->ReadData(1, 30000, buffer2, kSize2, NULL)); |
| 268 | 276 |
| 269 EXPECT_EQ(0, entry1->ReadData(1, 35000, buffer2, kSize2, NULL)); | 277 EXPECT_EQ(0, entry->ReadData(1, 35000, buffer2, kSize2, NULL)); |
| 270 EXPECT_EQ(17000, entry1->ReadData(1, 0, buffer1, kSize1, NULL)); | 278 EXPECT_EQ(17000, entry->ReadData(1, 0, buffer1, kSize1, NULL)); |
| 271 EXPECT_EQ(17000, entry1->WriteData(1, 20000, buffer1, kSize1, NULL, false)); | 279 EXPECT_EQ(17000, entry->WriteData(1, 20000, buffer1, kSize1, NULL, false)); |
| 272 EXPECT_EQ(37000, entry1->GetDataSize(1)); | 280 EXPECT_EQ(37000, entry->GetDataSize(1)); |
| 273 | 281 |
| 274 entry1->Doom(); | 282 // We need to delete the memory buffer on this thread. |
| 275 entry1->Close(); | 283 EXPECT_EQ(0, entry->WriteData(0, 0, NULL, 0, NULL, true)); |
| 284 EXPECT_EQ(0, entry->WriteData(1, 0, NULL, 0, NULL, true)); |
| 285 |
| 286 entry->Doom(); |
| 287 entry->Close(); |
| 276 FlushQueueForTest(); | 288 FlushQueueForTest(); |
| 277 EXPECT_EQ(0, cache_->GetEntryCount()); | 289 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 278 } | 290 } |
| 279 | 291 |
| 280 TEST_F(DiskCacheEntryTest, ExternalSyncIO) { | 292 TEST_F(DiskCacheEntryTest, ExternalSyncIO) { |
| 281 SetDirectMode(); | 293 SetDirectMode(); |
| 282 InitCache(); | 294 InitCache(); |
| 283 ExternalSyncIO(); | 295 ExternalSyncIO(); |
| 284 } | 296 } |
| 285 | 297 |
| 286 TEST_F(DiskCacheEntryTest, MemoryOnlyExternalSyncIO) { | 298 TEST_F(DiskCacheEntryTest, MemoryOnlyExternalSyncIO) { |
| 287 SetMemoryOnlyMode(); | 299 SetMemoryOnlyMode(); |
| 288 InitCache(); | 300 InitCache(); |
| 289 ExternalSyncIO(); | 301 ExternalSyncIO(); |
| 290 } | 302 } |
| 291 | 303 |
| 292 void DiskCacheEntryTest::ExternalAsyncIO() { | 304 void DiskCacheEntryTest::ExternalAsyncIO() { |
| 293 disk_cache::Entry *entry1; | 305 disk_cache::Entry* entry; |
| 294 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1)); | 306 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); |
| 295 | 307 |
| 296 // Let's verify that each IO goes to the right callback object. | 308 // Let's verify that each IO goes to the right callback object. |
| 297 CallbackTest callback1(false); | 309 CallbackTest callback1(false); |
| 298 CallbackTest callback2(false); | 310 CallbackTest callback2(false); |
| 299 CallbackTest callback3(false); | 311 CallbackTest callback3(false); |
| 300 CallbackTest callback4(false); | 312 CallbackTest callback4(false); |
| 301 CallbackTest callback5(false); | 313 CallbackTest callback5(false); |
| 302 CallbackTest callback6(false); | 314 CallbackTest callback6(false); |
| 303 CallbackTest callback7(false); | 315 CallbackTest callback7(false); |
| 304 CallbackTest callback8(false); | 316 CallbackTest callback8(false); |
| 305 CallbackTest callback9(false); | 317 CallbackTest callback9(false); |
| 306 | 318 |
| 307 g_cache_tests_error = false; | 319 g_cache_tests_error = false; |
| 308 g_cache_tests_received = 0; | 320 g_cache_tests_received = 0; |
| 309 int expected = 0; | 321 int expected = 0; |
| 310 | 322 |
| 311 MessageLoopHelper helper; | 323 MessageLoopHelper helper; |
| 312 | 324 |
| 313 const int kSize1 = 17000; | 325 const int kSize1 = 17000; |
| 314 const int kSize2 = 25000; | 326 const int kSize2 = 25000; |
| 315 const int kSize3 = 25000; | 327 const int kSize3 = 25000; |
| 316 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); | 328 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); |
| 317 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); | 329 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); |
| 318 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3); | 330 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3); |
| 319 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 331 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 320 CacheTestFillBuffer(buffer2->data(), kSize2, false); | 332 CacheTestFillBuffer(buffer2->data(), kSize2, false); |
| 321 CacheTestFillBuffer(buffer3->data(), kSize3, false); | 333 CacheTestFillBuffer(buffer3->data(), kSize3, false); |
| 322 base::strlcpy(buffer1->data(), "the data", kSize1); | 334 base::strlcpy(buffer1->data(), "the data", kSize1); |
| 323 int ret = entry1->WriteData(0, 0, buffer1, kSize1, &callback1, false); | 335 int ret = entry->WriteData(0, 0, buffer1, kSize1, &callback1, false); |
| 324 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); | 336 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); |
| 325 if (net::ERR_IO_PENDING == ret) | 337 if (net::ERR_IO_PENDING == ret) |
| 326 expected++; | 338 expected++; |
| 327 | 339 |
| 328 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 340 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 329 | 341 |
| 330 memset(buffer2->data(), 0, kSize1); | 342 memset(buffer2->data(), 0, kSize1); |
| 331 ret = entry1->ReadData(0, 0, buffer2, kSize1, &callback2); | 343 ret = entry->ReadData(0, 0, buffer2, kSize1, &callback2); |
| 332 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); | 344 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); |
| 333 if (net::ERR_IO_PENDING == ret) | 345 if (net::ERR_IO_PENDING == ret) |
| 334 expected++; | 346 expected++; |
| 335 | 347 |
| 336 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 348 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 337 EXPECT_STREQ("the data", buffer1->data()); | 349 EXPECT_STREQ("the data", buffer1->data()); |
| 338 | 350 |
| 339 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); | 351 base::strlcpy(buffer2->data(), "The really big data goes here", kSize2); |
| 340 ret = entry1->WriteData(1, 10000, buffer2, kSize2, &callback3, false); | 352 ret = entry->WriteData(1, 10000, buffer2, kSize2, &callback3, false); |
| 341 EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret); | 353 EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret); |
| 342 if (net::ERR_IO_PENDING == ret) | 354 if (net::ERR_IO_PENDING == ret) |
| 343 expected++; | 355 expected++; |
| 344 | 356 |
| 345 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 357 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 346 | 358 |
| 347 memset(buffer3->data(), 0, kSize3); | 359 memset(buffer3->data(), 0, kSize3); |
| 348 ret = entry1->ReadData(1, 10011, buffer3, kSize3, &callback4); | 360 ret = entry->ReadData(1, 10011, buffer3, kSize3, &callback4); |
| 349 EXPECT_TRUE(24989 == ret || net::ERR_IO_PENDING == ret); | 361 EXPECT_TRUE(24989 == ret || net::ERR_IO_PENDING == ret); |
| 350 if (net::ERR_IO_PENDING == ret) | 362 if (net::ERR_IO_PENDING == ret) |
| 351 expected++; | 363 expected++; |
| 352 | 364 |
| 353 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 365 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 354 EXPECT_STREQ("big data goes here", buffer3->data()); | 366 EXPECT_STREQ("big data goes here", buffer3->data()); |
| 355 ret = entry1->ReadData(1, 0, buffer2, kSize2, &callback5); | 367 ret = entry->ReadData(1, 0, buffer2, kSize2, &callback5); |
| 356 EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret); | 368 EXPECT_TRUE(25000 == ret || net::ERR_IO_PENDING == ret); |
| 357 if (net::ERR_IO_PENDING == ret) | 369 if (net::ERR_IO_PENDING == ret) |
| 358 expected++; | 370 expected++; |
| 359 | 371 |
| 360 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 372 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 361 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000)); | 373 EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000)); |
| 362 ret = entry1->ReadData(1, 30000, buffer2, kSize2, &callback6); | 374 ret = entry->ReadData(1, 30000, buffer2, kSize2, &callback6); |
| 363 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); | 375 EXPECT_TRUE(5000 == ret || net::ERR_IO_PENDING == ret); |
| 364 if (net::ERR_IO_PENDING == ret) | 376 if (net::ERR_IO_PENDING == ret) |
| 365 expected++; | 377 expected++; |
| 366 | 378 |
| 367 EXPECT_EQ(0, entry1->ReadData(1, 35000, buffer2, kSize2, &callback7)); | 379 EXPECT_EQ(0, entry->ReadData(1, 35000, buffer2, kSize2, &callback7)); |
| 368 ret = entry1->ReadData(1, 0, buffer1, kSize1, &callback8); | 380 ret = entry->ReadData(1, 0, buffer1, kSize1, &callback8); |
| 369 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); | 381 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); |
| 370 if (net::ERR_IO_PENDING == ret) | 382 if (net::ERR_IO_PENDING == ret) |
| 371 expected++; | 383 expected++; |
| 372 ret = entry1->WriteData(1, 20000, buffer1, kSize1, &callback9, false); | 384 ret = entry->WriteData(1, 20000, buffer1, kSize1, &callback9, false); |
| 373 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); | 385 EXPECT_TRUE(17000 == ret || net::ERR_IO_PENDING == ret); |
| 374 if (net::ERR_IO_PENDING == ret) | 386 if (net::ERR_IO_PENDING == ret) |
| 375 expected++; | 387 expected++; |
| 376 | 388 |
| 377 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); | 389 EXPECT_TRUE(helper.WaitUntilCacheIoFinished(expected)); |
| 378 EXPECT_EQ(37000, entry1->GetDataSize(1)); | 390 EXPECT_EQ(37000, entry->GetDataSize(1)); |
| 379 | 391 |
| 380 EXPECT_FALSE(g_cache_tests_error); | 392 EXPECT_FALSE(g_cache_tests_error); |
| 381 EXPECT_EQ(expected, g_cache_tests_received); | 393 EXPECT_EQ(expected, g_cache_tests_received); |
| 382 | 394 |
| 383 entry1->Doom(); | 395 entry->Doom(); |
| 384 entry1->Close(); | 396 entry->Close(); |
| 385 FlushQueueForTest(); | 397 FlushQueueForTest(); |
| 386 EXPECT_EQ(0, cache_->GetEntryCount()); | 398 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 387 } | 399 } |
| 388 | 400 |
| 389 TEST_F(DiskCacheEntryTest, ExternalAsyncIO) { | 401 TEST_F(DiskCacheEntryTest, ExternalAsyncIO) { |
| 390 SetDirectMode(); | 402 SetDirectMode(); |
| 391 InitCache(); | 403 InitCache(); |
| 392 ExternalAsyncIO(); | 404 ExternalAsyncIO(); |
| 393 } | 405 } |
| 394 | 406 |
| 395 TEST_F(DiskCacheEntryTest, MemoryOnlyExternalAsyncIO) { | 407 TEST_F(DiskCacheEntryTest, MemoryOnlyExternalAsyncIO) { |
| 396 SetMemoryOnlyMode(); | 408 SetMemoryOnlyMode(); |
| 397 InitCache(); | 409 InitCache(); |
| 398 ExternalAsyncIO(); | 410 ExternalAsyncIO(); |
| 399 } | 411 } |
| 400 | 412 |
| 401 void DiskCacheEntryTest::StreamAccess() { | 413 void DiskCacheEntryTest::StreamAccess() { |
| 402 disk_cache::Entry *entry = NULL; | 414 disk_cache::Entry* entry = NULL; |
| 403 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); | 415 ASSERT_EQ(net::OK, CreateEntry("the first key", &entry)); |
| 404 ASSERT_TRUE(NULL != entry); | 416 ASSERT_TRUE(NULL != entry); |
| 405 | 417 |
| 406 const int kBufferSize = 1024; | 418 const int kBufferSize = 1024; |
| 407 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kBufferSize); | 419 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kBufferSize); |
| 408 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kBufferSize); | 420 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kBufferSize); |
| 409 | 421 |
| 410 const int kNumStreams = 3; | 422 const int kNumStreams = 3; |
| 411 for (int i = 0; i < kNumStreams; i++) { | 423 for (int i = 0; i < kNumStreams; i++) { |
| 412 CacheTestFillBuffer(buffer1->data(), kBufferSize, false); | 424 CacheTestFillBuffer(buffer1->data(), kBufferSize, false); |
| 413 EXPECT_EQ(kBufferSize, entry->WriteData(i, 0, buffer1, kBufferSize, NULL, | 425 EXPECT_EQ(kBufferSize, WriteData(entry, i, 0, buffer1, kBufferSize, false)); |
| 414 false)); | |
| 415 memset(buffer2->data(), 0, kBufferSize); | 426 memset(buffer2->data(), 0, kBufferSize); |
| 416 EXPECT_EQ(kBufferSize, entry->ReadData(i, 0, buffer2, kBufferSize, NULL)); | 427 EXPECT_EQ(kBufferSize, ReadData(entry, i, 0, buffer2, kBufferSize)); |
| 417 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kBufferSize)); | 428 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kBufferSize)); |
| 418 } | 429 } |
| 419 | 430 |
| 420 EXPECT_EQ(net::ERR_INVALID_ARGUMENT, | 431 EXPECT_EQ(net::ERR_INVALID_ARGUMENT, |
| 421 entry->ReadData(kNumStreams, 0, buffer1, kBufferSize, NULL)); | 432 ReadData(entry, kNumStreams, 0, buffer1, kBufferSize)); |
| 422 entry->Close(); | 433 entry->Close(); |
| 423 } | 434 } |
| 424 | 435 |
| 425 TEST_F(DiskCacheEntryTest, StreamAccess) { | 436 TEST_F(DiskCacheEntryTest, StreamAccess) { |
| 426 InitCache(); | 437 InitCache(); |
| 427 StreamAccess(); | 438 StreamAccess(); |
| 428 } | 439 } |
| 429 | 440 |
| 430 TEST_F(DiskCacheEntryTest, MemoryOnlyStreamAccess) { | 441 TEST_F(DiskCacheEntryTest, MemoryOnlyStreamAccess) { |
| 431 SetMemoryOnlyMode(); | 442 SetMemoryOnlyMode(); |
| 432 InitCache(); | 443 InitCache(); |
| 433 StreamAccess(); | 444 StreamAccess(); |
| 434 } | 445 } |
| 435 | 446 |
| 436 void DiskCacheEntryTest::GetKey() { | 447 void DiskCacheEntryTest::GetKey() { |
| 437 std::string key1("the first key"); | 448 std::string key("the first key"); |
| 438 disk_cache::Entry *entry1; | 449 disk_cache::Entry* entry; |
| 439 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); | 450 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 440 EXPECT_EQ(key1, entry1->GetKey()) << "short key"; | 451 EXPECT_EQ(key, entry->GetKey()) << "short key"; |
| 441 entry1->Close(); | 452 entry->Close(); |
| 442 | 453 |
| 443 int seed = static_cast<int>(Time::Now().ToInternalValue()); | 454 int seed = static_cast<int>(Time::Now().ToInternalValue()); |
| 444 srand(seed); | 455 srand(seed); |
| 445 char key_buffer[20000]; | 456 char key_buffer[20000]; |
| 446 | 457 |
| 447 CacheTestFillBuffer(key_buffer, 3000, true); | 458 CacheTestFillBuffer(key_buffer, 3000, true); |
| 448 key_buffer[1000] = '\0'; | 459 key_buffer[1000] = '\0'; |
| 449 | 460 |
| 450 key1 = key_buffer; | 461 key = key_buffer; |
| 451 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); | 462 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 452 EXPECT_TRUE(key1 == entry1->GetKey()) << "1000 bytes key"; | 463 EXPECT_TRUE(key == entry->GetKey()) << "1000 bytes key"; |
| 453 entry1->Close(); | 464 entry->Close(); |
| 454 | 465 |
| 455 key_buffer[1000] = 'p'; | 466 key_buffer[1000] = 'p'; |
| 456 key_buffer[3000] = '\0'; | 467 key_buffer[3000] = '\0'; |
| 457 key1 = key_buffer; | 468 key = key_buffer; |
| 458 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); | 469 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 459 EXPECT_TRUE(key1 == entry1->GetKey()) << "medium size key"; | 470 EXPECT_TRUE(key == entry->GetKey()) << "medium size key"; |
| 460 entry1->Close(); | 471 entry->Close(); |
| 461 | 472 |
| 462 CacheTestFillBuffer(key_buffer, sizeof(key_buffer), true); | 473 CacheTestFillBuffer(key_buffer, sizeof(key_buffer), true); |
| 463 key_buffer[19999] = '\0'; | 474 key_buffer[19999] = '\0'; |
| 464 | 475 |
| 465 key1 = key_buffer; | 476 key = key_buffer; |
| 466 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); | 477 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 467 EXPECT_TRUE(key1 == entry1->GetKey()) << "long key"; | 478 EXPECT_TRUE(key == entry->GetKey()) << "long key"; |
| 468 entry1->Close(); | 479 entry->Close(); |
| 469 } | 480 } |
| 470 | 481 |
| 471 TEST_F(DiskCacheEntryTest, GetKey) { | 482 TEST_F(DiskCacheEntryTest, GetKey) { |
| 472 InitCache(); | 483 InitCache(); |
| 473 GetKey(); | 484 GetKey(); |
| 474 } | 485 } |
| 475 | 486 |
| 476 TEST_F(DiskCacheEntryTest, MemoryOnlyGetKey) { | 487 TEST_F(DiskCacheEntryTest, MemoryOnlyGetKey) { |
| 477 SetMemoryOnlyMode(); | 488 SetMemoryOnlyMode(); |
| 478 InitCache(); | 489 InitCache(); |
| 479 GetKey(); | 490 GetKey(); |
| 480 } | 491 } |
| 481 | 492 |
| 482 void DiskCacheEntryTest::GrowData() { | 493 void DiskCacheEntryTest::GrowData() { |
| 483 std::string key1("the first key"); | 494 std::string key1("the first key"); |
| 484 disk_cache::Entry *entry1, *entry2; | 495 disk_cache::Entry* entry; |
| 485 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); | 496 ASSERT_EQ(net::OK, CreateEntry(key1, &entry)); |
| 486 | 497 |
| 487 const int kSize = 20000; | 498 const int kSize = 20000; |
| 488 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); | 499 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); |
| 489 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize); | 500 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize); |
| 490 CacheTestFillBuffer(buffer1->data(), kSize, false); | 501 CacheTestFillBuffer(buffer1->data(), kSize, false); |
| 491 memset(buffer2->data(), 0, kSize); | 502 memset(buffer2->data(), 0, kSize); |
| 492 | 503 |
| 493 base::strlcpy(buffer1->data(), "the data", kSize); | 504 base::strlcpy(buffer1->data(), "the data", kSize); |
| 494 EXPECT_EQ(10, entry1->WriteData(0, 0, buffer1, 10, NULL, false)); | 505 EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1, 10, false)); |
| 495 EXPECT_EQ(10, entry1->ReadData(0, 0, buffer2, 10, NULL)); | 506 EXPECT_EQ(10, ReadData(entry, 0, 0, buffer2, 10)); |
| 496 EXPECT_STREQ("the data", buffer2->data()); | 507 EXPECT_STREQ("the data", buffer2->data()); |
| 497 EXPECT_EQ(10, entry1->GetDataSize(0)); | 508 EXPECT_EQ(10, entry->GetDataSize(0)); |
| 498 | 509 |
| 499 EXPECT_EQ(2000, entry1->WriteData(0, 0, buffer1, 2000, NULL, false)); | 510 EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false)); |
| 500 EXPECT_EQ(2000, entry1->GetDataSize(0)); | 511 EXPECT_EQ(2000, entry->GetDataSize(0)); |
| 501 EXPECT_EQ(2000, entry1->ReadData(0, 0, buffer2, 2000, NULL)); | 512 EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000)); |
| 502 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); | 513 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); |
| 503 | 514 |
| 504 EXPECT_EQ(20000, entry1->WriteData(0, 0, buffer1, kSize, NULL, false)); | 515 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, kSize, false)); |
| 505 EXPECT_EQ(20000, entry1->GetDataSize(0)); | 516 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 506 EXPECT_EQ(20000, entry1->ReadData(0, 0, buffer2, kSize, NULL)); | 517 EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, kSize)); |
| 507 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); | 518 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); |
| 508 entry1->Close(); | 519 entry->Close(); |
| 509 | 520 |
| 510 memset(buffer2->data(), 0, kSize); | 521 memset(buffer2->data(), 0, kSize); |
| 511 ASSERT_EQ(net::OK, CreateEntry("Second key", &entry2)); | 522 std::string key2("Second key"); |
| 512 EXPECT_EQ(10, entry2->WriteData(0, 0, buffer1, 10, NULL, false)); | 523 ASSERT_EQ(net::OK, CreateEntry(key2, &entry)); |
| 513 EXPECT_EQ(10, entry2->GetDataSize(0)); | 524 EXPECT_EQ(10, WriteData(entry, 0, 0, buffer1, 10, false)); |
| 514 entry2->Close(); | 525 EXPECT_EQ(10, entry->GetDataSize(0)); |
| 526 entry->Close(); |
| 515 | 527 |
| 516 // Go from an internal address to a bigger block size. | 528 // Go from an internal address to a bigger block size. |
| 517 ASSERT_EQ(net::OK, OpenEntry("Second key", &entry2)); | 529 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
| 518 EXPECT_EQ(2000, entry2->WriteData(0, 0, buffer1, 2000, NULL, false)); | 530 EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false)); |
| 519 EXPECT_EQ(2000, entry2->GetDataSize(0)); | 531 EXPECT_EQ(2000, entry->GetDataSize(0)); |
| 520 EXPECT_EQ(2000, entry2->ReadData(0, 0, buffer2, 2000, NULL)); | 532 EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000)); |
| 521 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); | 533 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 2000)); |
| 522 entry2->Close(); | 534 entry->Close(); |
| 523 memset(buffer2->data(), 0, kSize); | 535 memset(buffer2->data(), 0, kSize); |
| 524 | 536 |
| 525 // Go from an internal address to an external one. | 537 // Go from an internal address to an external one. |
| 526 ASSERT_EQ(net::OK, OpenEntry("Second key", &entry2)); | 538 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
| 527 EXPECT_EQ(20000, entry2->WriteData(0, 0, buffer1, kSize, NULL, false)); | 539 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer1, kSize, false)); |
| 528 EXPECT_EQ(20000, entry2->GetDataSize(0)); | 540 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 529 EXPECT_EQ(20000, entry2->ReadData(0, 0, buffer2, kSize, NULL)); | 541 EXPECT_EQ(20000, ReadData(entry, 0, 0, buffer2, kSize)); |
| 530 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); | 542 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), kSize)); |
| 531 entry2->Close(); | 543 entry->Close(); |
| 544 |
| 545 // Double check the size from disk. |
| 546 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
| 547 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 548 |
| 549 // Now extend the entry without actual data. |
| 550 EXPECT_EQ(0, WriteData(entry, 0, 45500, buffer1, 0, false)); |
| 551 entry->Close(); |
| 552 |
| 553 // And check again from disk. |
| 554 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
| 555 EXPECT_EQ(45500, entry->GetDataSize(0)); |
| 556 entry->Close(); |
| 532 } | 557 } |
| 533 | 558 |
| 534 TEST_F(DiskCacheEntryTest, GrowData) { | 559 TEST_F(DiskCacheEntryTest, GrowData) { |
| 535 InitCache(); | 560 InitCache(); |
| 536 GrowData(); | 561 GrowData(); |
| 537 } | 562 } |
| 538 | 563 |
| 539 TEST_F(DiskCacheEntryTest, MemoryOnlyGrowData) { | 564 TEST_F(DiskCacheEntryTest, MemoryOnlyGrowData) { |
| 540 SetMemoryOnlyMode(); | 565 SetMemoryOnlyMode(); |
| 541 InitCache(); | 566 InitCache(); |
| 542 GrowData(); | 567 GrowData(); |
| 543 } | 568 } |
| 544 | 569 |
| 545 void DiskCacheEntryTest::TruncateData() { | 570 void DiskCacheEntryTest::TruncateData() { |
| 546 std::string key1("the first key"); | 571 std::string key("the first key"); |
| 547 disk_cache::Entry *entry1; | 572 disk_cache::Entry* entry; |
| 548 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); | 573 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 549 | 574 |
| 550 const int kSize1 = 20000; | 575 const int kSize1 = 20000; |
| 551 const int kSize2 = 20000; | 576 const int kSize2 = 20000; |
| 552 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); | 577 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); |
| 553 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); | 578 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); |
| 554 | 579 |
| 555 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 580 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 556 memset(buffer2->data(), 0, kSize2); | 581 memset(buffer2->data(), 0, kSize2); |
| 557 | 582 |
| 558 // Simple truncation: | 583 // Simple truncation: |
| 559 EXPECT_EQ(200, entry1->WriteData(0, 0, buffer1, 200, NULL, false)); | 584 EXPECT_EQ(200, entry->WriteData(0, 0, buffer1, 200, NULL, false)); |
| 560 EXPECT_EQ(200, entry1->GetDataSize(0)); | 585 EXPECT_EQ(200, entry->GetDataSize(0)); |
| 561 EXPECT_EQ(100, entry1->WriteData(0, 0, buffer1, 100, NULL, false)); | 586 EXPECT_EQ(100, entry->WriteData(0, 0, buffer1, 100, NULL, false)); |
| 562 EXPECT_EQ(200, entry1->GetDataSize(0)); | 587 EXPECT_EQ(200, entry->GetDataSize(0)); |
| 563 EXPECT_EQ(100, entry1->WriteData(0, 0, buffer1, 100, NULL, true)); | 588 EXPECT_EQ(100, entry->WriteData(0, 0, buffer1, 100, NULL, true)); |
| 564 EXPECT_EQ(100, entry1->GetDataSize(0)); | 589 EXPECT_EQ(100, entry->GetDataSize(0)); |
| 565 EXPECT_EQ(0, entry1->WriteData(0, 50, buffer1, 0, NULL, true)); | 590 EXPECT_EQ(0, entry->WriteData(0, 50, buffer1, 0, NULL, true)); |
| 566 EXPECT_EQ(50, entry1->GetDataSize(0)); | 591 EXPECT_EQ(50, entry->GetDataSize(0)); |
| 567 EXPECT_EQ(0, entry1->WriteData(0, 0, buffer1, 0, NULL, true)); | 592 EXPECT_EQ(0, entry->WriteData(0, 0, buffer1, 0, NULL, true)); |
| 568 EXPECT_EQ(0, entry1->GetDataSize(0)); | 593 EXPECT_EQ(0, entry->GetDataSize(0)); |
| 569 entry1->Close(); | 594 entry->Close(); |
| 570 ASSERT_EQ(net::OK, OpenEntry(key1, &entry1)); | 595 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 571 | 596 |
| 572 // Go to an external file. | 597 // Go to an external file. |
| 573 EXPECT_EQ(20000, entry1->WriteData(0, 0, buffer1, 20000, NULL, true)); | 598 EXPECT_EQ(20000, entry->WriteData(0, 0, buffer1, 20000, NULL, true)); |
| 574 EXPECT_EQ(20000, entry1->GetDataSize(0)); | 599 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 575 EXPECT_EQ(20000, entry1->ReadData(0, 0, buffer2, 20000, NULL)); | 600 EXPECT_EQ(20000, entry->ReadData(0, 0, buffer2, 20000, NULL)); |
| 576 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 20000)); | 601 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 20000)); |
| 577 memset(buffer2->data(), 0, kSize2); | 602 memset(buffer2->data(), 0, kSize2); |
| 578 | 603 |
| 579 // External file truncation | 604 // External file truncation |
| 580 EXPECT_EQ(18000, entry1->WriteData(0, 0, buffer1, 18000, NULL, false)); | 605 EXPECT_EQ(18000, entry->WriteData(0, 0, buffer1, 18000, NULL, false)); |
| 581 EXPECT_EQ(20000, entry1->GetDataSize(0)); | 606 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 582 EXPECT_EQ(18000, entry1->WriteData(0, 0, buffer1, 18000, NULL, true)); | 607 EXPECT_EQ(18000, entry->WriteData(0, 0, buffer1, 18000, NULL, true)); |
| 583 EXPECT_EQ(18000, entry1->GetDataSize(0)); | 608 EXPECT_EQ(18000, entry->GetDataSize(0)); |
| 584 EXPECT_EQ(0, entry1->WriteData(0, 17500, buffer1, 0, NULL, true)); | 609 EXPECT_EQ(0, entry->WriteData(0, 17500, buffer1, 0, NULL, true)); |
| 585 EXPECT_EQ(17500, entry1->GetDataSize(0)); | 610 EXPECT_EQ(17500, entry->GetDataSize(0)); |
| 586 | 611 |
| 587 // And back to an internal block. | 612 // And back to an internal block. |
| 588 EXPECT_EQ(600, entry1->WriteData(0, 1000, buffer1, 600, NULL, true)); | 613 EXPECT_EQ(600, entry->WriteData(0, 1000, buffer1, 600, NULL, true)); |
| 589 EXPECT_EQ(1600, entry1->GetDataSize(0)); | 614 EXPECT_EQ(1600, entry->GetDataSize(0)); |
| 590 EXPECT_EQ(600, entry1->ReadData(0, 1000, buffer2, 600, NULL)); | 615 EXPECT_EQ(600, entry->ReadData(0, 1000, buffer2, 600, NULL)); |
| 591 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 600)); | 616 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 600)); |
| 592 EXPECT_EQ(1000, entry1->ReadData(0, 0, buffer2, 1000, NULL)); | 617 EXPECT_EQ(1000, entry->ReadData(0, 0, buffer2, 1000, NULL)); |
| 593 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 1000)) << | 618 EXPECT_TRUE(!memcmp(buffer1->data(), buffer2->data(), 1000)) << |
| 594 "Preserves previous data"; | 619 "Preserves previous data"; |
| 595 | 620 |
| 596 // Go from external file to zero length. | 621 // Go from external file to zero length. |
| 597 EXPECT_EQ(20000, entry1->WriteData(0, 0, buffer1, 20000, NULL, true)); | 622 EXPECT_EQ(20000, entry->WriteData(0, 0, buffer1, 20000, NULL, true)); |
| 598 EXPECT_EQ(20000, entry1->GetDataSize(0)); | 623 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 599 EXPECT_EQ(0, entry1->WriteData(0, 0, buffer1, 0, NULL, true)); | 624 EXPECT_EQ(0, entry->WriteData(0, 0, buffer1, 0, NULL, true)); |
| 600 EXPECT_EQ(0, entry1->GetDataSize(0)); | 625 EXPECT_EQ(0, entry->GetDataSize(0)); |
| 601 | 626 |
| 602 entry1->Close(); | 627 entry->Close(); |
| 603 } | 628 } |
| 604 | 629 |
| 605 TEST_F(DiskCacheEntryTest, TruncateData) { | 630 TEST_F(DiskCacheEntryTest, TruncateData) { |
| 606 InitCache(); | 631 InitCache(); |
| 607 TruncateData(); | 632 TruncateData(); |
| 608 | 633 |
| 609 // We generate asynchronous IO that is not really tracked until completion | 634 // We generate asynchronous IO that is not really tracked until completion |
| 610 // so we just wait here before running the next test. | 635 // so we just wait here before running the next test. |
| 611 MessageLoopHelper helper; | 636 MessageLoopHelper helper; |
| 612 helper.WaitUntilCacheIoFinished(1); | 637 helper.WaitUntilCacheIoFinished(1); |
| 613 } | 638 } |
| 614 | 639 |
| 615 TEST_F(DiskCacheEntryTest, MemoryOnlyTruncateData) { | 640 TEST_F(DiskCacheEntryTest, MemoryOnlyTruncateData) { |
| 616 SetMemoryOnlyMode(); | 641 SetMemoryOnlyMode(); |
| 617 InitCache(); | 642 InitCache(); |
| 618 TruncateData(); | 643 TruncateData(); |
| 619 } | 644 } |
| 620 | 645 |
| 621 void DiskCacheEntryTest::ZeroLengthIO() { | 646 void DiskCacheEntryTest::ZeroLengthIO() { |
| 622 std::string key1("the first key"); | 647 std::string key("the first key"); |
| 623 disk_cache::Entry *entry1; | 648 disk_cache::Entry* entry; |
| 624 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); | 649 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 625 | 650 |
| 626 EXPECT_EQ(0, entry1->ReadData(0, 0, NULL, 0, NULL)); | 651 EXPECT_EQ(0, ReadData(entry, 0, 0, NULL, 0)); |
| 627 EXPECT_EQ(0, entry1->WriteData(0, 0, NULL, 0, NULL, false)); | 652 EXPECT_EQ(0, WriteData(entry, 0, 0, NULL, 0, false)); |
| 628 | 653 |
| 629 // This write should extend the entry. | 654 // This write should extend the entry. |
| 630 EXPECT_EQ(0, entry1->WriteData(0, 1000, NULL, 0, NULL, false)); | 655 EXPECT_EQ(0, WriteData(entry, 0, 1000, NULL, 0, false)); |
| 631 EXPECT_EQ(0, entry1->ReadData(0, 500, NULL, 0, NULL)); | 656 EXPECT_EQ(0, ReadData(entry, 0, 500, NULL, 0)); |
| 632 EXPECT_EQ(0, entry1->ReadData(0, 2000, NULL, 0, NULL)); | 657 EXPECT_EQ(0, ReadData(entry, 0, 2000, NULL, 0)); |
| 633 EXPECT_EQ(1000, entry1->GetDataSize(0)); | 658 EXPECT_EQ(1000, entry->GetDataSize(0)); |
| 634 entry1->Close(); | 659 |
| 660 EXPECT_EQ(0, WriteData(entry, 0, 100000, NULL, 0, true)); |
| 661 EXPECT_EQ(0, ReadData(entry, 0, 50000, NULL, 0)); |
| 662 EXPECT_EQ(100000, entry->GetDataSize(0)); |
| 663 |
| 664 // Lets verify the actual content. |
| 665 const int kSize = 20; |
| 666 const char zeros[kSize] = {}; |
| 667 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize); |
| 668 |
| 669 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 670 EXPECT_EQ(kSize, ReadData(entry, 0, 500, buffer, kSize)); |
| 671 EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize)); |
| 672 |
| 673 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 674 EXPECT_EQ(kSize, ReadData(entry, 0, 5000, buffer, kSize)); |
| 675 EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize)); |
| 676 |
| 677 CacheTestFillBuffer(buffer->data(), kSize, false); |
| 678 EXPECT_EQ(kSize, ReadData(entry, 0, 50000, buffer, kSize)); |
| 679 EXPECT_TRUE(!memcmp(buffer->data(), zeros, kSize)); |
| 680 |
| 681 entry->Close(); |
| 635 } | 682 } |
| 636 | 683 |
| 637 TEST_F(DiskCacheEntryTest, ZeroLengthIO) { | 684 TEST_F(DiskCacheEntryTest, ZeroLengthIO) { |
| 638 InitCache(); | 685 InitCache(); |
| 639 ZeroLengthIO(); | 686 ZeroLengthIO(); |
| 640 } | 687 } |
| 641 | 688 |
| 642 TEST_F(DiskCacheEntryTest, MemoryOnlyZeroLengthIO) { | 689 TEST_F(DiskCacheEntryTest, MemoryOnlyZeroLengthIO) { |
| 643 SetMemoryOnlyMode(); | 690 SetMemoryOnlyMode(); |
| 644 InitCache(); | 691 InitCache(); |
| 645 ZeroLengthIO(); | 692 ZeroLengthIO(); |
| 646 } | 693 } |
| 647 | 694 |
| 695 // Tests that we handle the content correctly when buffering. |
| 696 TEST_F(DiskCacheEntryTest, Buffering) { |
| 697 InitCache(); |
| 698 std::string key("the first key"); |
| 699 disk_cache::Entry* entry; |
| 700 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 701 |
| 702 const int kSize = 200; |
| 703 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); |
| 704 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize); |
| 705 CacheTestFillBuffer(buffer1->data(), kSize, true); |
| 706 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 707 |
| 708 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1, kSize, false)); |
| 709 entry->Close(); |
| 710 |
| 711 // Write a little more and read what we wrote before. |
| 712 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 713 EXPECT_EQ(kSize, WriteData(entry, 1, 5000, buffer1, kSize, false)); |
| 714 EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2, kSize)); |
| 715 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 716 |
| 717 // Now go to an external file. |
| 718 EXPECT_EQ(kSize, WriteData(entry, 1, 18000, buffer1, kSize, false)); |
| 719 entry->Close(); |
| 720 |
| 721 // Write something else and verify old data. |
| 722 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 723 EXPECT_EQ(kSize, WriteData(entry, 1, 10000, buffer1, kSize, false)); |
| 724 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 725 EXPECT_EQ(kSize, ReadData(entry, 1, 5000, buffer2, kSize)); |
| 726 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 727 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 728 EXPECT_EQ(kSize, ReadData(entry, 1, 0, buffer2, kSize)); |
| 729 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 730 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 731 EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2, kSize)); |
| 732 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 733 |
| 734 // Extend the file some more. |
| 735 EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1, kSize, false)); |
| 736 entry->Close(); |
| 737 |
| 738 // And now make sure that we can deal with data in both places (ram/disk). |
| 739 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 740 EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1, kSize, false)); |
| 741 |
| 742 // We should not overwrite the data at 18000 with this. |
| 743 EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1, kSize, false)); |
| 744 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 745 EXPECT_EQ(kSize, ReadData(entry, 1, 18000, buffer2, kSize)); |
| 746 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 747 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 748 EXPECT_EQ(kSize, ReadData(entry, 1, 17000, buffer2, kSize)); |
| 749 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data(), kSize)); |
| 750 |
| 751 EXPECT_EQ(kSize, WriteData(entry, 1, 22900, buffer1, kSize, false)); |
| 752 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 753 EXPECT_EQ(100, ReadData(entry, 1, 23000, buffer2, kSize)); |
| 754 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100)); |
| 755 |
| 756 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 757 EXPECT_EQ(100, ReadData(entry, 1, 23100, buffer2, kSize)); |
| 758 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + 100, 100)); |
| 759 |
| 760 entry->Close(); |
| 761 } |
| 762 |
| 763 // Some extra tests to make sure that buffering works properly when changing |
| 764 // the entry size. |
| 765 TEST_F(DiskCacheEntryTest, SizeChanges) { |
| 766 InitCache(); |
| 767 std::string key("the first key"); |
| 768 disk_cache::Entry* entry; |
| 769 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 770 |
| 771 const int kSize = 200; |
| 772 const char zeros[kSize] = {}; |
| 773 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); |
| 774 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize); |
| 775 CacheTestFillBuffer(buffer1->data(), kSize, true); |
| 776 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 777 |
| 778 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1, kSize, true)); |
| 779 EXPECT_EQ(kSize, WriteData(entry, 1, 17000, buffer1, kSize, true)); |
| 780 EXPECT_EQ(kSize, WriteData(entry, 1, 23000, buffer1, kSize, true)); |
| 781 entry->Close(); |
| 782 |
| 783 // Extend the file and read between the old size and the new write. |
| 784 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 785 EXPECT_EQ(23000 + kSize, entry->GetDataSize(1)); |
| 786 EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, true)); |
| 787 EXPECT_EQ(25000 + kSize, entry->GetDataSize(1)); |
| 788 EXPECT_EQ(kSize, ReadData(entry, 1, 24000, buffer2, kSize)); |
| 789 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, kSize)); |
| 790 |
| 791 // Read at the end of the old file size. |
| 792 EXPECT_EQ(35, ReadData(entry, 1, 23000 + kSize - 35, buffer2, kSize)); |
| 793 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + kSize - 35, 35)); |
| 794 |
| 795 // Read slightly before the last write. |
| 796 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 797 EXPECT_EQ(kSize, ReadData(entry, 1, 24900, buffer2, kSize)); |
| 798 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); |
| 799 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); |
| 800 |
| 801 // Extend the entry a little more. |
| 802 EXPECT_EQ(kSize, WriteData(entry, 1, 26000, buffer1, kSize, true)); |
| 803 EXPECT_EQ(26000 + kSize, entry->GetDataSize(1)); |
| 804 CacheTestFillBuffer(buffer2->data(), kSize, true); |
| 805 EXPECT_EQ(kSize, ReadData(entry, 1, 25900, buffer2, kSize)); |
| 806 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); |
| 807 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); |
| 808 |
| 809 // And now reduce the size. |
| 810 EXPECT_EQ(kSize, WriteData(entry, 1, 25000, buffer1, kSize, true)); |
| 811 EXPECT_EQ(25000 + kSize, entry->GetDataSize(1)); |
| 812 EXPECT_EQ(28, ReadData(entry, 1, 25000 + kSize - 28, buffer2, kSize)); |
| 813 EXPECT_TRUE(!memcmp(buffer2->data(), buffer1->data() + kSize - 28, 28)); |
| 814 |
| 815 // Reduce the size with a buffer that is not extending the size. |
| 816 EXPECT_EQ(kSize, WriteData(entry, 1, 24000, buffer1, kSize, false)); |
| 817 EXPECT_EQ(25000 + kSize, entry->GetDataSize(1)); |
| 818 EXPECT_EQ(kSize, WriteData(entry, 1, 24500, buffer1, kSize, true)); |
| 819 EXPECT_EQ(24500 + kSize, entry->GetDataSize(1)); |
| 820 EXPECT_EQ(kSize, ReadData(entry, 1, 23900, buffer2, kSize)); |
| 821 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); |
| 822 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); |
| 823 |
| 824 // And now reduce the size below the old size. |
| 825 EXPECT_EQ(kSize, WriteData(entry, 1, 19000, buffer1, kSize, true)); |
| 826 EXPECT_EQ(19000 + kSize, entry->GetDataSize(1)); |
| 827 EXPECT_EQ(kSize, ReadData(entry, 1, 18900, buffer2, kSize)); |
| 828 EXPECT_TRUE(!memcmp(buffer2->data(), zeros, 100)); |
| 829 EXPECT_TRUE(!memcmp(buffer2->data() + 100, buffer1->data(), kSize - 100)); |
| 830 |
| 831 // Verify that the actual file is truncated. |
| 832 entry->Close(); |
| 833 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 834 EXPECT_EQ(19000 + kSize, entry->GetDataSize(1)); |
| 835 |
| 836 entry->Close(); |
| 837 } |
| 838 |
| 648 // Write more than the total cache capacity but to a single entry. |size| is the | 839 // Write more than the total cache capacity but to a single entry. |size| is the |
| 649 // amount of bytes to write each time. | 840 // amount of bytes to write each time. |
| 650 void DiskCacheEntryTest::ReuseEntry(int size) { | 841 void DiskCacheEntryTest::ReuseEntry(int size) { |
| 651 std::string key1("the first key"); | 842 std::string key1("the first key"); |
| 652 disk_cache::Entry *entry; | 843 disk_cache::Entry* entry; |
| 653 ASSERT_EQ(net::OK, CreateEntry(key1, &entry)); | 844 ASSERT_EQ(net::OK, CreateEntry(key1, &entry)); |
| 654 | 845 |
| 655 entry->Close(); | 846 entry->Close(); |
| 656 std::string key2("the second key"); | 847 std::string key2("the second key"); |
| 657 ASSERT_EQ(net::OK, CreateEntry(key2, &entry)); | 848 ASSERT_EQ(net::OK, CreateEntry(key2, &entry)); |
| 658 | 849 |
| 659 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(size); | 850 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(size); |
| 660 CacheTestFillBuffer(buffer->data(), size, false); | 851 CacheTestFillBuffer(buffer->data(), size, false); |
| 661 | 852 |
| 662 for (int i = 0; i < 15; i++) { | 853 for (int i = 0; i < 15; i++) { |
| 663 EXPECT_EQ(0, entry->WriteData(0, 0, buffer, 0, NULL, true)); | 854 EXPECT_EQ(0, WriteData(entry, 0, 0, buffer, 0, true)); |
| 664 EXPECT_EQ(size, entry->WriteData(0, 0, buffer, size, NULL, false)); | 855 EXPECT_EQ(size, WriteData(entry, 0, 0, buffer, size, false)); |
| 665 entry->Close(); | 856 entry->Close(); |
| 666 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); | 857 ASSERT_EQ(net::OK, OpenEntry(key2, &entry)); |
| 667 } | 858 } |
| 668 | 859 |
| 669 entry->Close(); | 860 entry->Close(); |
| 670 ASSERT_EQ(net::OK, OpenEntry(key1, &entry)) << "have not evicted this entry"; | 861 ASSERT_EQ(net::OK, OpenEntry(key1, &entry)) << "have not evicted this entry"; |
| 671 entry->Close(); | 862 entry->Close(); |
| 672 } | 863 } |
| 673 | 864 |
| 674 TEST_F(DiskCacheEntryTest, ReuseExternalEntry) { | 865 TEST_F(DiskCacheEntryTest, ReuseExternalEntry) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 696 TEST_F(DiskCacheEntryTest, MemoryOnlyReuseInternalEntry) { | 887 TEST_F(DiskCacheEntryTest, MemoryOnlyReuseInternalEntry) { |
| 697 SetDirectMode(); | 888 SetDirectMode(); |
| 698 SetMemoryOnlyMode(); | 889 SetMemoryOnlyMode(); |
| 699 SetMaxSize(100 * 1024); | 890 SetMaxSize(100 * 1024); |
| 700 InitCache(); | 891 InitCache(); |
| 701 ReuseEntry(10 * 1024); | 892 ReuseEntry(10 * 1024); |
| 702 } | 893 } |
| 703 | 894 |
| 704 // Reading somewhere that was not written should return zeros. | 895 // Reading somewhere that was not written should return zeros. |
| 705 void DiskCacheEntryTest::InvalidData() { | 896 void DiskCacheEntryTest::InvalidData() { |
| 706 std::string key1("the first key"); | 897 std::string key("the first key"); |
| 707 disk_cache::Entry *entry1; | 898 disk_cache::Entry* entry; |
| 708 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); | 899 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 709 | 900 |
| 710 const int kSize1 = 20000; | 901 const int kSize1 = 20000; |
| 711 const int kSize2 = 20000; | 902 const int kSize2 = 20000; |
| 712 const int kSize3 = 20000; | 903 const int kSize3 = 20000; |
| 713 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); | 904 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); |
| 714 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); | 905 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); |
| 715 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3); | 906 scoped_refptr<net::IOBuffer> buffer3 = new net::IOBuffer(kSize3); |
| 716 | 907 |
| 717 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 908 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 718 memset(buffer2->data(), 0, kSize2); | 909 memset(buffer2->data(), 0, kSize2); |
| 719 | 910 |
| 720 // Simple data grow: | 911 // Simple data grow: |
| 721 EXPECT_EQ(200, entry1->WriteData(0, 400, buffer1, 200, NULL, false)); | 912 EXPECT_EQ(200, WriteData(entry, 0, 400, buffer1, 200, false)); |
| 722 EXPECT_EQ(600, entry1->GetDataSize(0)); | 913 EXPECT_EQ(600, entry->GetDataSize(0)); |
| 723 EXPECT_EQ(100, entry1->ReadData(0, 300, buffer3, 100, NULL)); | 914 EXPECT_EQ(100, ReadData(entry, 0, 300, buffer3, 100)); |
| 724 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); | 915 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); |
| 725 entry1->Close(); | 916 entry->Close(); |
| 726 ASSERT_EQ(net::OK, OpenEntry(key1, &entry1)); | 917 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 727 | 918 |
| 728 // The entry is now on disk. Load it and extend it. | 919 // The entry is now on disk. Load it and extend it. |
| 729 EXPECT_EQ(200, entry1->WriteData(0, 800, buffer1, 200, NULL, false)); | 920 EXPECT_EQ(200, WriteData(entry, 0, 800, buffer1, 200, false)); |
| 730 EXPECT_EQ(1000, entry1->GetDataSize(0)); | 921 EXPECT_EQ(1000, entry->GetDataSize(0)); |
| 731 EXPECT_EQ(100, entry1->ReadData(0, 700, buffer3, 100, NULL)); | 922 EXPECT_EQ(100, ReadData(entry, 0, 700, buffer3, 100)); |
| 732 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); | 923 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); |
| 733 entry1->Close(); | 924 entry->Close(); |
| 734 ASSERT_EQ(net::OK, OpenEntry(key1, &entry1)); | 925 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 735 | 926 |
| 736 // This time using truncate. | 927 // This time using truncate. |
| 737 EXPECT_EQ(200, entry1->WriteData(0, 1800, buffer1, 200, NULL, true)); | 928 EXPECT_EQ(200, WriteData(entry, 0, 1800, buffer1, 200, true)); |
| 738 EXPECT_EQ(2000, entry1->GetDataSize(0)); | 929 EXPECT_EQ(2000, entry->GetDataSize(0)); |
| 739 EXPECT_EQ(100, entry1->ReadData(0, 1500, buffer3, 100, NULL)); | 930 EXPECT_EQ(100, ReadData(entry, 0, 1500, buffer3, 100)); |
| 740 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); | 931 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 100)); |
| 741 | 932 |
| 742 // Go to an external file. | 933 // Go to an external file. |
| 743 EXPECT_EQ(200, entry1->WriteData(0, 19800, buffer1, 200, NULL, false)); | 934 EXPECT_EQ(200, WriteData(entry, 0, 19800, buffer1, 200, false)); |
| 744 EXPECT_EQ(20000, entry1->GetDataSize(0)); | 935 EXPECT_EQ(20000, entry->GetDataSize(0)); |
| 745 EXPECT_EQ(4000, entry1->ReadData(0, 14000, buffer3, 4000, NULL)); | 936 EXPECT_EQ(4000, ReadData(entry, 0, 14000, buffer3, 4000)); |
| 746 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 4000)); | 937 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 4000)); |
| 747 | 938 |
| 748 // And back to an internal block. | 939 // And back to an internal block. |
| 749 EXPECT_EQ(600, entry1->WriteData(0, 1000, buffer1, 600, NULL, true)); | 940 EXPECT_EQ(600, WriteData(entry, 0, 1000, buffer1, 600, true)); |
| 750 EXPECT_EQ(1600, entry1->GetDataSize(0)); | 941 EXPECT_EQ(1600, entry->GetDataSize(0)); |
| 751 EXPECT_EQ(600, entry1->ReadData(0, 1000, buffer3, 600, NULL)); | 942 EXPECT_EQ(600, ReadData(entry, 0, 1000, buffer3, 600)); |
| 752 EXPECT_TRUE(!memcmp(buffer3->data(), buffer1->data(), 600)); | 943 EXPECT_TRUE(!memcmp(buffer3->data(), buffer1->data(), 600)); |
| 753 | 944 |
| 754 // Extend it again. | 945 // Extend it again. |
| 755 EXPECT_EQ(600, entry1->WriteData(0, 2000, buffer1, 600, NULL, false)); | 946 EXPECT_EQ(600, WriteData(entry, 0, 2000, buffer1, 600, false)); |
| 756 EXPECT_EQ(2600, entry1->GetDataSize(0)); | 947 EXPECT_EQ(2600, entry->GetDataSize(0)); |
| 757 EXPECT_EQ(200, entry1->ReadData(0, 1800, buffer3, 200, NULL)); | 948 EXPECT_EQ(200, ReadData(entry, 0, 1800, buffer3, 200)); |
| 758 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200)); | 949 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200)); |
| 759 | 950 |
| 760 // And again (with truncation flag). | 951 // And again (with truncation flag). |
| 761 EXPECT_EQ(600, entry1->WriteData(0, 3000, buffer1, 600, NULL, true)); | 952 EXPECT_EQ(600, WriteData(entry, 0, 3000, buffer1, 600, true)); |
| 762 EXPECT_EQ(3600, entry1->GetDataSize(0)); | 953 EXPECT_EQ(3600, entry->GetDataSize(0)); |
| 763 EXPECT_EQ(200, entry1->ReadData(0, 2800, buffer3, 200, NULL)); | 954 EXPECT_EQ(200, ReadData(entry, 0, 2800, buffer3, 200)); |
| 764 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200)); | 955 EXPECT_TRUE(!memcmp(buffer3->data(), buffer2->data(), 200)); |
| 765 | 956 |
| 766 entry1->Close(); | 957 entry->Close(); |
| 767 } | 958 } |
| 768 | 959 |
| 769 TEST_F(DiskCacheEntryTest, InvalidData) { | 960 TEST_F(DiskCacheEntryTest, InvalidData) { |
| 770 InitCache(); | 961 InitCache(); |
| 771 InvalidData(); | 962 InvalidData(); |
| 772 } | 963 } |
| 773 | 964 |
| 774 TEST_F(DiskCacheEntryTest, MemoryOnlyInvalidData) { | 965 TEST_F(DiskCacheEntryTest, MemoryOnlyInvalidData) { |
| 775 SetMemoryOnlyMode(); | 966 SetMemoryOnlyMode(); |
| 776 InitCache(); | 967 InitCache(); |
| 777 InvalidData(); | 968 InvalidData(); |
| 778 } | 969 } |
| 779 | 970 |
| 780 void DiskCacheEntryTest::DoomNormalEntry() { | 971 void DiskCacheEntryTest::DoomNormalEntry() { |
| 781 std::string key1("the first key"); | 972 std::string key("the first key"); |
| 782 disk_cache::Entry *entry1; | 973 disk_cache::Entry* entry; |
| 783 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); | 974 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 784 entry1->Doom(); | 975 entry->Doom(); |
| 785 entry1->Close(); | 976 entry->Close(); |
| 786 | 977 |
| 787 const int kSize = 20000; | 978 const int kSize = 20000; |
| 788 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize); | 979 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kSize); |
| 789 CacheTestFillBuffer(buffer->data(), kSize, true); | 980 CacheTestFillBuffer(buffer->data(), kSize, true); |
| 790 buffer->data()[19999] = '\0'; | 981 buffer->data()[19999] = '\0'; |
| 791 | 982 |
| 792 key1 = buffer->data(); | 983 key = buffer->data(); |
| 793 ASSERT_EQ(net::OK, CreateEntry(key1, &entry1)); | 984 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 794 EXPECT_EQ(20000, entry1->WriteData(0, 0, buffer, kSize, NULL, false)); | 985 EXPECT_EQ(20000, WriteData(entry, 0, 0, buffer, kSize, false)); |
| 795 EXPECT_EQ(20000, entry1->WriteData(1, 0, buffer, kSize, NULL, false)); | 986 EXPECT_EQ(20000, WriteData(entry, 1, 0, buffer, kSize, false)); |
| 796 entry1->Doom(); | 987 entry->Doom(); |
| 797 entry1->Close(); | 988 entry->Close(); |
| 798 | 989 |
| 799 FlushQueueForTest(); | 990 FlushQueueForTest(); |
| 800 EXPECT_EQ(0, cache_->GetEntryCount()); | 991 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 801 } | 992 } |
| 802 | 993 |
| 803 TEST_F(DiskCacheEntryTest, DoomEntry) { | 994 TEST_F(DiskCacheEntryTest, DoomEntry) { |
| 804 SetDirectMode(); | 995 SetDirectMode(); |
| 805 InitCache(); | 996 InitCache(); |
| 806 DoomNormalEntry(); | 997 DoomNormalEntry(); |
| 807 } | 998 } |
| 808 | 999 |
| 809 TEST_F(DiskCacheEntryTest, MemoryOnlyDoomEntry) { | 1000 TEST_F(DiskCacheEntryTest, MemoryOnlyDoomEntry) { |
| 810 SetMemoryOnlyMode(); | 1001 SetMemoryOnlyMode(); |
| 811 InitCache(); | 1002 InitCache(); |
| 812 DoomNormalEntry(); | 1003 DoomNormalEntry(); |
| 813 } | 1004 } |
| 814 | 1005 |
| 815 // Verify that basic operations work as expected with doomed entries. | 1006 // Verify that basic operations work as expected with doomed entries. |
| 816 void DiskCacheEntryTest::DoomedEntry() { | 1007 void DiskCacheEntryTest::DoomedEntry() { |
| 817 std::string key("the first key"); | 1008 std::string key("the first key"); |
| 818 disk_cache::Entry *entry; | 1009 disk_cache::Entry* entry; |
| 819 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1010 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 820 entry->Doom(); | 1011 entry->Doom(); |
| 821 | 1012 |
| 822 FlushQueueForTest(); | 1013 FlushQueueForTest(); |
| 823 EXPECT_EQ(0, cache_->GetEntryCount()); | 1014 EXPECT_EQ(0, cache_->GetEntryCount()); |
| 824 Time initial = Time::Now(); | 1015 Time initial = Time::Now(); |
| 825 PlatformThread::Sleep(20); | 1016 PlatformThread::Sleep(20); |
| 826 | 1017 |
| 827 const int kSize1 = 2000; | 1018 const int kSize1 = 2000; |
| 828 const int kSize2 = 2000; | 1019 const int kSize2 = 2000; |
| 829 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); | 1020 scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize1); |
| 830 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); | 1021 scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize2); |
| 831 CacheTestFillBuffer(buffer1->data(), kSize1, false); | 1022 CacheTestFillBuffer(buffer1->data(), kSize1, false); |
| 832 memset(buffer2->data(), 0, kSize2); | 1023 memset(buffer2->data(), 0, kSize2); |
| 833 | 1024 |
| 834 EXPECT_EQ(2000, entry->WriteData(0, 0, buffer1, 2000, NULL, false)); | 1025 EXPECT_EQ(2000, WriteData(entry, 0, 0, buffer1, 2000, false)); |
| 835 EXPECT_EQ(2000, entry->ReadData(0, 0, buffer2, 2000, NULL)); | 1026 EXPECT_EQ(2000, ReadData(entry, 0, 0, buffer2, 2000)); |
| 836 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize1)); | 1027 EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize1)); |
| 837 EXPECT_EQ(key, entry->GetKey()); | 1028 EXPECT_EQ(key, entry->GetKey()); |
| 838 EXPECT_TRUE(initial < entry->GetLastModified()); | 1029 EXPECT_TRUE(initial < entry->GetLastModified()); |
| 839 EXPECT_TRUE(initial < entry->GetLastUsed()); | 1030 EXPECT_TRUE(initial < entry->GetLastUsed()); |
| 840 | 1031 |
| 841 entry->Close(); | 1032 entry->Close(); |
| 842 } | 1033 } |
| 843 | 1034 |
| 844 TEST_F(DiskCacheEntryTest, DoomedEntry) { | 1035 TEST_F(DiskCacheEntryTest, DoomedEntry) { |
| 845 SetDirectMode(); | 1036 SetDirectMode(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 disk_cache::MemEntryImpl* mem_entry = | 1076 disk_cache::MemEntryImpl* mem_entry = |
| 886 reinterpret_cast<disk_cache::MemEntryImpl*>(entry); | 1077 reinterpret_cast<disk_cache::MemEntryImpl*>(entry); |
| 887 EXPECT_EQ(disk_cache::MemEntryImpl::kParentEntry, mem_entry->type()); | 1078 EXPECT_EQ(disk_cache::MemEntryImpl::kParentEntry, mem_entry->type()); |
| 888 mem_entry->Close(); | 1079 mem_entry->Close(); |
| 889 } | 1080 } |
| 890 EXPECT_EQ(1, count); | 1081 EXPECT_EQ(1, count); |
| 891 } | 1082 } |
| 892 | 1083 |
| 893 // Writes |buf_1| to offset and reads it back as |buf_2|. | 1084 // Writes |buf_1| to offset and reads it back as |buf_2|. |
| 894 void VerifySparseIO(disk_cache::Entry* entry, int64 offset, | 1085 void VerifySparseIO(disk_cache::Entry* entry, int64 offset, |
| 895 net::IOBuffer* buf_1, int size, bool async, | 1086 net::IOBuffer* buf_1, int size, net::IOBuffer* buf_2) { |
| 896 net::IOBuffer* buf_2) { | 1087 TestCompletionCallback cb; |
| 897 TestCompletionCallback callback; | |
| 898 TestCompletionCallback* cb = async ? &callback : NULL; | |
| 899 | 1088 |
| 900 memset(buf_2->data(), 0, size); | 1089 memset(buf_2->data(), 0, size); |
| 901 int ret = entry->ReadSparseData(offset, buf_2, size, cb); | 1090 int ret = entry->ReadSparseData(offset, buf_2, size, &cb); |
| 902 ret = callback.GetResult(ret); | 1091 EXPECT_EQ(0, cb.GetResult(ret)); |
| 903 EXPECT_EQ(0, ret); | |
| 904 | 1092 |
| 905 ret = entry->WriteSparseData(offset, buf_1, size, cb); | 1093 ret = entry->WriteSparseData(offset, buf_1, size, &cb); |
| 906 ret = callback.GetResult(ret); | 1094 EXPECT_EQ(size, cb.GetResult(ret)); |
| 907 EXPECT_EQ(size, ret); | |
| 908 | 1095 |
| 909 ret = entry->ReadSparseData(offset, buf_2, size, cb); | 1096 ret = entry->ReadSparseData(offset, buf_2, size, &cb); |
| 910 ret = callback.GetResult(ret); | 1097 EXPECT_EQ(size, cb.GetResult(ret)); |
| 911 EXPECT_EQ(size, ret); | |
| 912 | 1098 |
| 913 EXPECT_EQ(0, memcmp(buf_1->data(), buf_2->data(), size)); | 1099 EXPECT_EQ(0, memcmp(buf_1->data(), buf_2->data(), size)); |
| 914 } | 1100 } |
| 915 | 1101 |
| 916 // Reads |size| bytes from |entry| at |offset| and verifies that they are the | 1102 // Reads |size| bytes from |entry| at |offset| and verifies that they are the |
| 917 // same as the content of the provided |buffer|. | 1103 // same as the content of the provided |buffer|. |
| 918 void VerifyContentSparseIO(disk_cache::Entry* entry, int64 offset, char* buffer, | 1104 void VerifyContentSparseIO(disk_cache::Entry* entry, int64 offset, char* buffer, |
| 919 int size, bool async) { | 1105 int size) { |
| 920 TestCompletionCallback callback; | 1106 TestCompletionCallback cb; |
| 921 TestCompletionCallback* cb = async ? &callback : NULL; | |
| 922 | 1107 |
| 923 scoped_refptr<net::IOBuffer> buf_1 = new net::IOBuffer(size); | 1108 scoped_refptr<net::IOBuffer> buf_1 = new net::IOBuffer(size); |
| 924 memset(buf_1->data(), 0, size); | 1109 memset(buf_1->data(), 0, size); |
| 925 int ret = entry->ReadSparseData(offset, buf_1, size, cb); | 1110 int ret = entry->ReadSparseData(offset, buf_1, size, &cb); |
| 926 ret = callback.GetResult(ret); | 1111 EXPECT_EQ(size, cb.GetResult(ret)); |
| 927 EXPECT_EQ(size, ret); | |
| 928 | 1112 |
| 929 EXPECT_EQ(0, memcmp(buf_1->data(), buffer, size)); | 1113 EXPECT_EQ(0, memcmp(buf_1->data(), buffer, size)); |
| 930 } | 1114 } |
| 931 | 1115 |
| 932 void DiskCacheEntryTest::BasicSparseIO(bool async) { | 1116 void DiskCacheEntryTest::BasicSparseIO() { |
| 933 std::string key("the first key"); | 1117 std::string key("the first key"); |
| 934 disk_cache::Entry* entry; | 1118 disk_cache::Entry* entry; |
| 935 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1119 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 936 | 1120 |
| 937 const int kSize = 2048; | 1121 const int kSize = 2048; |
| 938 scoped_refptr<net::IOBuffer> buf_1 = new net::IOBuffer(kSize); | 1122 scoped_refptr<net::IOBuffer> buf_1 = new net::IOBuffer(kSize); |
| 939 scoped_refptr<net::IOBuffer> buf_2 = new net::IOBuffer(kSize); | 1123 scoped_refptr<net::IOBuffer> buf_2 = new net::IOBuffer(kSize); |
| 940 CacheTestFillBuffer(buf_1->data(), kSize, false); | 1124 CacheTestFillBuffer(buf_1->data(), kSize, false); |
| 941 | 1125 |
| 942 // Write at offset 0. | 1126 // Write at offset 0. |
| 943 VerifySparseIO(entry, 0, buf_1, kSize, async, buf_2); | 1127 VerifySparseIO(entry, 0, buf_1, kSize, buf_2); |
| 944 | 1128 |
| 945 // Write at offset 0x400000 (4 MB). | 1129 // Write at offset 0x400000 (4 MB). |
| 946 VerifySparseIO(entry, 0x400000, buf_1, kSize, async, buf_2); | 1130 VerifySparseIO(entry, 0x400000, buf_1, kSize, buf_2); |
| 947 | 1131 |
| 948 // Write at offset 0x800000000 (32 GB). | 1132 // Write at offset 0x800000000 (32 GB). |
| 949 VerifySparseIO(entry, 0x800000000LL, buf_1, kSize, async, buf_2); | 1133 VerifySparseIO(entry, 0x800000000LL, buf_1, kSize, buf_2); |
| 950 | 1134 |
| 951 entry->Close(); | 1135 entry->Close(); |
| 952 | 1136 |
| 953 // Check everything again. | 1137 // Check everything again. |
| 954 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1138 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 955 VerifyContentSparseIO(entry, 0, buf_1->data(), kSize, async); | 1139 VerifyContentSparseIO(entry, 0, buf_1->data(), kSize); |
| 956 VerifyContentSparseIO(entry, 0x400000, buf_1->data(), kSize, async); | 1140 VerifyContentSparseIO(entry, 0x400000, buf_1->data(), kSize); |
| 957 VerifyContentSparseIO(entry, 0x800000000LL, buf_1->data(), kSize, async); | 1141 VerifyContentSparseIO(entry, 0x800000000LL, buf_1->data(), kSize); |
| 958 entry->Close(); | 1142 entry->Close(); |
| 959 } | 1143 } |
| 960 | 1144 |
| 961 TEST_F(DiskCacheEntryTest, BasicSparseSyncIO) { | 1145 TEST_F(DiskCacheEntryTest, BasicSparseIO) { |
| 962 InitCache(); | 1146 InitCache(); |
| 963 BasicSparseIO(false); | 1147 BasicSparseIO(); |
| 964 } | 1148 } |
| 965 | 1149 |
| 966 TEST_F(DiskCacheEntryTest, MemoryOnlyBasicSparseSyncIO) { | 1150 TEST_F(DiskCacheEntryTest, MemoryOnlyBasicSparseIO) { |
| 967 SetMemoryOnlyMode(); | 1151 SetMemoryOnlyMode(); |
| 968 InitCache(); | 1152 InitCache(); |
| 969 BasicSparseIO(false); | 1153 BasicSparseIO(); |
| 970 } | 1154 } |
| 971 | 1155 |
| 972 TEST_F(DiskCacheEntryTest, BasicSparseAsyncIO) { | 1156 void DiskCacheEntryTest::HugeSparseIO() { |
| 973 InitCache(); | |
| 974 BasicSparseIO(true); | |
| 975 } | |
| 976 | |
| 977 TEST_F(DiskCacheEntryTest, MemoryOnlyBasicSparseAsyncIO) { | |
| 978 SetMemoryOnlyMode(); | |
| 979 InitCache(); | |
| 980 BasicSparseIO(true); | |
| 981 } | |
| 982 | |
| 983 void DiskCacheEntryTest::HugeSparseIO(bool async) { | |
| 984 std::string key("the first key"); | 1157 std::string key("the first key"); |
| 985 disk_cache::Entry* entry; | 1158 disk_cache::Entry* entry; |
| 986 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1159 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 987 | 1160 |
| 988 // Write 1.2 MB so that we cover multiple entries. | 1161 // Write 1.2 MB so that we cover multiple entries. |
| 989 const int kSize = 1200 * 1024; | 1162 const int kSize = 1200 * 1024; |
| 990 scoped_refptr<net::IOBuffer> buf_1 = new net::IOBuffer(kSize); | 1163 scoped_refptr<net::IOBuffer> buf_1 = new net::IOBuffer(kSize); |
| 991 scoped_refptr<net::IOBuffer> buf_2 = new net::IOBuffer(kSize); | 1164 scoped_refptr<net::IOBuffer> buf_2 = new net::IOBuffer(kSize); |
| 992 CacheTestFillBuffer(buf_1->data(), kSize, false); | 1165 CacheTestFillBuffer(buf_1->data(), kSize, false); |
| 993 | 1166 |
| 994 // Write at offset 0x20F0000 (33 MB - 64 KB). | 1167 // Write at offset 0x20F0000 (33 MB - 64 KB). |
| 995 VerifySparseIO(entry, 0x20F0000, buf_1, kSize, async, buf_2); | 1168 VerifySparseIO(entry, 0x20F0000, buf_1, kSize, buf_2); |
| 996 entry->Close(); | 1169 entry->Close(); |
| 997 | 1170 |
| 998 // Check it again. | 1171 // Check it again. |
| 999 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1172 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1000 VerifyContentSparseIO(entry, 0x20F0000, buf_1->data(), kSize, async); | 1173 VerifyContentSparseIO(entry, 0x20F0000, buf_1->data(), kSize); |
| 1001 entry->Close(); | 1174 entry->Close(); |
| 1002 } | 1175 } |
| 1003 | 1176 |
| 1004 TEST_F(DiskCacheEntryTest, HugeSparseSyncIO) { | 1177 TEST_F(DiskCacheEntryTest, HugeSparseIO) { |
| 1005 InitCache(); | 1178 InitCache(); |
| 1006 HugeSparseIO(false); | 1179 HugeSparseIO(); |
| 1007 } | 1180 } |
| 1008 | 1181 |
| 1009 TEST_F(DiskCacheEntryTest, MemoryOnlyHugeSparseSyncIO) { | 1182 TEST_F(DiskCacheEntryTest, MemoryOnlyHugeSparseIO) { |
| 1010 SetMemoryOnlyMode(); | 1183 SetMemoryOnlyMode(); |
| 1011 InitCache(); | 1184 InitCache(); |
| 1012 HugeSparseIO(false); | 1185 HugeSparseIO(); |
| 1013 } | |
| 1014 | |
| 1015 TEST_F(DiskCacheEntryTest, HugeSparseAsyncIO) { | |
| 1016 InitCache(); | |
| 1017 HugeSparseIO(true); | |
| 1018 } | |
| 1019 | |
| 1020 TEST_F(DiskCacheEntryTest, MemoryOnlyHugeSparseAsyncIO) { | |
| 1021 SetMemoryOnlyMode(); | |
| 1022 InitCache(); | |
| 1023 HugeSparseIO(true); | |
| 1024 } | 1186 } |
| 1025 | 1187 |
| 1026 void DiskCacheEntryTest::GetAvailableRange() { | 1188 void DiskCacheEntryTest::GetAvailableRange() { |
| 1027 std::string key("the first key"); | 1189 std::string key("the first key"); |
| 1028 disk_cache::Entry* entry; | 1190 disk_cache::Entry* entry; |
| 1029 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1191 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1030 | 1192 |
| 1031 const int kSize = 16 * 1024; | 1193 const int kSize = 16 * 1024; |
| 1032 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize); | 1194 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize); |
| 1033 CacheTestFillBuffer(buf->data(), kSize, false); | 1195 CacheTestFillBuffer(buf->data(), kSize, false); |
| 1034 | 1196 |
| 1035 // Write at offset 0x20F0000 (33 MB - 64 KB), and 0x20F4400 (33 MB - 47 KB). | 1197 // Write at offset 0x20F0000 (33 MB - 64 KB), and 0x20F4400 (33 MB - 47 KB). |
| 1036 EXPECT_EQ(kSize, entry->WriteSparseData(0x20F0000, buf, kSize, NULL)); | 1198 EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf, kSize)); |
| 1037 EXPECT_EQ(kSize, entry->WriteSparseData(0x20F4400, buf, kSize, NULL)); | 1199 EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F4400, buf, kSize)); |
| 1038 | 1200 |
| 1039 // We stop at the first empty block. | 1201 // We stop at the first empty block. |
| 1040 int64 start; | 1202 int64 start; |
| 1041 TestCompletionCallback cb; | 1203 TestCompletionCallback cb; |
| 1042 int rv = entry->GetAvailableRange(0x20F0000, kSize * 2, &start, &cb); | 1204 int rv = entry->GetAvailableRange(0x20F0000, kSize * 2, &start, &cb); |
| 1043 EXPECT_EQ(kSize, cb.GetResult(rv)); | 1205 EXPECT_EQ(kSize, cb.GetResult(rv)); |
| 1044 EXPECT_EQ(0x20F0000, start); | 1206 EXPECT_EQ(0x20F0000, start); |
| 1045 | 1207 |
| 1046 start = 0; | 1208 start = 0; |
| 1047 rv = entry->GetAvailableRange(0, kSize, &start, &cb); | 1209 rv = entry->GetAvailableRange(0, kSize, &start, &cb); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1088 void DiskCacheEntryTest::CouldBeSparse() { | 1250 void DiskCacheEntryTest::CouldBeSparse() { |
| 1089 std::string key("the first key"); | 1251 std::string key("the first key"); |
| 1090 disk_cache::Entry* entry; | 1252 disk_cache::Entry* entry; |
| 1091 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1253 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1092 | 1254 |
| 1093 const int kSize = 16 * 1024; | 1255 const int kSize = 16 * 1024; |
| 1094 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize); | 1256 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize); |
| 1095 CacheTestFillBuffer(buf->data(), kSize, false); | 1257 CacheTestFillBuffer(buf->data(), kSize, false); |
| 1096 | 1258 |
| 1097 // Write at offset 0x20F0000 (33 MB - 64 KB). | 1259 // Write at offset 0x20F0000 (33 MB - 64 KB). |
| 1098 EXPECT_EQ(kSize, entry->WriteSparseData(0x20F0000, buf, kSize, NULL)); | 1260 EXPECT_EQ(kSize, WriteSparseData(entry, 0x20F0000, buf, kSize)); |
| 1099 | 1261 |
| 1100 EXPECT_TRUE(entry->CouldBeSparse()); | 1262 EXPECT_TRUE(entry->CouldBeSparse()); |
| 1101 entry->Close(); | 1263 entry->Close(); |
| 1102 | 1264 |
| 1103 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1265 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1104 EXPECT_TRUE(entry->CouldBeSparse()); | 1266 EXPECT_TRUE(entry->CouldBeSparse()); |
| 1105 entry->Close(); | 1267 entry->Close(); |
| 1106 | 1268 |
| 1107 // Now verify a regular entry. | 1269 // Now verify a regular entry. |
| 1108 key.assign("another key"); | 1270 key.assign("another key"); |
| 1109 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1271 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1110 EXPECT_FALSE(entry->CouldBeSparse()); | 1272 EXPECT_FALSE(entry->CouldBeSparse()); |
| 1111 | 1273 |
| 1112 EXPECT_EQ(kSize, entry->WriteData(0, 0, buf, kSize, NULL, false)); | 1274 EXPECT_EQ(kSize, WriteData(entry, 0, 0, buf, kSize, false)); |
| 1113 EXPECT_EQ(kSize, entry->WriteData(1, 0, buf, kSize, NULL, false)); | 1275 EXPECT_EQ(kSize, WriteData(entry, 1, 0, buf, kSize, false)); |
| 1114 EXPECT_EQ(kSize, entry->WriteData(2, 0, buf, kSize, NULL, false)); | 1276 EXPECT_EQ(kSize, WriteData(entry, 2, 0, buf, kSize, false)); |
| 1115 | 1277 |
| 1116 EXPECT_FALSE(entry->CouldBeSparse()); | 1278 EXPECT_FALSE(entry->CouldBeSparse()); |
| 1117 entry->Close(); | 1279 entry->Close(); |
| 1118 | 1280 |
| 1119 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1281 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1120 EXPECT_FALSE(entry->CouldBeSparse()); | 1282 EXPECT_FALSE(entry->CouldBeSparse()); |
| 1121 entry->Close(); | 1283 entry->Close(); |
| 1122 } | 1284 } |
| 1123 | 1285 |
| 1124 TEST_F(DiskCacheEntryTest, CouldBeSparse) { | 1286 TEST_F(DiskCacheEntryTest, CouldBeSparse) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1142 CacheTestFillBuffer(buf_1->data(), kSize, false); | 1304 CacheTestFillBuffer(buf_1->data(), kSize, false); |
| 1143 | 1305 |
| 1144 std::string key("the first key"); | 1306 std::string key("the first key"); |
| 1145 disk_cache::Entry* entry; | 1307 disk_cache::Entry* entry; |
| 1146 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1308 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1147 | 1309 |
| 1148 // This loop writes back to back starting from offset 0 and 9000. | 1310 // This loop writes back to back starting from offset 0 and 9000. |
| 1149 for (int i = 0; i < kSize; i += 1024) { | 1311 for (int i = 0; i < kSize; i += 1024) { |
| 1150 scoped_refptr<net::WrappedIOBuffer> buf_3 = | 1312 scoped_refptr<net::WrappedIOBuffer> buf_3 = |
| 1151 new net::WrappedIOBuffer(buf_1->data() + i); | 1313 new net::WrappedIOBuffer(buf_1->data() + i); |
| 1152 VerifySparseIO(entry, i, buf_3, 1024, false, buf_2); | 1314 VerifySparseIO(entry, i, buf_3, 1024, buf_2); |
| 1153 VerifySparseIO(entry, 9000 + i, buf_3, 1024, false, buf_2); | 1315 VerifySparseIO(entry, 9000 + i, buf_3, 1024, buf_2); |
| 1154 } | 1316 } |
| 1155 | 1317 |
| 1156 // Make sure we have data written. | 1318 // Make sure we have data written. |
| 1157 VerifyContentSparseIO(entry, 0, buf_1->data(), kSize, false); | 1319 VerifyContentSparseIO(entry, 0, buf_1->data(), kSize); |
| 1158 VerifyContentSparseIO(entry, 9000, buf_1->data(), kSize, false); | 1320 VerifyContentSparseIO(entry, 9000, buf_1->data(), kSize); |
| 1159 | 1321 |
| 1160 // This tests a large write that spans 3 entries from a misaligned offset. | 1322 // This tests a large write that spans 3 entries from a misaligned offset. |
| 1161 VerifySparseIO(entry, 20481, buf_1, 8192, false, buf_2); | 1323 VerifySparseIO(entry, 20481, buf_1, 8192, buf_2); |
| 1162 | 1324 |
| 1163 entry->Close(); | 1325 entry->Close(); |
| 1164 } | 1326 } |
| 1165 | 1327 |
| 1166 TEST_F(DiskCacheEntryTest, MemoryOnlyMisalignedGetAvailableRange) { | 1328 TEST_F(DiskCacheEntryTest, MemoryOnlyMisalignedGetAvailableRange) { |
| 1167 SetMemoryOnlyMode(); | 1329 SetMemoryOnlyMode(); |
| 1168 InitCache(); | 1330 InitCache(); |
| 1169 | 1331 |
| 1170 const int kSize = 8192; | 1332 const int kSize = 8192; |
| 1171 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize); | 1333 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kSize); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1345 // We should be able to deal with IO that is not aligned to the block size | 1507 // We should be able to deal with IO that is not aligned to the block size |
| 1346 // of a sparse entry, at least to write a big range without leaving holes. | 1508 // of a sparse entry, at least to write a big range without leaving holes. |
| 1347 const int kSize = 4 * 1024; | 1509 const int kSize = 4 * 1024; |
| 1348 const int kSmallSize = 128; | 1510 const int kSmallSize = 128; |
| 1349 scoped_refptr<net::IOBuffer> buf1 = new net::IOBuffer(kSize); | 1511 scoped_refptr<net::IOBuffer> buf1 = new net::IOBuffer(kSize); |
| 1350 CacheTestFillBuffer(buf1->data(), kSize, false); | 1512 CacheTestFillBuffer(buf1->data(), kSize, false); |
| 1351 | 1513 |
| 1352 // The first write is just to extend the entry. The third write occupies | 1514 // The first write is just to extend the entry. The third write occupies |
| 1353 // a 1KB block partially, it may not be written internally depending on the | 1515 // a 1KB block partially, it may not be written internally depending on the |
| 1354 // implementation. | 1516 // implementation. |
| 1355 EXPECT_EQ(kSize, entry->WriteSparseData(20000, buf1, kSize, NULL)); | 1517 EXPECT_EQ(kSize, WriteSparseData(entry, 20000, buf1, kSize)); |
| 1356 EXPECT_EQ(kSize, entry->WriteSparseData(500, buf1, kSize, NULL)); | 1518 EXPECT_EQ(kSize, WriteSparseData(entry, 500, buf1, kSize)); |
| 1357 EXPECT_EQ(kSmallSize, | 1519 EXPECT_EQ(kSmallSize, WriteSparseData(entry, 1080321, buf1, kSmallSize)); |
| 1358 entry->WriteSparseData(1080321, buf1, kSmallSize, NULL)); | |
| 1359 entry->Close(); | 1520 entry->Close(); |
| 1360 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1521 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1361 | 1522 |
| 1362 scoped_refptr<net::IOBuffer> buf2 = new net::IOBuffer(kSize); | 1523 scoped_refptr<net::IOBuffer> buf2 = new net::IOBuffer(kSize); |
| 1363 memset(buf2->data(), 0, kSize); | 1524 memset(buf2->data(), 0, kSize); |
| 1364 EXPECT_EQ(0, entry->ReadSparseData(8000, buf2, kSize, NULL)); | 1525 EXPECT_EQ(0, entry->ReadSparseData(8000, buf2, kSize, NULL)); |
| 1365 | 1526 |
| 1366 EXPECT_EQ(500, entry->ReadSparseData(kSize, buf2, kSize, NULL)); | 1527 EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2, kSize)); |
| 1367 EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); | 1528 EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); |
| 1368 EXPECT_EQ(0, entry->ReadSparseData(0, buf2, kSize, NULL)); | 1529 EXPECT_EQ(0, ReadSparseData(entry, 0, buf2, kSize)); |
| 1369 | 1530 |
| 1370 // This read should not change anything. | 1531 // This read should not change anything. |
| 1371 EXPECT_EQ(96, entry->ReadSparseData(24000, buf2, kSize, NULL)); | 1532 EXPECT_EQ(96, ReadSparseData(entry, 24000, buf2, kSize)); |
| 1372 EXPECT_EQ(500, entry->ReadSparseData(kSize, buf2, kSize, NULL)); | 1533 EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2, kSize)); |
| 1373 EXPECT_EQ(0, entry->ReadSparseData(499, buf2, kSize, NULL)); | 1534 EXPECT_EQ(0, ReadSparseData(entry, 99, buf2, kSize)); |
| 1374 | 1535 |
| 1375 int rv; | 1536 int rv; |
| 1376 int64 start; | 1537 int64 start; |
| 1377 TestCompletionCallback cb; | 1538 TestCompletionCallback cb; |
| 1378 if (memory_only_) { | 1539 if (memory_only_) { |
| 1379 rv = entry->GetAvailableRange(0, 600, &start, &cb); | 1540 rv = entry->GetAvailableRange(0, 600, &start, &cb); |
| 1380 EXPECT_EQ(100, cb.GetResult(rv)); | 1541 EXPECT_EQ(100, cb.GetResult(rv)); |
| 1381 EXPECT_EQ(500, start); | 1542 EXPECT_EQ(500, start); |
| 1382 } else { | 1543 } else { |
| 1383 rv = entry->GetAvailableRange(0, 2048, &start, &cb); | 1544 rv = entry->GetAvailableRange(0, 2048, &start, &cb); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1404 EXPECT_EQ(20480, start); | 1565 EXPECT_EQ(20480, start); |
| 1405 } | 1566 } |
| 1406 rv = entry->GetAvailableRange(3073, kSize, &start, &cb); | 1567 rv = entry->GetAvailableRange(3073, kSize, &start, &cb); |
| 1407 EXPECT_EQ(1523, cb.GetResult(rv)); | 1568 EXPECT_EQ(1523, cb.GetResult(rv)); |
| 1408 EXPECT_EQ(3073, start); | 1569 EXPECT_EQ(3073, start); |
| 1409 rv = entry->GetAvailableRange(4600, kSize, &start, &cb); | 1570 rv = entry->GetAvailableRange(4600, kSize, &start, &cb); |
| 1410 EXPECT_EQ(0, cb.GetResult(rv)); | 1571 EXPECT_EQ(0, cb.GetResult(rv)); |
| 1411 EXPECT_EQ(4600, start); | 1572 EXPECT_EQ(4600, start); |
| 1412 | 1573 |
| 1413 // Now make another write and verify that there is no hole in between. | 1574 // Now make another write and verify that there is no hole in between. |
| 1414 EXPECT_EQ(kSize, entry->WriteSparseData(500 + kSize, buf1, kSize, NULL)); | 1575 EXPECT_EQ(kSize, WriteSparseData(entry, 500 + kSize, buf1, kSize)); |
| 1415 rv = entry->GetAvailableRange(1024, 10000, &start, &cb); | 1576 rv = entry->GetAvailableRange(1024, 10000, &start, &cb); |
| 1416 EXPECT_EQ(7 * 1024 + 500, cb.GetResult(rv)); | 1577 EXPECT_EQ(7 * 1024 + 500, cb.GetResult(rv)); |
| 1417 EXPECT_EQ(1024, start); | 1578 EXPECT_EQ(1024, start); |
| 1418 EXPECT_EQ(kSize, entry->ReadSparseData(kSize, buf2, kSize, NULL)); | 1579 EXPECT_EQ(kSize, ReadSparseData(entry, kSize, buf2, kSize)); |
| 1419 EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); | 1580 EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); |
| 1420 EXPECT_EQ(0, memcmp(buf2->data() + 500, buf1->data(), kSize - 500)); | 1581 EXPECT_EQ(0, memcmp(buf2->data() + 500, buf1->data(), kSize - 500)); |
| 1421 | 1582 |
| 1422 entry->Close(); | 1583 entry->Close(); |
| 1423 } | 1584 } |
| 1424 | 1585 |
| 1425 TEST_F(DiskCacheEntryTest, PartialSparseEntry) { | 1586 TEST_F(DiskCacheEntryTest, PartialSparseEntry) { |
| 1426 InitCache(); | 1587 InitCache(); |
| 1427 PartialSparseEntry(); | 1588 PartialSparseEntry(); |
| 1428 } | 1589 } |
| 1429 | 1590 |
| 1430 TEST_F(DiskCacheEntryTest, MemoryPartialSparseEntry) { | 1591 TEST_F(DiskCacheEntryTest, MemoryPartialSparseEntry) { |
| 1431 SetMemoryOnlyMode(); | 1592 SetMemoryOnlyMode(); |
| 1432 InitCache(); | 1593 InitCache(); |
| 1433 PartialSparseEntry(); | 1594 PartialSparseEntry(); |
| 1434 } | 1595 } |
| 1435 | 1596 |
| 1436 // Tests that corrupt sparse children are removed automatically. | 1597 // Tests that corrupt sparse children are removed automatically. |
| 1437 TEST_F(DiskCacheEntryTest, CleanupSparseEntry) { | 1598 TEST_F(DiskCacheEntryTest, CleanupSparseEntry) { |
| 1438 InitCache(); | 1599 InitCache(); |
| 1439 std::string key("the first key"); | 1600 std::string key("the first key"); |
| 1440 disk_cache::Entry* entry; | 1601 disk_cache::Entry* entry; |
| 1441 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); | 1602 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); |
| 1442 | 1603 |
| 1443 const int kSize = 4 * 1024; | 1604 const int kSize = 4 * 1024; |
| 1444 scoped_refptr<net::IOBuffer> buf1 = new net::IOBuffer(kSize); | 1605 scoped_refptr<net::IOBuffer> buf1 = new net::IOBuffer(kSize); |
| 1445 CacheTestFillBuffer(buf1->data(), kSize, false); | 1606 CacheTestFillBuffer(buf1->data(), kSize, false); |
| 1446 | 1607 |
| 1447 const int k1Meg = 1024 * 1024; | 1608 const int k1Meg = 1024 * 1024; |
| 1448 EXPECT_EQ(kSize, entry->WriteSparseData(8192, buf1, kSize, NULL)); | 1609 EXPECT_EQ(kSize, WriteSparseData(entry, 8192, buf1, kSize)); |
| 1449 EXPECT_EQ(kSize, entry->WriteSparseData(k1Meg + 8192, buf1, kSize, NULL)); | 1610 EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 8192, buf1, kSize)); |
| 1450 EXPECT_EQ(kSize, entry->WriteSparseData(2 * k1Meg + 8192, buf1, kSize, NULL)); | 1611 EXPECT_EQ(kSize, WriteSparseData(entry, 2 * k1Meg + 8192, buf1, kSize)); |
| 1451 entry->Close(); | 1612 entry->Close(); |
| 1452 EXPECT_EQ(4, cache_->GetEntryCount()); | 1613 EXPECT_EQ(4, cache_->GetEntryCount()); |
| 1453 | 1614 |
| 1454 void* iter = NULL; | 1615 void* iter = NULL; |
| 1455 int count = 0; | 1616 int count = 0; |
| 1456 std::string child_key[2]; | 1617 std::string child_key[2]; |
| 1457 while (OpenNextEntry(&iter, &entry) == net::OK) { | 1618 while (OpenNextEntry(&iter, &entry) == net::OK) { |
| 1458 ASSERT_TRUE(entry != NULL); | 1619 ASSERT_TRUE(entry != NULL); |
| 1459 // Writing to an entry will alter the LRU list and invalidate the iterator. | 1620 // Writing to an entry will alter the LRU list and invalidate the iterator. |
| 1460 if (entry->GetKey() != key && count < 2) | 1621 if (entry->GetKey() != key && count < 2) |
| 1461 child_key[count++] = entry->GetKey(); | 1622 child_key[count++] = entry->GetKey(); |
| 1462 entry->Close(); | 1623 entry->Close(); |
| 1463 } | 1624 } |
| 1464 for (int i = 0; i < 2; i++) { | 1625 for (int i = 0; i < 2; i++) { |
| 1465 ASSERT_EQ(net::OK, OpenEntry(child_key[i], &entry)); | 1626 ASSERT_EQ(net::OK, OpenEntry(child_key[i], &entry)); |
| 1466 // Overwrite the header's magic and signature. | 1627 // Overwrite the header's magic and signature. |
| 1467 EXPECT_EQ(12, entry->WriteData(2, 0, buf1, 12, NULL, false)); | 1628 EXPECT_EQ(12, WriteData(entry, 2, 0, buf1, 12, false)); |
| 1468 entry->Close(); | 1629 entry->Close(); |
| 1469 } | 1630 } |
| 1470 | 1631 |
| 1471 EXPECT_EQ(4, cache_->GetEntryCount()); | 1632 EXPECT_EQ(4, cache_->GetEntryCount()); |
| 1472 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); | 1633 ASSERT_EQ(net::OK, OpenEntry(key, &entry)); |
| 1473 | 1634 |
| 1474 // Two children should be gone. One while reading and one while writing. | 1635 // Two children should be gone. One while reading and one while writing. |
| 1475 EXPECT_EQ(0, entry->ReadSparseData(2 * k1Meg + 8192, buf1, kSize, NULL)); | 1636 EXPECT_EQ(0, ReadSparseData(entry, 2 * k1Meg + 8192, buf1, kSize)); |
| 1476 EXPECT_EQ(kSize, entry->WriteSparseData(k1Meg + 16384, buf1, kSize, NULL)); | 1637 EXPECT_EQ(kSize, WriteSparseData(entry, k1Meg + 16384, buf1, kSize)); |
| 1477 EXPECT_EQ(0, entry->ReadSparseData(k1Meg + 8192, buf1, kSize, NULL)); | 1638 EXPECT_EQ(0, ReadSparseData(entry, k1Meg + 8192, buf1, kSize)); |
| 1478 | 1639 |
| 1479 // We never touched this one. | 1640 // We never touched this one. |
| 1480 EXPECT_EQ(kSize, entry->ReadSparseData(8192, buf1, kSize, NULL)); | 1641 EXPECT_EQ(kSize, ReadSparseData(entry, 8192, buf1, kSize)); |
| 1481 entry->Close(); | 1642 entry->Close(); |
| 1482 | 1643 |
| 1483 // We re-created one of the corrupt children. | 1644 // We re-created one of the corrupt children. |
| 1484 EXPECT_EQ(3, cache_->GetEntryCount()); | 1645 EXPECT_EQ(3, cache_->GetEntryCount()); |
| 1485 } | 1646 } |
| 1486 | 1647 |
| 1487 TEST_F(DiskCacheEntryTest, CancelSparseIO) { | 1648 TEST_F(DiskCacheEntryTest, CancelSparseIO) { |
| 1488 UseCurrentThread(); | 1649 UseCurrentThread(); |
| 1489 InitCache(); | 1650 InitCache(); |
| 1490 std::string key("the first key"); | 1651 std::string key("the first key"); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1528 rv = cb1.WaitForResult(); | 1689 rv = cb1.WaitForResult(); |
| 1529 EXPECT_TRUE(rv == 4096 || rv == kSize); | 1690 EXPECT_TRUE(rv == 4096 || rv == kSize); |
| 1530 EXPECT_EQ(net::OK, cb2.WaitForResult()); | 1691 EXPECT_EQ(net::OK, cb2.WaitForResult()); |
| 1531 EXPECT_EQ(net::OK, cb3.WaitForResult()); | 1692 EXPECT_EQ(net::OK, cb3.WaitForResult()); |
| 1532 EXPECT_EQ(net::OK, cb4.WaitForResult()); | 1693 EXPECT_EQ(net::OK, cb4.WaitForResult()); |
| 1533 | 1694 |
| 1534 rv = entry->GetAvailableRange(offset, kSize, &offset, &cb5); | 1695 rv = entry->GetAvailableRange(offset, kSize, &offset, &cb5); |
| 1535 EXPECT_EQ(0, cb5.GetResult(rv)); | 1696 EXPECT_EQ(0, cb5.GetResult(rv)); |
| 1536 entry->Close(); | 1697 entry->Close(); |
| 1537 } | 1698 } |
| OLD | NEW |