Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(332)

Side by Side Diff: net/disk_cache/flash/segment_unittest.cc

Issue 11269008: Cache backend for devices with flash storage (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: test Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/disk_cache/flash/segment.cc ('k') | net/disk_cache/flash/storage_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <map>
6
7 #include "base/logging.h"
8 #include "base/scoped_temp_dir.h"
9 #include "base/stl_util.h"
10 #include "base/memory/scoped_ptr.h" 5 #include "base/memory/scoped_ptr.h"
11 #include "net/base/net_errors.h"
12 #include "net/disk_cache/disk_cache_test_util.h" 6 #include "net/disk_cache/disk_cache_test_util.h"
13 #include "net/disk_cache/flash/segment.h" 7 #include "net/disk_cache/flash/segment.h"
14 #include "net/disk_cache/flash/storage.h" 8 #include "net/disk_cache/flash/storage.h"
9 #include "net/disk_cache/flash/flash_cache_test_base.h"
15 #include "net/disk_cache/flash/format.h" 10 #include "net/disk_cache/flash/format.h"
16 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
17 12
18 namespace { 13 namespace {
19 14
20 const int kSegmentCount = 3;
21 const int kEntryCount = 10;
22 const int32 kStorageSize = disk_cache::kFlashSegmentSize * kSegmentCount;
23 const int32 kSegmentFreeSpace = disk_cache::kFlashSegmentSize -
24 disk_cache::kFlashSummarySize;
25
26 template<int SIZE> 15 template<int SIZE>
27 struct Entry { 16 struct Entry {
28 enum { size = SIZE }; 17 enum { size = SIZE };
29 18
30 Entry() { CacheTestFillBuffer(data, size, false); } 19 Entry() { CacheTestFillBuffer(data, size, false); }
31 20
32 bool operator==(const Entry& rhs) const { 21 bool operator==(const Entry& rhs) const {
33 return std::equal(data, data + size, rhs.data); 22 return std::equal(data, data + size, rhs.data);
34 } 23 }
35 24
36 char data[size]; 25 char data[size];
37 }; 26 };
38 27
39 const int32 kSmallEntrySize = 100; 28 const int32 kSmallEntrySize = 100;
40 const int32 kLargeEntrySize = disk_cache::kFlashSegmentSize / 4; 29 const int32 kLargeEntrySize = disk_cache::kFlashSegmentSize / 4;
41 30
42 typedef Entry<kSmallEntrySize> SmallEntry; 31 typedef Entry<kSmallEntrySize> SmallEntry;
43 typedef Entry<kLargeEntrySize> LargeEntry; 32 typedef Entry<kLargeEntrySize> LargeEntry;
44 33
34 const int32 kSegmentFreeSpace = disk_cache::kFlashSegmentSize -
35 disk_cache::kFlashSummarySize;
36
45 } // namespace 37 } // namespace
46 38
47 class SegmentTest : public testing::Test { 39 TEST_F(FlashCacheTest, CreateDestroy) {
48 protected: 40 int32 index = 0;
49 virtual void SetUp() { 41 scoped_ptr<disk_cache::Segment> segment(
50 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 42 new disk_cache::Segment(index, false, storage_.get()));
51 const FilePath path(temp_dir_.path().Append(FILE_PATH_LITERAL("cache"))); 43 EXPECT_TRUE(segment->Init());
52 storage_.reset(new disk_cache::Storage(path, kStorageSize)); 44 EXPECT_TRUE(segment->Close());
53 ASSERT_TRUE(storage_->Init());
54 }
55 45
56 virtual void TearDown() { 46 index = num_segments_in_storage_ - 1;
57 storage_.reset(); 47 segment.reset(new disk_cache::Segment(index, false, storage_.get()));
58 } 48 EXPECT_TRUE(segment->Init());
49 EXPECT_TRUE(segment->Close());
59 50
60 scoped_ptr<disk_cache::Storage> storage_; 51 int32 invalid_index = num_segments_in_storage_;
61 ScopedTempDir temp_dir_; 52 segment.reset(new disk_cache::Segment(invalid_index, false, storage_.get()));
62 }; 53 EXPECT_FALSE(segment->Init());
63 54
64 namespace disk_cache { 55 invalid_index = -1;
65 56 segment.reset(new disk_cache::Segment(invalid_index, false, storage_.get()));
66 TEST_F(SegmentTest, CreateDestroy) { 57 EXPECT_FALSE(segment->Init());
67 for (int i = 0; i < kSegmentCount; ++i) {
68 scoped_ptr<disk_cache::Segment> segment(
69 new disk_cache::Segment(i, false, storage_.get()));
70
71 EXPECT_TRUE(segment->Init());
72 // TODO(agayev): check offset validity via Init.
73 EXPECT_EQ(segment->offset_, disk_cache::kFlashSegmentSize * i);
74 EXPECT_EQ(segment->write_offset_, segment->offset_);
75 EXPECT_EQ(segment->summary_offset_, disk_cache::kFlashSegmentSize * (i+1) -
76 disk_cache::kFlashSummarySize);
77 EXPECT_TRUE(segment->Close());
78 }
79 } 58 }
80 59
81 TEST_F(SegmentTest, WriteDataReadData) { 60 TEST_F(FlashCacheTest, WriteDataReadData) {
82 for (int i = 0; i < kSegmentCount; ++i) { 61 int32 index = rand() % num_segments_in_storage_;
83 scoped_ptr<disk_cache::Segment> segment( 62 scoped_ptr<disk_cache::Segment> segment(
84 new disk_cache::Segment(i, false, storage_.get())); 63 new disk_cache::Segment(index, false, storage_.get()));
85 64
86 EXPECT_TRUE(segment->Init()); 65 EXPECT_TRUE(segment->Init());
87 SmallEntry entry1; 66 SmallEntry entry1;
88 EXPECT_TRUE(segment->CanHold(entry1.size)); 67 EXPECT_TRUE(segment->CanHold(entry1.size));
89 int32 offset; 68 int32 offset;
90 EXPECT_TRUE(segment->WriteData(entry1.data, entry1.size, &offset)); 69 EXPECT_TRUE(segment->WriteData(entry1.data, entry1.size, &offset));
91 EXPECT_TRUE(segment->Close()); 70 EXPECT_TRUE(segment->Close());
92 71
93 segment.reset(new disk_cache::Segment(i, true, storage_.get())); 72 segment.reset(new disk_cache::Segment(index, true, storage_.get()));
94 EXPECT_TRUE(segment->Init()); 73 EXPECT_TRUE(segment->Init());
95 SmallEntry entry2; 74 SmallEntry entry2;
96 EXPECT_TRUE(segment->ReadData(entry2.data, entry2.size, offset)); 75 EXPECT_TRUE(segment->ReadData(entry2.data, entry2.size, offset));
97 EXPECT_EQ(entry1, entry2); 76 EXPECT_EQ(entry1, entry2);
98 EXPECT_TRUE(segment->Close()); 77 EXPECT_TRUE(segment->Close());
99 }
100 } 78 }
101 79
102 TEST_F(SegmentTest, WriteHeaderReadData) { 80 TEST_F(FlashCacheTest, WriteHeaderReadData) {
103 for (int i = 0; i < kSegmentCount; ++i) { 81 int32 index = rand() % num_segments_in_storage_;
104 scoped_ptr<disk_cache::Segment> segment( 82 scoped_ptr<disk_cache::Segment> segment(
105 new disk_cache::Segment(i, false, storage_.get())); 83 new disk_cache::Segment(index, false, storage_.get()));
106 84
107 EXPECT_TRUE(segment->Init()); 85 EXPECT_TRUE(segment->Init());
108 SmallEntry entry1; 86 SmallEntry entry1;
109 EXPECT_TRUE(segment->CanHold(entry1.size)); 87 EXPECT_TRUE(segment->CanHold(entry1.size));
110 int32 offset; 88 int32 offset;
111 EXPECT_TRUE(segment->WriteHeader(entry1.data, entry1.size, &offset)); 89 EXPECT_TRUE(segment->WriteHeader(entry1.data, entry1.size, &offset));
112 EXPECT_EQ(1u, segment->header_offsets().size()); 90 EXPECT_EQ(1u, segment->header_offsets().size());
113 EXPECT_EQ(offset, segment->header_offsets().front()); 91 EXPECT_EQ(offset, segment->header_offsets().front());
114 EXPECT_TRUE(segment->Close()); 92 EXPECT_TRUE(segment->Close());
115 93
116 segment.reset(new disk_cache::Segment(i, true, storage_.get())); 94 segment.reset(new disk_cache::Segment(index, true, storage_.get()));
117 EXPECT_TRUE(segment->Init()); 95 EXPECT_TRUE(segment->Init());
118 SmallEntry entry2; 96 SmallEntry entry2;
119 EXPECT_EQ(1u, segment->header_offsets().size()); 97 EXPECT_EQ(1u, segment->header_offsets().size());
120 offset = segment->header_offsets().front(); 98 offset = segment->header_offsets().front();
121 EXPECT_TRUE(segment->ReadData(entry2.data, entry2.size, offset)); 99 EXPECT_TRUE(segment->ReadData(entry2.data, entry2.size, offset));
122 EXPECT_EQ(entry1, entry2); 100 EXPECT_EQ(entry1, entry2);
123 EXPECT_TRUE(segment->Close()); 101 EXPECT_TRUE(segment->Close());
124 }
125 } 102 }
126 103
127 TEST_F(SegmentTest, FillWithSmallEntries) { 104 TEST_F(FlashCacheTest, FillWithSmallEntries) {
128 for (int i = 0; i < kSegmentCount; ++i) { 105 int32 index = rand() % num_segments_in_storage_;
129 scoped_ptr<disk_cache::Segment> segment( 106 scoped_ptr<disk_cache::Segment> segment(
130 new disk_cache::Segment(i, false, storage_.get())); 107 new disk_cache::Segment(index, false, storage_.get()));
131 108
132 EXPECT_TRUE(segment->Init()); 109 EXPECT_TRUE(segment->Init());
133 SmallEntry entry; 110 SmallEntry entry;
134 int32 num_bytes_written = 0; 111 int32 num_bytes_written = 0;
135 while (segment->CanHold(entry.size)) { 112 while (segment->CanHold(entry.size)) {
136 EXPECT_TRUE(segment->WriteHeader(entry.data, entry.size, NULL)); 113 EXPECT_TRUE(segment->WriteHeader(entry.data, entry.size, NULL));
137 num_bytes_written += entry.size; 114 num_bytes_written += entry.size;
138 }
139 int32 space_left = kSegmentFreeSpace - num_bytes_written;
140 EXPECT_GE(space_left, entry.size);
141 EXPECT_EQ(segment->header_offsets().size(),
142 disk_cache::kFlashMaxEntryCount);
143 EXPECT_TRUE(segment->Close());
144 } 115 }
116 int32 space_left = kSegmentFreeSpace - num_bytes_written;
117 EXPECT_GE(space_left, entry.size);
118 EXPECT_EQ(segment->header_offsets().size(),
119 disk_cache::kFlashMaxEntryCount);
120 EXPECT_TRUE(segment->Close());
145 } 121 }
146 122
147 TEST_F(SegmentTest, FillWithLargeEntries) { 123 TEST_F(FlashCacheTest, FillWithLargeEntries) {
148 for (int i = 0; i < kSegmentCount; ++i) { 124 int32 index = rand() % num_segments_in_storage_;
149 scoped_ptr<disk_cache::Segment> segment( 125 scoped_ptr<disk_cache::Segment> segment(
150 new disk_cache::Segment(i, false, storage_.get())); 126 new disk_cache::Segment(index, false, storage_.get()));
151 127
152 EXPECT_TRUE(segment->Init()); 128 EXPECT_TRUE(segment->Init());
153 LargeEntry entry; 129 scoped_ptr<LargeEntry> entry(new LargeEntry);
154 int32 num_bytes_written = 0; 130 int32 num_bytes_written = 0;
155 while (segment->CanHold(entry.size)) { 131 while (segment->CanHold(entry->size)) {
156 EXPECT_TRUE(segment->WriteHeader(entry.data, entry.size, NULL)); 132 EXPECT_TRUE(segment->WriteHeader(entry->data, entry->size, NULL));
157 num_bytes_written += entry.size; 133 num_bytes_written += entry->size;
158 }
159 int32 space_left = kSegmentFreeSpace - num_bytes_written;
160 EXPECT_LT(space_left, entry.size);
161 EXPECT_LT(segment->header_offsets().size(),
162 disk_cache::kFlashMaxEntryCount);
163 EXPECT_TRUE(segment->Close());
164 } 134 }
135 int32 space_left = kSegmentFreeSpace - num_bytes_written;
136 EXPECT_LT(space_left, entry->size);
137 EXPECT_LT(segment->header_offsets().size(),
138 disk_cache::kFlashMaxEntryCount);
139 EXPECT_TRUE(segment->Close());
165 } 140 }
166
167 } // namespace disk_cache
OLDNEW
« no previous file with comments | « net/disk_cache/flash/segment.cc ('k') | net/disk_cache/flash/storage_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698