| OLD | NEW | 
|---|
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/file_util.h" | 6 #include "base/file_util.h" | 
| 7 #include "base/path_service.h" | 7 #include "base/path_service.h" | 
| 8 #include "base/platform_thread.h" | 8 #include "base/platform_thread.h" | 
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" | 
|  | 10 #include "net/base/io_buffer.h" | 
| 10 #include "net/base/net_errors.h" | 11 #include "net/base/net_errors.h" | 
| 11 #include "net/disk_cache/backend_impl.h" | 12 #include "net/disk_cache/backend_impl.h" | 
| 12 #include "net/disk_cache/disk_cache_test_base.h" | 13 #include "net/disk_cache/disk_cache_test_base.h" | 
| 13 #include "net/disk_cache/disk_cache_test_util.h" | 14 #include "net/disk_cache/disk_cache_test_util.h" | 
| 14 #include "net/disk_cache/mapped_file.h" | 15 #include "net/disk_cache/mapped_file.h" | 
| 15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" | 
| 16 | 17 | 
| 17 using base::Time; | 18 using base::Time; | 
| 18 | 19 | 
| 19 namespace { | 20 namespace { | 
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 202   InitCache(); | 203   InitCache(); | 
| 203   BackendKeying(); | 204   BackendKeying(); | 
| 204 } | 205 } | 
| 205 | 206 | 
| 206 TEST_F(DiskCacheBackendTest, ExternalFiles) { | 207 TEST_F(DiskCacheBackendTest, ExternalFiles) { | 
| 207   InitCache(); | 208   InitCache(); | 
| 208   // First, lets create a file on the folder. | 209   // First, lets create a file on the folder. | 
| 209   std::wstring filename = GetCachePath(); | 210   std::wstring filename = GetCachePath(); | 
| 210   file_util::AppendToPath(&filename, L"f_000001"); | 211   file_util::AppendToPath(&filename, L"f_000001"); | 
| 211 | 212 | 
| 212   const int kDataSize = 50; | 213   const int kSize = 50; | 
| 213   char data[kDataSize]; | 214   scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); | 
| 214   CacheTestFillBuffer(data, kDataSize, false); | 215   CacheTestFillBuffer(buffer1->data(), kSize, false); | 
| 215   ASSERT_EQ(kDataSize, file_util::WriteFile(filename, data, kDataSize)); | 216   ASSERT_EQ(kSize, file_util::WriteFile(filename, buffer1->data(), kSize)); | 
| 216 | 217 | 
| 217   // Now let's create a file with the cache. | 218   // Now let's create a file with the cache. | 
| 218   disk_cache::Entry* entry; | 219   disk_cache::Entry* entry; | 
| 219   ASSERT_TRUE(cache_->CreateEntry("key", &entry)); | 220   ASSERT_TRUE(cache_->CreateEntry("key", &entry)); | 
| 220   ASSERT_EQ(0, entry->WriteData(0, 20000, data, 0, NULL, false)); | 221   ASSERT_EQ(0, entry->WriteData(0, 20000, buffer1, 0, NULL, false)); | 
| 221   entry->Close(); | 222   entry->Close(); | 
| 222 | 223 | 
| 223   // And verify that the first file is still there. | 224   // And verify that the first file is still there. | 
| 224   char buffer[kDataSize]; | 225   scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize); | 
| 225   ASSERT_EQ(kDataSize, file_util::ReadFile(filename, buffer, kDataSize)); | 226   ASSERT_EQ(kSize, file_util::ReadFile(filename, buffer2->data(), kSize)); | 
| 226   EXPECT_EQ(0, memcmp(data, buffer, kDataSize)); | 227   EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize)); | 
| 227 } | 228 } | 
| 228 | 229 | 
| 229 void DiskCacheBackendTest::BackendSetSize() { | 230 void DiskCacheBackendTest::BackendSetSize() { | 
| 230   SetDirectMode(); | 231   SetDirectMode(); | 
| 231   const int cache_size = 0x10000;  // 64 kB | 232   const int cache_size = 0x10000;  // 64 kB | 
| 232   SetMaxSize(cache_size); | 233   SetMaxSize(cache_size); | 
| 233   InitCache(); | 234   InitCache(); | 
| 234 | 235 | 
| 235   std::string first("some key"); | 236   std::string first("some key"); | 
| 236   std::string second("something else"); | 237   std::string second("something else"); | 
| 237   disk_cache::Entry* entry; | 238   disk_cache::Entry* entry; | 
| 238   ASSERT_TRUE(cache_->CreateEntry(first, &entry)); | 239   ASSERT_TRUE(cache_->CreateEntry(first, &entry)); | 
| 239 | 240 | 
| 240   char buffer[cache_size] = {0}; | 241   scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(cache_size); | 
|  | 242   memset(buffer->data(), 0, cache_size); | 
| 241   EXPECT_EQ(cache_size / 10, entry->WriteData(0, 0, buffer, cache_size / 10, | 243   EXPECT_EQ(cache_size / 10, entry->WriteData(0, 0, buffer, cache_size / 10, | 
| 242                                               NULL, false)) << "normal file"; | 244                                               NULL, false)) << "normal file"; | 
| 243 | 245 | 
| 244   EXPECT_EQ(net::ERR_FAILED, entry->WriteData(1, 0, buffer, cache_size / 5, | 246   EXPECT_EQ(net::ERR_FAILED, entry->WriteData(1, 0, buffer, cache_size / 5, | 
| 245                 NULL, false)) << "file size above the limit"; | 247                 NULL, false)) << "file size above the limit"; | 
| 246 | 248 | 
| 247   // By doubling the total size, we make this file cacheable. | 249   // By doubling the total size, we make this file cacheable. | 
| 248   SetMaxSize(cache_size * 2); | 250   SetMaxSize(cache_size * 2); | 
| 249   EXPECT_EQ(cache_size / 5, entry->WriteData(1, 0, buffer, cache_size / 5, | 251   EXPECT_EQ(cache_size / 5, entry->WriteData(1, 0, buffer, cache_size / 5, | 
| 250                                              NULL, false)); | 252                                              NULL, false)); | 
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 331 | 333 | 
| 332 // Before looking for invalid entries, let's check a valid entry. | 334 // Before looking for invalid entries, let's check a valid entry. | 
| 333 TEST_F(DiskCacheBackendTest, ValidEntry) { | 335 TEST_F(DiskCacheBackendTest, ValidEntry) { | 
| 334   SetDirectMode(); | 336   SetDirectMode(); | 
| 335   InitCache(); | 337   InitCache(); | 
| 336 | 338 | 
| 337   std::string key("Some key"); | 339   std::string key("Some key"); | 
| 338   disk_cache::Entry* entry1; | 340   disk_cache::Entry* entry1; | 
| 339   ASSERT_TRUE(cache_->CreateEntry(key, &entry1)); | 341   ASSERT_TRUE(cache_->CreateEntry(key, &entry1)); | 
| 340 | 342 | 
| 341   char data[] = "And the data to save"; | 343   const int kSize = 50; | 
| 342   EXPECT_TRUE(sizeof(data) == entry1->WriteData(0, 0, data, sizeof(data), NULL, | 344   scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); | 
| 343                                                 false)); | 345   base::strlcpy(buffer1->data(), "And the data to save", kSize); | 
|  | 346   EXPECT_EQ(kSize, entry1->WriteData(0, 0, buffer1, kSize, NULL, false)); | 
| 344   entry1->Close(); | 347   entry1->Close(); | 
| 345   SimulateCrash(); | 348   SimulateCrash(); | 
| 346 | 349 | 
| 347   ASSERT_TRUE(cache_->OpenEntry(key, &entry1)); | 350   ASSERT_TRUE(cache_->OpenEntry(key, &entry1)); | 
| 348 | 351 | 
| 349   char buffer[40]; | 352   scoped_refptr<net::IOBuffer> buffer2 = new net::IOBuffer(kSize); | 
| 350   memset(buffer, 0, sizeof(buffer)); | 353   memset(buffer2->data(), 0, kSize); | 
| 351   EXPECT_TRUE(sizeof(data) == entry1->ReadData(0, 0, buffer, sizeof(data), | 354   EXPECT_EQ(kSize, entry1->ReadData(0, 0, buffer2, kSize, NULL)); | 
| 352                                                NULL)); |  | 
| 353   entry1->Close(); | 355   entry1->Close(); | 
| 354   EXPECT_STREQ(data, buffer); | 356   EXPECT_STREQ(buffer1->data(), buffer2->data()); | 
| 355 } | 357 } | 
| 356 | 358 | 
| 357 // The same logic of the previous test (ValidEntry), but this time force the | 359 // The same logic of the previous test (ValidEntry), but this time force the | 
| 358 // entry to be invalid, simulating a crash in the middle. | 360 // entry to be invalid, simulating a crash in the middle. | 
| 359 // We'll be leaking memory from this test. | 361 // We'll be leaking memory from this test. | 
| 360 TEST_F(DiskCacheBackendTest, InvalidEntry) { | 362 TEST_F(DiskCacheBackendTest, InvalidEntry) { | 
| 361   // Use the implementation directly... we need to simulate a crash. | 363   // Use the implementation directly... we need to simulate a crash. | 
| 362   SetDirectMode(); | 364   SetDirectMode(); | 
| 363   InitCache(); | 365   InitCache(); | 
| 364 | 366 | 
| 365   std::string key("Some key"); | 367   std::string key("Some key"); | 
| 366   disk_cache::Entry* entry1; | 368   disk_cache::Entry* entry1; | 
| 367   ASSERT_TRUE(cache_->CreateEntry(key, &entry1)); | 369   ASSERT_TRUE(cache_->CreateEntry(key, &entry1)); | 
| 368 | 370 | 
| 369   char data[] = "And the data to save"; | 371   const int kSize = 50; | 
| 370   EXPECT_TRUE(sizeof(data) == entry1->WriteData(0, 0, data, sizeof(data), NULL, | 372   scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); | 
| 371                                                 false)); | 373   base::strlcpy(buffer1->data(), "And the data to save", kSize); | 
|  | 374   EXPECT_EQ(kSize, entry1->WriteData(0, 0, buffer1, kSize, NULL, false)); | 
| 372   SimulateCrash(); | 375   SimulateCrash(); | 
| 373 | 376 | 
| 374   EXPECT_FALSE(cache_->OpenEntry(key, &entry1)); | 377   EXPECT_FALSE(cache_->OpenEntry(key, &entry1)); | 
| 375   EXPECT_EQ(0, cache_->GetEntryCount()); | 378   EXPECT_EQ(0, cache_->GetEntryCount()); | 
| 376 } | 379 } | 
| 377 | 380 | 
| 378 // Almost the same test, but this time crash the cache after reading an entry. | 381 // Almost the same test, but this time crash the cache after reading an entry. | 
| 379 // We'll be leaking memory from this test. | 382 // We'll be leaking memory from this test. | 
| 380 TEST_F(DiskCacheBackendTest, InvalidEntryRead) { | 383 TEST_F(DiskCacheBackendTest, InvalidEntryRead) { | 
| 381   // Use the implementation directly... we need to simulate a crash. | 384   // Use the implementation directly... we need to simulate a crash. | 
| 382   SetDirectMode(); | 385   SetDirectMode(); | 
| 383   InitCache(); | 386   InitCache(); | 
| 384 | 387 | 
| 385   std::string key("Some key"); | 388   std::string key("Some key"); | 
| 386   disk_cache::Entry* entry1; | 389   disk_cache::Entry* entry1; | 
| 387   ASSERT_TRUE(cache_->CreateEntry(key, &entry1)); | 390   ASSERT_TRUE(cache_->CreateEntry(key, &entry1)); | 
| 388 | 391 | 
| 389   char data[] = "And the data to save"; | 392   const int kSize = 50; | 
| 390   EXPECT_TRUE(sizeof(data) == entry1->WriteData(0, 0, data, sizeof(data), NULL, | 393   scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); | 
| 391                                                 false)); | 394   base::strlcpy(buffer1->data(), "And the data to save", kSize); | 
|  | 395   EXPECT_EQ(kSize, entry1->WriteData(0, 0, buffer1, kSize, NULL, false)); | 
| 392   entry1->Close(); | 396   entry1->Close(); | 
| 393   ASSERT_TRUE(cache_->OpenEntry(key, &entry1)); | 397   ASSERT_TRUE(cache_->OpenEntry(key, &entry1)); | 
| 394   EXPECT_TRUE(sizeof(data) == entry1->ReadData(0, 0, data, sizeof(data), NULL)); | 398   EXPECT_EQ(kSize, entry1->ReadData(0, 0, buffer1, kSize, NULL)); | 
| 395 | 399 | 
| 396   SimulateCrash(); | 400   SimulateCrash(); | 
| 397 | 401 | 
| 398   EXPECT_FALSE(cache_->OpenEntry(key, &entry1)); | 402   EXPECT_FALSE(cache_->OpenEntry(key, &entry1)); | 
| 399   EXPECT_EQ(0, cache_->GetEntryCount()); | 403   EXPECT_EQ(0, cache_->GetEntryCount()); | 
| 400 } | 404 } | 
| 401 | 405 | 
| 402 // We'll be leaking memory from this test. | 406 // We'll be leaking memory from this test. | 
| 403 TEST_F(DiskCacheBackendTest, InvalidEntryWithLoad) { | 407 TEST_F(DiskCacheBackendTest, InvalidEntryWithLoad) { | 
| 404   // Work with a tiny index table (16 entries) | 408   // Work with a tiny index table (16 entries) | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 455 | 459 | 
| 456   const int cache_size = 0x4000;  // 16 kB | 460   const int cache_size = 0x4000;  // 16 kB | 
| 457   SetMaxSize(cache_size * 10); | 461   SetMaxSize(cache_size * 10); | 
| 458   InitCache(); | 462   InitCache(); | 
| 459 | 463 | 
| 460   std::string first("some key"); | 464   std::string first("some key"); | 
| 461   std::string second("something else"); | 465   std::string second("something else"); | 
| 462   disk_cache::Entry* entry; | 466   disk_cache::Entry* entry; | 
| 463   ASSERT_TRUE(cache_->CreateEntry(first, &entry)); | 467   ASSERT_TRUE(cache_->CreateEntry(first, &entry)); | 
| 464 | 468 | 
| 465   char buffer[cache_size] = {0}; | 469   scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(cache_size); | 
|  | 470   memset(buffer->data(), 0, cache_size); | 
| 466   EXPECT_EQ(cache_size * 19 / 20, entry->WriteData(0, 0, buffer, | 471   EXPECT_EQ(cache_size * 19 / 20, entry->WriteData(0, 0, buffer, | 
| 467                 cache_size * 19 / 20, NULL, false)); | 472                 cache_size * 19 / 20, NULL, false)); | 
| 468 | 473 | 
| 469   // Simulate a crash. | 474   // Simulate a crash. | 
| 470   SimulateCrash(); | 475   SimulateCrash(); | 
| 471 | 476 | 
| 472   ASSERT_TRUE(cache_->CreateEntry(second, &entry)); | 477   ASSERT_TRUE(cache_->CreateEntry(second, &entry)); | 
| 473   EXPECT_EQ(cache_size / 10, entry->WriteData(0, 0, buffer, cache_size / 10, | 478   EXPECT_EQ(cache_size / 10, entry->WriteData(0, 0, buffer, cache_size / 10, | 
| 474                                               NULL, false)) << "trim the cache"; | 479                                               NULL, false)) << "trim the cache"; | 
| 475   entry->Close(); | 480   entry->Close(); | 
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 542 // We'll be leaking memory from this test. | 547 // We'll be leaking memory from this test. | 
| 543 TEST_F(DiskCacheBackendTest, InvalidEntryEnumeration) { | 548 TEST_F(DiskCacheBackendTest, InvalidEntryEnumeration) { | 
| 544   // Use the implementation directly... we need to simulate a crash. | 549   // Use the implementation directly... we need to simulate a crash. | 
| 545   SetDirectMode(); | 550   SetDirectMode(); | 
| 546   InitCache(); | 551   InitCache(); | 
| 547 | 552 | 
| 548   std::string key("Some key"); | 553   std::string key("Some key"); | 
| 549   disk_cache::Entry *entry, *entry1, *entry2; | 554   disk_cache::Entry *entry, *entry1, *entry2; | 
| 550   ASSERT_TRUE(cache_->CreateEntry(key, &entry1)); | 555   ASSERT_TRUE(cache_->CreateEntry(key, &entry1)); | 
| 551 | 556 | 
| 552   char data[] = "And the data to save"; | 557   const int kSize = 50; | 
| 553   EXPECT_TRUE(sizeof(data) == entry1->WriteData(0, 0, data, sizeof(data), NULL, | 558   scoped_refptr<net::IOBuffer> buffer1 = new net::IOBuffer(kSize); | 
| 554                                                 false)); | 559   base::strlcpy(buffer1->data(), "And the data to save", kSize); | 
|  | 560   EXPECT_EQ(kSize, entry1->WriteData(0, 0, buffer1, kSize, NULL, false)); | 
| 555   entry1->Close(); | 561   entry1->Close(); | 
| 556   ASSERT_TRUE(cache_->OpenEntry(key, &entry1)); | 562   ASSERT_TRUE(cache_->OpenEntry(key, &entry1)); | 
| 557   EXPECT_TRUE(sizeof(data) == entry1->ReadData(0, 0, data, sizeof(data), NULL)); | 563   EXPECT_EQ(kSize, entry1->ReadData(0, 0, buffer1, kSize, NULL)); | 
| 558 | 564 | 
| 559   std::string key2("Another key"); | 565   std::string key2("Another key"); | 
| 560   ASSERT_TRUE(cache_->CreateEntry(key2, &entry2)); | 566   ASSERT_TRUE(cache_->CreateEntry(key2, &entry2)); | 
| 561   entry2->Close(); | 567   entry2->Close(); | 
| 562   ASSERT_EQ(2, cache_->GetEntryCount()); | 568   ASSERT_EQ(2, cache_->GetEntryCount()); | 
| 563 | 569 | 
| 564   SimulateCrash(); | 570   SimulateCrash(); | 
| 565 | 571 | 
| 566   void* iter = NULL; | 572   void* iter = NULL; | 
| 567   int count = 0; | 573   int count = 0; | 
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 970   InitCache(); | 976   InitCache(); | 
| 971   BackendDoomAll(); | 977   BackendDoomAll(); | 
| 972 } | 978 } | 
| 973 | 979 | 
| 974 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) { | 980 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) { | 
| 975   SetMemoryOnlyMode(); | 981   SetMemoryOnlyMode(); | 
| 976   InitCache(); | 982   InitCache(); | 
| 977   BackendDoomAll(); | 983   BackendDoomAll(); | 
| 978 } | 984 } | 
| 979 | 985 | 
| OLD | NEW | 
|---|