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

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: Added destructor. 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 {
48 protected:
49 virtual void SetUp() {
50 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
51 const FilePath path(temp_dir_.path().Append(FILE_PATH_LITERAL("cache")));
52 storage_.reset(new disk_cache::Storage(path, kStorageSize));
53 ASSERT_TRUE(storage_->Init());
54 }
55
56 virtual void TearDown() {
57 storage_.reset();
58 }
59
60 scoped_ptr<disk_cache::Storage> storage_;
61 ScopedTempDir temp_dir_;
62 };
63
64 namespace disk_cache { 39 namespace disk_cache {
rvargas (doing something else) 2012/10/24 19:13:59 nit: Can this be removed now?
agayev 2012/10/24 19:20:24 Done.
65 40
66 TEST_F(SegmentTest, CreateDestroy) { 41 TEST_F(FlashCacheTest, CreateDestroy) {
67 for (int i = 0; i < kSegmentCount; ++i) { 42 int32 index = 0;
68 scoped_ptr<disk_cache::Segment> segment( 43 scoped_ptr<disk_cache::Segment> segment(
69 new disk_cache::Segment(i, false, storage_.get())); 44 new disk_cache::Segment(index, false, storage_.get()));
45 EXPECT_TRUE(segment->Init());
46 EXPECT_TRUE(segment->Close());
70 47
71 EXPECT_TRUE(segment->Init()); 48 int32 invalid_index = num_segments_in_storage_;
72 // TODO(agayev): check offset validity via Init. 49 segment.reset(new disk_cache::Segment(invalid_index, false, storage_.get()));
73 EXPECT_EQ(segment->offset_, disk_cache::kFlashSegmentSize * i); 50 EXPECT_FALSE(segment->Init());
74 EXPECT_EQ(segment->write_offset_, segment->offset_); 51
75 EXPECT_EQ(segment->summary_offset_, disk_cache::kFlashSegmentSize * (i+1) - 52 index = num_segments_in_storage_ - 1;
rvargas (doing something else) 2012/10/24 19:13:59 nit: Add a test for a negative number?
agayev 2012/10/24 19:20:24 Done.
76 disk_cache::kFlashSummarySize); 53 segment.reset(new disk_cache::Segment(index, false, storage_.get()));
77 EXPECT_TRUE(segment->Close()); 54 EXPECT_TRUE(segment->Init());
78 } 55 EXPECT_TRUE(segment->Close());
79 } 56 }
80 57
81 TEST_F(SegmentTest, WriteDataReadData) { 58 TEST_F(FlashCacheTest, WriteDataReadData) {
82 for (int i = 0; i < kSegmentCount; ++i) { 59 int32 index = rand() % num_segments_in_storage_;
83 scoped_ptr<disk_cache::Segment> segment( 60 scoped_ptr<disk_cache::Segment> segment(
84 new disk_cache::Segment(i, false, storage_.get())); 61 new disk_cache::Segment(index, false, storage_.get()));
85 62
86 EXPECT_TRUE(segment->Init()); 63 EXPECT_TRUE(segment->Init());
87 SmallEntry entry1; 64 SmallEntry entry1;
88 EXPECT_TRUE(segment->CanHold(entry1.size)); 65 EXPECT_TRUE(segment->CanHold(entry1.size));
89 int32 offset; 66 int32 offset;
90 EXPECT_TRUE(segment->WriteData(entry1.data, entry1.size, &offset)); 67 EXPECT_TRUE(segment->WriteData(entry1.data, entry1.size, &offset));
91 EXPECT_TRUE(segment->Close()); 68 EXPECT_TRUE(segment->Close());
92 69
93 segment.reset(new disk_cache::Segment(i, true, storage_.get())); 70 segment.reset(new disk_cache::Segment(index, true, storage_.get()));
94 EXPECT_TRUE(segment->Init()); 71 EXPECT_TRUE(segment->Init());
95 SmallEntry entry2; 72 SmallEntry entry2;
96 EXPECT_TRUE(segment->ReadData(entry2.data, entry2.size, offset)); 73 EXPECT_TRUE(segment->ReadData(entry2.data, entry2.size, offset));
97 EXPECT_EQ(entry1, entry2); 74 EXPECT_EQ(entry1, entry2);
98 EXPECT_TRUE(segment->Close()); 75 EXPECT_TRUE(segment->Close());
99 }
100 } 76 }
101 77
102 TEST_F(SegmentTest, WriteHeaderReadData) { 78 TEST_F(FlashCacheTest, WriteHeaderReadData) {
103 for (int i = 0; i < kSegmentCount; ++i) { 79 int32 index = rand() % num_segments_in_storage_;
104 scoped_ptr<disk_cache::Segment> segment( 80 scoped_ptr<disk_cache::Segment> segment(
105 new disk_cache::Segment(i, false, storage_.get())); 81 new disk_cache::Segment(index, false, storage_.get()));
106 82
107 EXPECT_TRUE(segment->Init()); 83 EXPECT_TRUE(segment->Init());
108 SmallEntry entry1; 84 SmallEntry entry1;
109 EXPECT_TRUE(segment->CanHold(entry1.size)); 85 EXPECT_TRUE(segment->CanHold(entry1.size));
110 int32 offset; 86 int32 offset;
111 EXPECT_TRUE(segment->WriteHeader(entry1.data, entry1.size, &offset)); 87 EXPECT_TRUE(segment->WriteHeader(entry1.data, entry1.size, &offset));
112 EXPECT_EQ(1u, segment->header_offsets().size()); 88 EXPECT_EQ(1u, segment->header_offsets().size());
113 EXPECT_EQ(offset, segment->header_offsets().front()); 89 EXPECT_EQ(offset, segment->header_offsets().front());
114 EXPECT_TRUE(segment->Close()); 90 EXPECT_TRUE(segment->Close());
115 91
116 segment.reset(new disk_cache::Segment(i, true, storage_.get())); 92 segment.reset(new disk_cache::Segment(index, true, storage_.get()));
117 EXPECT_TRUE(segment->Init()); 93 EXPECT_TRUE(segment->Init());
118 SmallEntry entry2; 94 SmallEntry entry2;
119 EXPECT_EQ(1u, segment->header_offsets().size()); 95 EXPECT_EQ(1u, segment->header_offsets().size());
120 offset = segment->header_offsets().front(); 96 offset = segment->header_offsets().front();
121 EXPECT_TRUE(segment->ReadData(entry2.data, entry2.size, offset)); 97 EXPECT_TRUE(segment->ReadData(entry2.data, entry2.size, offset));
122 EXPECT_EQ(entry1, entry2); 98 EXPECT_EQ(entry1, entry2);
123 EXPECT_TRUE(segment->Close()); 99 EXPECT_TRUE(segment->Close());
124 }
125 } 100 }
126 101
127 TEST_F(SegmentTest, FillWithSmallEntries) { 102 TEST_F(FlashCacheTest, FillWithSmallEntries) {
128 for (int i = 0; i < kSegmentCount; ++i) { 103 int32 index = rand() % num_segments_in_storage_;
129 scoped_ptr<disk_cache::Segment> segment( 104 scoped_ptr<disk_cache::Segment> segment(
130 new disk_cache::Segment(i, false, storage_.get())); 105 new disk_cache::Segment(index, false, storage_.get()));
131 106
132 EXPECT_TRUE(segment->Init()); 107 EXPECT_TRUE(segment->Init());
133 SmallEntry entry; 108 SmallEntry entry;
134 int32 num_bytes_written = 0; 109 int32 num_bytes_written = 0;
135 while (segment->CanHold(entry.size)) { 110 while (segment->CanHold(entry.size)) {
136 EXPECT_TRUE(segment->WriteHeader(entry.data, entry.size, NULL)); 111 EXPECT_TRUE(segment->WriteHeader(entry.data, entry.size, NULL));
137 num_bytes_written += entry.size; 112 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 } 113 }
114 int32 space_left = kSegmentFreeSpace - num_bytes_written;
115 EXPECT_GE(space_left, entry.size);
116 EXPECT_EQ(segment->header_offsets().size(),
117 disk_cache::kFlashMaxEntryCount);
118 EXPECT_TRUE(segment->Close());
145 } 119 }
146 120
147 TEST_F(SegmentTest, FillWithLargeEntries) { 121 TEST_F(FlashCacheTest, FillWithLargeEntries) {
148 for (int i = 0; i < kSegmentCount; ++i) { 122 int32 index = rand() % num_segments_in_storage_;
149 scoped_ptr<disk_cache::Segment> segment( 123 scoped_ptr<disk_cache::Segment> segment(
150 new disk_cache::Segment(i, false, storage_.get())); 124 new disk_cache::Segment(index, false, storage_.get()));
151 125
152 EXPECT_TRUE(segment->Init()); 126 EXPECT_TRUE(segment->Init());
153 LargeEntry entry; 127 LargeEntry entry;
154 int32 num_bytes_written = 0; 128 int32 num_bytes_written = 0;
155 while (segment->CanHold(entry.size)) { 129 while (segment->CanHold(entry.size)) {
156 EXPECT_TRUE(segment->WriteHeader(entry.data, entry.size, NULL)); 130 EXPECT_TRUE(segment->WriteHeader(entry.data, entry.size, NULL));
157 num_bytes_written += entry.size; 131 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 } 132 }
133 int32 space_left = kSegmentFreeSpace - num_bytes_written;
134 EXPECT_LT(space_left, entry.size);
135 EXPECT_LT(segment->header_offsets().size(),
136 disk_cache::kFlashMaxEntryCount);
137 EXPECT_TRUE(segment->Close());
165 } 138 }
166 139
167 } // namespace disk_cache 140 } // 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