summaryrefslogtreecommitdiffstats
path: root/net/disk_cache
diff options
context:
space:
mode:
authoragayev@chromium.org <agayev@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-25 14:07:52 +0000
committeragayev@chromium.org <agayev@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-25 14:07:52 +0000
commit1951d761ddc1174b601f3fa8965a43dc62dc07f4 (patch)
tree740b112de69cf6671b9b2cbe49218a3ddcb91d5b /net/disk_cache
parentb09c0a167416c2763461e5d6a8cb540700bf12fc (diff)
downloadchromium_src-1951d761ddc1174b601f3fa8965a43dc62dc07f4.zip
chromium_src-1951d761ddc1174b601f3fa8965a43dc62dc07f4.tar.gz
chromium_src-1951d761ddc1174b601f3fa8965a43dc62dc07f4.tar.bz2
Cache backend for devices with flash storage
Fixed tests. BUG=157187 TEST=net_unittests --gtest_filter="FlashCacheTest.*" --gtest_repeat=10 --shuffle Review URL: https://chromiumcodereview.appspot.com/11269008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@164064 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/disk_cache')
-rw-r--r--net/disk_cache/flash/flash_cache_test_base.cc39
-rw-r--r--net/disk_cache/flash/flash_cache_test_base.h36
-rw-r--r--net/disk_cache/flash/segment.cc6
-rw-r--r--net/disk_cache/flash/segment.h2
-rw-r--r--net/disk_cache/flash/segment_unittest.cc217
-rw-r--r--net/disk_cache/flash/storage_unittest.cc14
6 files changed, 178 insertions, 136 deletions
diff --git a/net/disk_cache/flash/flash_cache_test_base.cc b/net/disk_cache/flash/flash_cache_test_base.cc
new file mode 100644
index 0000000..bbe6c6f
--- /dev/null
+++ b/net/disk_cache/flash/flash_cache_test_base.cc
@@ -0,0 +1,39 @@
+// Copyright (c) 2012 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 "net/disk_cache/flash/flash_cache_test_base.h"
+
+#include "base/file_path.h"
+#include "base/scoped_temp_dir.h"
+#include "base/time.h"
+#include "net/disk_cache/flash/format.h"
+#include "net/disk_cache/flash/storage.h"
+
+namespace {
+
+const int32 kSegmentCount = 10;
+const FilePath::StringType kCachePath = FILE_PATH_LITERAL("cache");
+
+} // namespace
+
+FlashCacheTest::FlashCacheTest() : num_segments_in_storage_(kSegmentCount) {
+ int seed = static_cast<int>(base::Time::Now().ToInternalValue());
+ srand(seed);
+}
+
+FlashCacheTest::~FlashCacheTest() {
+}
+
+void FlashCacheTest::SetUp() {
+ ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+ const FilePath path(temp_dir_.path().Append(kCachePath));
+
+ int32 storage_size = num_segments_in_storage_ * disk_cache::kFlashSegmentSize;
+ storage_.reset(new disk_cache::Storage(path, storage_size));
+ ASSERT_TRUE(storage_->Init());
+}
+
+void FlashCacheTest::TearDown() {
+ storage_.reset();
+}
diff --git a/net/disk_cache/flash/flash_cache_test_base.h b/net/disk_cache/flash/flash_cache_test_base.h
new file mode 100644
index 0000000..1c8bae1
--- /dev/null
+++ b/net/disk_cache/flash/flash_cache_test_base.h
@@ -0,0 +1,36 @@
+// Copyright (c) 2012 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.
+
+#ifndef NET_DISK_CACHE_DISK_CACHE_FLASH_TEST_BASE_H_
+#define NET_DISK_CACHE_DISK_CACHE_FLASH_TEST_BASE_H_
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "base/scoped_temp_dir.h"
+#include "base/memory/scoped_ptr.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace disk_cache {
+
+class Storage;
+
+} // namespace disk_cache
+
+class FlashCacheTest : public testing::Test {
+ protected:
+ FlashCacheTest();
+ virtual ~FlashCacheTest();
+
+ virtual void SetUp() OVERRIDE;
+ virtual void TearDown() OVERRIDE;
+
+ scoped_ptr<disk_cache::Storage> storage_;
+ ScopedTempDir temp_dir_;
+ int32 num_segments_in_storage_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(FlashCacheTest);
+};
+
+#endif // NET_DISK_CACHE_DISK_CACHE_FLASH_TEST_BASE_H_
diff --git a/net/disk_cache/flash/segment.cc b/net/disk_cache/flash/segment.cc
index a63a5a3..a0d277f 100644
--- a/net/disk_cache/flash/segment.cc
+++ b/net/disk_cache/flash/segment.cc
@@ -18,17 +18,19 @@ Segment::Segment(int32 index, bool read_only, Storage* storage)
write_offset_(offset_) {
DCHECK(storage);
DCHECK(storage->size() % kFlashSegmentSize == 0);
- DCHECK(offset_ >= 0 && offset_ + kFlashSegmentSize <= storage->size());
}
Segment::~Segment() {
- DCHECK(read_only_);
+ DCHECK(!init_ || read_only_);
}
bool Segment::Init() {
if (init_)
return false;
+ if (offset_ < 0 || offset_ + kFlashSegmentSize > storage_->size())
+ return false;
+
if (!read_only_) {
init_ = true;
return true;
diff --git a/net/disk_cache/flash/segment.h b/net/disk_cache/flash/segment.h
index 6dcdf46..4a10c65 100644
--- a/net/disk_cache/flash/segment.h
+++ b/net/disk_cache/flash/segment.h
@@ -97,8 +97,6 @@ class NET_EXPORT_PRIVATE Segment {
bool CanHold(int32 size) const;
private:
- FRIEND_TEST_ALL_PREFIXES(SegmentTest, CreateDestroy);
-
bool read_only_; // Indicates whether the segment can be written to.
bool init_; // Indicates whether segment was initialized.
Storage* storage_; // Storage on which the segment resides.
diff --git a/net/disk_cache/flash/segment_unittest.cc b/net/disk_cache/flash/segment_unittest.cc
index 5bf3b6b..bbbcc80 100644
--- a/net/disk_cache/flash/segment_unittest.cc
+++ b/net/disk_cache/flash/segment_unittest.cc
@@ -2,27 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include <map>
-
-#include "base/logging.h"
-#include "base/scoped_temp_dir.h"
-#include "base/stl_util.h"
#include "base/memory/scoped_ptr.h"
-#include "net/base/net_errors.h"
#include "net/disk_cache/disk_cache_test_util.h"
#include "net/disk_cache/flash/segment.h"
#include "net/disk_cache/flash/storage.h"
+#include "net/disk_cache/flash/flash_cache_test_base.h"
#include "net/disk_cache/flash/format.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
-const int kSegmentCount = 3;
-const int kEntryCount = 10;
-const int32 kStorageSize = disk_cache::kFlashSegmentSize * kSegmentCount;
-const int32 kSegmentFreeSpace = disk_cache::kFlashSegmentSize -
- disk_cache::kFlashSummarySize;
-
template<int SIZE>
struct Entry {
enum { size = SIZE };
@@ -42,126 +31,110 @@ const int32 kLargeEntrySize = disk_cache::kFlashSegmentSize / 4;
typedef Entry<kSmallEntrySize> SmallEntry;
typedef Entry<kLargeEntrySize> LargeEntry;
-} // namespace
-
-class SegmentTest : public testing::Test {
- protected:
- virtual void SetUp() {
- ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
- const FilePath path(temp_dir_.path().Append(FILE_PATH_LITERAL("cache")));
- storage_.reset(new disk_cache::Storage(path, kStorageSize));
- ASSERT_TRUE(storage_->Init());
- }
-
- virtual void TearDown() {
- storage_.reset();
- }
-
- scoped_ptr<disk_cache::Storage> storage_;
- ScopedTempDir temp_dir_;
-};
-
-namespace disk_cache {
+const int32 kSegmentFreeSpace = disk_cache::kFlashSegmentSize -
+ disk_cache::kFlashSummarySize;
-TEST_F(SegmentTest, CreateDestroy) {
- for (int i = 0; i < kSegmentCount; ++i) {
- scoped_ptr<disk_cache::Segment> segment(
- new disk_cache::Segment(i, false, storage_.get()));
+} // namespace
- EXPECT_TRUE(segment->Init());
- // TODO(agayev): check offset validity via Init.
- EXPECT_EQ(segment->offset_, disk_cache::kFlashSegmentSize * i);
- EXPECT_EQ(segment->write_offset_, segment->offset_);
- EXPECT_EQ(segment->summary_offset_, disk_cache::kFlashSegmentSize * (i+1) -
- disk_cache::kFlashSummarySize);
- EXPECT_TRUE(segment->Close());
- }
+TEST_F(FlashCacheTest, CreateDestroy) {
+ int32 index = 0;
+ scoped_ptr<disk_cache::Segment> segment(
+ new disk_cache::Segment(index, false, storage_.get()));
+ EXPECT_TRUE(segment->Init());
+ EXPECT_TRUE(segment->Close());
+
+ index = num_segments_in_storage_ - 1;
+ segment.reset(new disk_cache::Segment(index, false, storage_.get()));
+ EXPECT_TRUE(segment->Init());
+ EXPECT_TRUE(segment->Close());
+
+ int32 invalid_index = num_segments_in_storage_;
+ segment.reset(new disk_cache::Segment(invalid_index, false, storage_.get()));
+ EXPECT_FALSE(segment->Init());
+
+ invalid_index = -1;
+ segment.reset(new disk_cache::Segment(invalid_index, false, storage_.get()));
+ EXPECT_FALSE(segment->Init());
}
-TEST_F(SegmentTest, WriteDataReadData) {
- for (int i = 0; i < kSegmentCount; ++i) {
- scoped_ptr<disk_cache::Segment> segment(
- new disk_cache::Segment(i, false, storage_.get()));
-
- EXPECT_TRUE(segment->Init());
- SmallEntry entry1;
- EXPECT_TRUE(segment->CanHold(entry1.size));
- int32 offset;
- EXPECT_TRUE(segment->WriteData(entry1.data, entry1.size, &offset));
- EXPECT_TRUE(segment->Close());
-
- segment.reset(new disk_cache::Segment(i, true, storage_.get()));
- EXPECT_TRUE(segment->Init());
- SmallEntry entry2;
- EXPECT_TRUE(segment->ReadData(entry2.data, entry2.size, offset));
- EXPECT_EQ(entry1, entry2);
- EXPECT_TRUE(segment->Close());
- }
+TEST_F(FlashCacheTest, WriteDataReadData) {
+ int32 index = rand() % num_segments_in_storage_;
+ scoped_ptr<disk_cache::Segment> segment(
+ new disk_cache::Segment(index, false, storage_.get()));
+
+ EXPECT_TRUE(segment->Init());
+ SmallEntry entry1;
+ EXPECT_TRUE(segment->CanHold(entry1.size));
+ int32 offset;
+ EXPECT_TRUE(segment->WriteData(entry1.data, entry1.size, &offset));
+ EXPECT_TRUE(segment->Close());
+
+ segment.reset(new disk_cache::Segment(index, true, storage_.get()));
+ EXPECT_TRUE(segment->Init());
+ SmallEntry entry2;
+ EXPECT_TRUE(segment->ReadData(entry2.data, entry2.size, offset));
+ EXPECT_EQ(entry1, entry2);
+ EXPECT_TRUE(segment->Close());
}
-TEST_F(SegmentTest, WriteHeaderReadData) {
- for (int i = 0; i < kSegmentCount; ++i) {
- scoped_ptr<disk_cache::Segment> segment(
- new disk_cache::Segment(i, false, storage_.get()));
-
- EXPECT_TRUE(segment->Init());
- SmallEntry entry1;
- EXPECT_TRUE(segment->CanHold(entry1.size));
- int32 offset;
- EXPECT_TRUE(segment->WriteHeader(entry1.data, entry1.size, &offset));
- EXPECT_EQ(1u, segment->header_offsets().size());
- EXPECT_EQ(offset, segment->header_offsets().front());
- EXPECT_TRUE(segment->Close());
-
- segment.reset(new disk_cache::Segment(i, true, storage_.get()));
- EXPECT_TRUE(segment->Init());
- SmallEntry entry2;
- EXPECT_EQ(1u, segment->header_offsets().size());
- offset = segment->header_offsets().front();
- EXPECT_TRUE(segment->ReadData(entry2.data, entry2.size, offset));
- EXPECT_EQ(entry1, entry2);
- EXPECT_TRUE(segment->Close());
- }
+TEST_F(FlashCacheTest, WriteHeaderReadData) {
+ int32 index = rand() % num_segments_in_storage_;
+ scoped_ptr<disk_cache::Segment> segment(
+ new disk_cache::Segment(index, false, storage_.get()));
+
+ EXPECT_TRUE(segment->Init());
+ SmallEntry entry1;
+ EXPECT_TRUE(segment->CanHold(entry1.size));
+ int32 offset;
+ EXPECT_TRUE(segment->WriteHeader(entry1.data, entry1.size, &offset));
+ EXPECT_EQ(1u, segment->header_offsets().size());
+ EXPECT_EQ(offset, segment->header_offsets().front());
+ EXPECT_TRUE(segment->Close());
+
+ segment.reset(new disk_cache::Segment(index, true, storage_.get()));
+ EXPECT_TRUE(segment->Init());
+ SmallEntry entry2;
+ EXPECT_EQ(1u, segment->header_offsets().size());
+ offset = segment->header_offsets().front();
+ EXPECT_TRUE(segment->ReadData(entry2.data, entry2.size, offset));
+ EXPECT_EQ(entry1, entry2);
+ EXPECT_TRUE(segment->Close());
}
-TEST_F(SegmentTest, FillWithSmallEntries) {
- for (int i = 0; i < kSegmentCount; ++i) {
- scoped_ptr<disk_cache::Segment> segment(
- new disk_cache::Segment(i, false, storage_.get()));
-
- EXPECT_TRUE(segment->Init());
- SmallEntry entry;
- int32 num_bytes_written = 0;
- while (segment->CanHold(entry.size)) {
- EXPECT_TRUE(segment->WriteHeader(entry.data, entry.size, NULL));
- num_bytes_written += entry.size;
- }
- int32 space_left = kSegmentFreeSpace - num_bytes_written;
- EXPECT_GE(space_left, entry.size);
- EXPECT_EQ(segment->header_offsets().size(),
- disk_cache::kFlashMaxEntryCount);
- EXPECT_TRUE(segment->Close());
+TEST_F(FlashCacheTest, FillWithSmallEntries) {
+ int32 index = rand() % num_segments_in_storage_;
+ scoped_ptr<disk_cache::Segment> segment(
+ new disk_cache::Segment(index, false, storage_.get()));
+
+ EXPECT_TRUE(segment->Init());
+ SmallEntry entry;
+ int32 num_bytes_written = 0;
+ while (segment->CanHold(entry.size)) {
+ EXPECT_TRUE(segment->WriteHeader(entry.data, entry.size, NULL));
+ num_bytes_written += entry.size;
}
+ int32 space_left = kSegmentFreeSpace - num_bytes_written;
+ EXPECT_GE(space_left, entry.size);
+ EXPECT_EQ(segment->header_offsets().size(),
+ disk_cache::kFlashMaxEntryCount);
+ EXPECT_TRUE(segment->Close());
}
-TEST_F(SegmentTest, FillWithLargeEntries) {
- for (int i = 0; i < kSegmentCount; ++i) {
- scoped_ptr<disk_cache::Segment> segment(
- new disk_cache::Segment(i, false, storage_.get()));
-
- EXPECT_TRUE(segment->Init());
- LargeEntry entry;
- int32 num_bytes_written = 0;
- while (segment->CanHold(entry.size)) {
- EXPECT_TRUE(segment->WriteHeader(entry.data, entry.size, NULL));
- num_bytes_written += entry.size;
- }
- int32 space_left = kSegmentFreeSpace - num_bytes_written;
- EXPECT_LT(space_left, entry.size);
- EXPECT_LT(segment->header_offsets().size(),
- disk_cache::kFlashMaxEntryCount);
- EXPECT_TRUE(segment->Close());
+TEST_F(FlashCacheTest, FillWithLargeEntries) {
+ int32 index = rand() % num_segments_in_storage_;
+ scoped_ptr<disk_cache::Segment> segment(
+ new disk_cache::Segment(index, false, storage_.get()));
+
+ EXPECT_TRUE(segment->Init());
+ scoped_ptr<LargeEntry> entry(new LargeEntry);
+ int32 num_bytes_written = 0;
+ while (segment->CanHold(entry->size)) {
+ EXPECT_TRUE(segment->WriteHeader(entry->data, entry->size, NULL));
+ num_bytes_written += entry->size;
}
+ int32 space_left = kSegmentFreeSpace - num_bytes_written;
+ EXPECT_LT(space_left, entry->size);
+ EXPECT_LT(segment->header_offsets().size(),
+ disk_cache::kFlashMaxEntryCount);
+ EXPECT_TRUE(segment->Close());
}
-
-} // namespace disk_cache
diff --git a/net/disk_cache/flash/storage_unittest.cc b/net/disk_cache/flash/storage_unittest.cc
index 73a78ef..2bacb11 100644
--- a/net/disk_cache/flash/storage_unittest.cc
+++ b/net/disk_cache/flash/storage_unittest.cc
@@ -7,6 +7,7 @@
#include "net/base/io_buffer.h"
#include "net/disk_cache/disk_cache_test_util.h"
#include "net/disk_cache/flash/storage.h"
+#include "net/disk_cache/flash/flash_cache_test_base.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
@@ -17,14 +18,7 @@ const int32 kStorageSize = 16 * 1024 * 1024;
} // namespace
-TEST(FlashCacheTest, StorageReadWrite) {
- ScopedTempDir tempdir;
- ASSERT_TRUE(tempdir.CreateUniqueTempDir());
- const FilePath path(tempdir.path().Append(FILE_PATH_LITERAL("cache")));
-
- disk_cache::Storage storage(path, kStorageSize);
- EXPECT_TRUE(storage.Init());
-
+TEST_F(FlashCacheTest, StorageReadWrite) {
for (size_t i = 0; i < arraysize(kOffsets); ++i) {
int32 size = kSizes[i];
int32 offset = kOffsets[i];
@@ -34,10 +28,10 @@ TEST(FlashCacheTest, StorageReadWrite) {
CacheTestFillBuffer(write_buffer->data(), size, false);
- bool rv = storage.Write(write_buffer->data(), size, offset);
+ bool rv = storage_->Write(write_buffer->data(), size, offset);
EXPECT_TRUE(rv);
- rv = storage.Read(read_buffer->data(), size, offset);
+ rv = storage_->Read(read_buffer->data(), size, offset);
EXPECT_TRUE(rv);
EXPECT_EQ(0, memcmp(read_buffer->data(), write_buffer->data(), size));