summaryrefslogtreecommitdiff
path: root/chromium/net/disk_cache/simple/simple_index_file_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/disk_cache/simple/simple_index_file_unittest.cc')
-rw-r--r--chromium/net/disk_cache/simple/simple_index_file_unittest.cc243
1 files changed, 243 insertions, 0 deletions
diff --git a/chromium/net/disk_cache/simple/simple_index_file_unittest.cc b/chromium/net/disk_cache/simple/simple_index_file_unittest.cc
new file mode 100644
index 00000000000..bf7ee83c30e
--- /dev/null
+++ b/chromium/net/disk_cache/simple/simple_index_file_unittest.cc
@@ -0,0 +1,243 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/file_util.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/hash.h"
+#include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop/message_loop_proxy.h"
+#include "base/pickle.h"
+#include "base/run_loop.h"
+#include "base/strings/stringprintf.h"
+#include "base/time/time.h"
+#include "net/disk_cache/simple/simple_entry_format.h"
+#include "net/disk_cache/simple/simple_index.h"
+#include "net/disk_cache/simple/simple_index_file.h"
+#include "net/disk_cache/simple/simple_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using base::Time;
+using disk_cache::SimpleIndexFile;
+using disk_cache::SimpleIndex;
+
+namespace disk_cache {
+
+TEST(IndexMetadataTest, Basics) {
+ SimpleIndexFile::IndexMetadata index_metadata;
+
+ EXPECT_EQ(disk_cache::kSimpleIndexMagicNumber, index_metadata.magic_number_);
+ EXPECT_EQ(disk_cache::kSimpleVersion, index_metadata.version_);
+ EXPECT_EQ(0U, index_metadata.GetNumberOfEntries());
+ EXPECT_EQ(0U, index_metadata.cache_size_);
+
+ EXPECT_TRUE(index_metadata.CheckIndexMetadata());
+}
+
+TEST(IndexMetadataTest, Serialize) {
+ SimpleIndexFile::IndexMetadata index_metadata(123, 456);
+ Pickle pickle;
+ index_metadata.Serialize(&pickle);
+ PickleIterator it(pickle);
+ SimpleIndexFile::IndexMetadata new_index_metadata;
+ new_index_metadata.Deserialize(&it);
+
+ EXPECT_EQ(new_index_metadata.magic_number_, index_metadata.magic_number_);
+ EXPECT_EQ(new_index_metadata.version_, index_metadata.version_);
+ EXPECT_EQ(new_index_metadata.GetNumberOfEntries(),
+ index_metadata.GetNumberOfEntries());
+ EXPECT_EQ(new_index_metadata.cache_size_, index_metadata.cache_size_);
+
+ EXPECT_TRUE(new_index_metadata.CheckIndexMetadata());
+}
+
+// This friend derived class is able to reexport its ancestors private methods
+// as public, for use in tests.
+class WrappedSimpleIndexFile : public SimpleIndexFile {
+ public:
+ using SimpleIndexFile::Deserialize;
+ using SimpleIndexFile::IsIndexFileStale;
+ using SimpleIndexFile::Serialize;
+
+ explicit WrappedSimpleIndexFile(const base::FilePath& index_file_directory)
+ : SimpleIndexFile(base::MessageLoopProxy::current().get(),
+ base::MessageLoopProxy::current().get(),
+ index_file_directory) {}
+ virtual ~WrappedSimpleIndexFile() {
+ }
+
+ const base::FilePath& GetIndexFilePath() const {
+ return index_file_;
+ }
+};
+
+class SimpleIndexFileTest : public testing::Test {
+ public:
+ bool CompareTwoEntryMetadata(const EntryMetadata& a, const EntryMetadata& b) {
+ return a.last_used_time_ == b.last_used_time_ &&
+ a.entry_size_ == b.entry_size_;
+ }
+
+ protected:
+ SimpleIndexFileTest() : callback_called_(false) {}
+
+ base::Closure GetCallback() {
+ return base::Bind(&SimpleIndexFileTest::LoadIndexEntriesCallback,
+ base::Unretained(this));
+ }
+
+ bool callback_called() { return callback_called_; }
+
+ private:
+ void LoadIndexEntriesCallback() {
+ EXPECT_FALSE(callback_called_);
+ callback_called_ = true;
+ }
+
+ bool callback_called_;
+};
+
+TEST_F(SimpleIndexFileTest, Serialize) {
+ SimpleIndex::EntrySet entries;
+ static const uint64 kHashes[] = { 11, 22, 33 };
+ static const size_t kNumHashes = arraysize(kHashes);
+ EntryMetadata metadata_entries[kNumHashes];
+
+ SimpleIndexFile::IndexMetadata index_metadata(static_cast<uint64>(kNumHashes),
+ 456);
+ for (size_t i = 0; i < kNumHashes; ++i) {
+ uint64 hash = kHashes[i];
+ metadata_entries[i] =
+ EntryMetadata(Time::FromInternalValue(hash), hash);
+ SimpleIndex::InsertInEntrySet(hash, metadata_entries[i], &entries);
+ }
+
+ scoped_ptr<Pickle> pickle = WrappedSimpleIndexFile::Serialize(
+ index_metadata, entries);
+ EXPECT_TRUE(pickle.get() != NULL);
+
+ SimpleIndexLoadResult deserialize_result;
+ WrappedSimpleIndexFile::Deserialize(static_cast<const char*>(pickle->data()),
+ pickle->size(),
+ &deserialize_result);
+ EXPECT_TRUE(deserialize_result.did_load);
+ const SimpleIndex::EntrySet& new_entries = deserialize_result.entries;
+ EXPECT_EQ(entries.size(), new_entries.size());
+
+ for (size_t i = 0; i < kNumHashes; ++i) {
+ SimpleIndex::EntrySet::const_iterator it = new_entries.find(kHashes[i]);
+ EXPECT_TRUE(new_entries.end() != it);
+ EXPECT_TRUE(CompareTwoEntryMetadata(it->second, metadata_entries[i]));
+ }
+}
+
+TEST_F(SimpleIndexFileTest, IsIndexFileStale) {
+ base::ScopedTempDir cache_dir;
+ ASSERT_TRUE(cache_dir.CreateUniqueTempDir());
+ base::Time cache_mtime;
+ const base::FilePath cache_path = cache_dir.path();
+
+ ASSERT_TRUE(simple_util::GetMTime(cache_path, &cache_mtime));
+ WrappedSimpleIndexFile simple_index_file(cache_path);
+ const base::FilePath& index_path = simple_index_file.GetIndexFilePath();
+ EXPECT_TRUE(WrappedSimpleIndexFile::IsIndexFileStale(cache_mtime,
+ index_path));
+ const std::string kDummyData = "nothing to be seen here";
+ EXPECT_EQ(static_cast<int>(kDummyData.size()),
+ file_util::WriteFile(index_path,
+ kDummyData.data(),
+ kDummyData.size()));
+ ASSERT_TRUE(simple_util::GetMTime(cache_path, &cache_mtime));
+ EXPECT_FALSE(WrappedSimpleIndexFile::IsIndexFileStale(cache_mtime,
+ index_path));
+
+ const base::Time past_time = base::Time::Now() -
+ base::TimeDelta::FromSeconds(10);
+ EXPECT_TRUE(file_util::TouchFile(index_path, past_time, past_time));
+ EXPECT_TRUE(file_util::TouchFile(cache_path, past_time, past_time));
+ ASSERT_TRUE(simple_util::GetMTime(cache_path, &cache_mtime));
+ EXPECT_FALSE(WrappedSimpleIndexFile::IsIndexFileStale(cache_mtime,
+ index_path));
+ const base::Time even_older =
+ past_time - base::TimeDelta::FromSeconds(10);
+ EXPECT_TRUE(file_util::TouchFile(index_path, even_older, even_older));
+ EXPECT_TRUE(WrappedSimpleIndexFile::IsIndexFileStale(cache_mtime,
+ index_path));
+
+}
+
+TEST_F(SimpleIndexFileTest, WriteThenLoadIndex) {
+ base::ScopedTempDir cache_dir;
+ ASSERT_TRUE(cache_dir.CreateUniqueTempDir());
+
+ SimpleIndex::EntrySet entries;
+ static const uint64 kHashes[] = { 11, 22, 33 };
+ static const size_t kNumHashes = arraysize(kHashes);
+ EntryMetadata metadata_entries[kNumHashes];
+ for (size_t i = 0; i < kNumHashes; ++i) {
+ uint64 hash = kHashes[i];
+ metadata_entries[i] =
+ EntryMetadata(Time::FromInternalValue(hash), hash);
+ SimpleIndex::InsertInEntrySet(hash, metadata_entries[i], &entries);
+ }
+
+ const uint64 kCacheSize = 456U;
+ {
+ WrappedSimpleIndexFile simple_index_file(cache_dir.path());
+ simple_index_file.WriteToDisk(entries, kCacheSize,
+ base::TimeTicks(), false);
+ base::RunLoop().RunUntilIdle();
+ EXPECT_TRUE(base::PathExists(simple_index_file.GetIndexFilePath()));
+ }
+
+ WrappedSimpleIndexFile simple_index_file(cache_dir.path());
+ base::Time fake_cache_mtime;
+ ASSERT_TRUE(simple_util::GetMTime(simple_index_file.GetIndexFilePath(),
+ &fake_cache_mtime));
+ SimpleIndexLoadResult load_index_result;
+ simple_index_file.LoadIndexEntries(fake_cache_mtime,
+ GetCallback(),
+ &load_index_result);
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_TRUE(base::PathExists(simple_index_file.GetIndexFilePath()));
+ ASSERT_TRUE(callback_called());
+ EXPECT_TRUE(load_index_result.did_load);
+ EXPECT_FALSE(load_index_result.flush_required);
+
+ EXPECT_EQ(kNumHashes, load_index_result.entries.size());
+ for (size_t i = 0; i < kNumHashes; ++i)
+ EXPECT_EQ(1U, load_index_result.entries.count(kHashes[i]));
+}
+
+TEST_F(SimpleIndexFileTest, LoadCorruptIndex) {
+ base::ScopedTempDir cache_dir;
+ ASSERT_TRUE(cache_dir.CreateUniqueTempDir());
+
+ WrappedSimpleIndexFile simple_index_file(cache_dir.path());
+ const base::FilePath& index_path = simple_index_file.GetIndexFilePath();
+ const std::string kDummyData = "nothing to be seen here";
+ EXPECT_EQ(static_cast<int>(kDummyData.size()),
+ file_util::WriteFile(index_path,
+ kDummyData.data(),
+ kDummyData.size()));
+ base::Time fake_cache_mtime;
+ ASSERT_TRUE(simple_util::GetMTime(simple_index_file.GetIndexFilePath(),
+ &fake_cache_mtime));
+ EXPECT_FALSE(WrappedSimpleIndexFile::IsIndexFileStale(fake_cache_mtime,
+ index_path));
+
+ SimpleIndexLoadResult load_index_result;
+ simple_index_file.LoadIndexEntries(fake_cache_mtime,
+ GetCallback(),
+ &load_index_result);
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_FALSE(base::PathExists(index_path));
+ ASSERT_TRUE(callback_called());
+ EXPECT_TRUE(load_index_result.did_load);
+ EXPECT_TRUE(load_index_result.flush_required);
+}
+
+} // namespace disk_cache