OLD | NEW |
| (Empty) |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "net/disk_cache/blockfile/bitmap.h" | |
6 #include "testing/gtest/include/gtest/gtest.h" | |
7 | |
8 TEST(BitmapTest, OverAllocate) { | |
9 // Test that we don't over allocate on boundaries. | |
10 disk_cache::Bitmap map32(32, false); | |
11 EXPECT_EQ(1, map32.ArraySize()); | |
12 | |
13 disk_cache::Bitmap map64(64, false); | |
14 EXPECT_EQ(2, map64.ArraySize()); | |
15 } | |
16 | |
17 TEST(BitmapTest, DefaultConstructor) { | |
18 // Verify that the default constructor doesn't allocate a bitmap. | |
19 disk_cache::Bitmap map; | |
20 EXPECT_EQ(0, map.Size()); | |
21 EXPECT_EQ(0, map.ArraySize()); | |
22 EXPECT_TRUE(NULL == map.GetMap()); | |
23 } | |
24 | |
25 TEST(BitmapTest, Basics) { | |
26 disk_cache::Bitmap bitmap(80, true); | |
27 const uint32 kValue = 0x74f10060; | |
28 | |
29 // Test proper allocation size. | |
30 EXPECT_EQ(80, bitmap.Size()); | |
31 EXPECT_EQ(3, bitmap.ArraySize()); | |
32 | |
33 // Test Set/GetMapElement. | |
34 EXPECT_EQ(0U, bitmap.GetMapElement(1)); | |
35 bitmap.SetMapElement(1, kValue); | |
36 EXPECT_EQ(kValue, bitmap.GetMapElement(1)); | |
37 | |
38 // Test Set/Get. | |
39 EXPECT_TRUE(bitmap.Get(48)); | |
40 EXPECT_FALSE(bitmap.Get(49)); | |
41 EXPECT_FALSE(bitmap.Get(50)); | |
42 bitmap.Set(49, true); | |
43 EXPECT_TRUE(bitmap.Get(48)); | |
44 EXPECT_TRUE(bitmap.Get(49)); | |
45 EXPECT_FALSE(bitmap.Get(50)); | |
46 bitmap.Set(49, false); | |
47 EXPECT_TRUE(bitmap.Get(48)); | |
48 EXPECT_FALSE(bitmap.Get(49)); | |
49 EXPECT_FALSE(bitmap.Get(50)); | |
50 | |
51 for (int i = 0; i < 80; i++) | |
52 bitmap.Set(i, (i % 7) == 0); | |
53 for (int i = 0; i < 80; i++) | |
54 EXPECT_EQ(bitmap.Get(i), (i % 7) == 0); | |
55 } | |
56 | |
57 TEST(BitmapTest, Toggle) { | |
58 static const int kSize = 100; | |
59 disk_cache::Bitmap map(kSize, true); | |
60 for (int i = 0; i < 100; i += 3) | |
61 map.Toggle(i); | |
62 for (int i = 0; i < 100; i += 9) | |
63 map.Toggle(i); | |
64 for (int i = 0; i < 100; ++i) | |
65 EXPECT_EQ((i % 3 == 0) && (i % 9 != 0), map.Get(i)); | |
66 } | |
67 | |
68 TEST(BitmapTest, Resize) { | |
69 const int kSize1 = 50; | |
70 const int kSize2 = 100; | |
71 const int kSize3 = 30; | |
72 disk_cache::Bitmap map(kSize1, true); | |
73 map.Resize(kSize1, true); | |
74 EXPECT_EQ(kSize1, map.Size()); | |
75 EXPECT_FALSE(map.Get(0)); | |
76 EXPECT_FALSE(map.Get(kSize1 - 1)); | |
77 | |
78 map.Resize(kSize2, true); | |
79 EXPECT_FALSE(map.Get(kSize1 - 1)); | |
80 EXPECT_FALSE(map.Get(kSize1)); | |
81 EXPECT_FALSE(map.Get(kSize2 - 1)); | |
82 EXPECT_EQ(kSize2, map.Size()); | |
83 | |
84 map.Resize(kSize3, true); | |
85 EXPECT_FALSE(map.Get(kSize3 - 1)); | |
86 EXPECT_EQ(kSize3, map.Size()); | |
87 } | |
88 | |
89 TEST(BitmapTest, Map) { | |
90 // Tests Set/GetMap and the constructor that takes an array. | |
91 const int kMapSize = 80; | |
92 char local_map[kMapSize]; | |
93 for (int i = 0; i < kMapSize; i++) | |
94 local_map[i] = static_cast<char>(i); | |
95 | |
96 disk_cache::Bitmap bitmap(kMapSize * 8, false); | |
97 bitmap.SetMap(reinterpret_cast<uint32*>(local_map), kMapSize / 4); | |
98 for (int i = 0; i < kMapSize; i++) { | |
99 if (i % 2) | |
100 EXPECT_TRUE(bitmap.Get(i * 8)); | |
101 else | |
102 EXPECT_FALSE(bitmap.Get(i * 8)); | |
103 } | |
104 | |
105 EXPECT_EQ(0, memcmp(local_map, bitmap.GetMap(), kMapSize)); | |
106 | |
107 // Now let's create a bitmap that shares local_map as storage. | |
108 disk_cache::Bitmap bitmap2(reinterpret_cast<uint32*>(local_map), | |
109 kMapSize * 8, kMapSize / 4); | |
110 EXPECT_EQ(0, memcmp(local_map, bitmap2.GetMap(), kMapSize)); | |
111 | |
112 local_map[kMapSize / 2] = 'a'; | |
113 EXPECT_EQ(0, memcmp(local_map, bitmap2.GetMap(), kMapSize)); | |
114 EXPECT_NE(0, memcmp(local_map, bitmap.GetMap(), kMapSize)); | |
115 } | |
116 | |
117 TEST(BitmapTest, SetAll) { | |
118 // Tests SetAll and Clear. | |
119 const int kMapSize = 80; | |
120 char ones[kMapSize]; | |
121 char zeros[kMapSize]; | |
122 memset(ones, 0xff, kMapSize); | |
123 memset(zeros, 0, kMapSize); | |
124 | |
125 disk_cache::Bitmap map(kMapSize * 8, true); | |
126 EXPECT_EQ(0, memcmp(zeros, map.GetMap(), kMapSize)); | |
127 map.SetAll(true); | |
128 EXPECT_EQ(0, memcmp(ones, map.GetMap(), kMapSize)); | |
129 map.SetAll(false); | |
130 EXPECT_EQ(0, memcmp(zeros, map.GetMap(), kMapSize)); | |
131 map.SetAll(true); | |
132 map.Clear(); | |
133 EXPECT_EQ(0, memcmp(zeros, map.GetMap(), kMapSize)); | |
134 } | |
135 | |
136 TEST(BitmapTest, Range) { | |
137 // Tests SetRange() and TestRange(). | |
138 disk_cache::Bitmap map(100, true); | |
139 EXPECT_FALSE(map.TestRange(0, 100, true)); | |
140 map.Set(50, true); | |
141 EXPECT_TRUE(map.TestRange(0, 100, true)); | |
142 | |
143 map.SetAll(false); | |
144 EXPECT_FALSE(map.TestRange(0, 1, true)); | |
145 EXPECT_FALSE(map.TestRange(30, 31, true)); | |
146 EXPECT_FALSE(map.TestRange(98, 99, true)); | |
147 EXPECT_FALSE(map.TestRange(99, 100, true)); | |
148 EXPECT_FALSE(map.TestRange(0, 100, true)); | |
149 | |
150 EXPECT_TRUE(map.TestRange(0, 1, false)); | |
151 EXPECT_TRUE(map.TestRange(31, 32, false)); | |
152 EXPECT_TRUE(map.TestRange(32, 33, false)); | |
153 EXPECT_TRUE(map.TestRange(99, 100, false)); | |
154 EXPECT_TRUE(map.TestRange(0, 32, false)); | |
155 | |
156 map.SetRange(11, 21, true); | |
157 for (int i = 0; i < 100; i++) | |
158 EXPECT_EQ(map.Get(i), (i >= 11) && (i < 21)); | |
159 | |
160 EXPECT_TRUE(map.TestRange(0, 32, true)); | |
161 EXPECT_TRUE(map.TestRange(0, 100, true)); | |
162 EXPECT_TRUE(map.TestRange(11, 21, true)); | |
163 EXPECT_TRUE(map.TestRange(15, 16, true)); | |
164 EXPECT_TRUE(map.TestRange(5, 12, true)); | |
165 EXPECT_TRUE(map.TestRange(5, 11, false)); | |
166 EXPECT_TRUE(map.TestRange(20, 60, true)); | |
167 EXPECT_TRUE(map.TestRange(21, 60, false)); | |
168 | |
169 map.SetAll(true); | |
170 EXPECT_FALSE(map.TestRange(0, 100, false)); | |
171 | |
172 map.SetRange(70, 99, false); | |
173 EXPECT_TRUE(map.TestRange(69, 99, false)); | |
174 EXPECT_TRUE(map.TestRange(70, 100, false)); | |
175 EXPECT_FALSE(map.TestRange(70, 99, true)); | |
176 } | |
177 | |
178 TEST(BitmapTest, FindNextSetBitBeforeLimit) { | |
179 // Test FindNextSetBitBeforeLimit. Only check bits from 111 to 277 (limit | |
180 // bit == 278). Should find all multiples of 27 in that range. | |
181 disk_cache::Bitmap map(500, true); | |
182 for (int i = 0; i < 500; i++) | |
183 map.Set(i, (i % 27) == 0); | |
184 | |
185 int find_me = 135; // First one expected. | |
186 for (int index = 111; map.FindNextSetBitBeforeLimit(&index, 278); | |
187 ++index) { | |
188 EXPECT_EQ(index, find_me); | |
189 find_me += 27; | |
190 } | |
191 EXPECT_EQ(find_me, 297); // The next find_me after 278. | |
192 } | |
193 | |
194 TEST(BitmapTest, FindNextSetBitBeforeLimitAligned) { | |
195 // Test FindNextSetBitBeforeLimit on aligned scans. | |
196 disk_cache::Bitmap map(256, true); | |
197 for (int i = 0; i < 256; i++) | |
198 map.Set(i, (i % 32) == 0); | |
199 for (int i = 0; i < 256; i += 32) { | |
200 int index = i + 1; | |
201 EXPECT_FALSE(map.FindNextSetBitBeforeLimit(&index, i + 32)); | |
202 } | |
203 } | |
204 | |
205 TEST(BitmapTest, FindNextSetBit) { | |
206 // Test FindNextSetBit. Check all bits in map. Should find multiples | |
207 // of 7 from 0 to 98. | |
208 disk_cache::Bitmap map(100, true); | |
209 for (int i = 0; i < 100; i++) | |
210 map.Set(i, (i % 7) == 0); | |
211 | |
212 int find_me = 0; // First one expected. | |
213 for (int index = 0; map.FindNextSetBit(&index); ++index) { | |
214 EXPECT_EQ(index, find_me); | |
215 find_me += 7; | |
216 } | |
217 EXPECT_EQ(find_me, 105); // The next find_me after 98. | |
218 } | |
219 | |
220 TEST(BitmapTest, FindNextBit) { | |
221 // Almost the same test as FindNextSetBit, but find zeros instead of ones. | |
222 disk_cache::Bitmap map(100, false); | |
223 map.SetAll(true); | |
224 for (int i = 0; i < 100; i++) | |
225 map.Set(i, (i % 7) != 0); | |
226 | |
227 int find_me = 0; // First one expected. | |
228 for (int index = 0; map.FindNextBit(&index, 100, false); ++index) { | |
229 EXPECT_EQ(index, find_me); | |
230 find_me += 7; | |
231 } | |
232 EXPECT_EQ(find_me, 105); // The next find_me after 98. | |
233 } | |
234 | |
235 TEST(BitmapTest, SimpleFindBits) { | |
236 disk_cache::Bitmap bitmap(64, true); | |
237 bitmap.SetMapElement(0, 0x7ff10060); | |
238 | |
239 // Bit at index off. | |
240 int index = 0; | |
241 EXPECT_EQ(5, bitmap.FindBits(&index, 63, false)); | |
242 EXPECT_EQ(0, index); | |
243 | |
244 EXPECT_EQ(2, bitmap.FindBits(&index, 63, true)); | |
245 EXPECT_EQ(5, index); | |
246 | |
247 index = 0; | |
248 EXPECT_EQ(2, bitmap.FindBits(&index, 63, true)); | |
249 EXPECT_EQ(5, index); | |
250 | |
251 index = 6; | |
252 EXPECT_EQ(9, bitmap.FindBits(&index, 63, false)); | |
253 EXPECT_EQ(7, index); | |
254 | |
255 // Bit at index on. | |
256 index = 16; | |
257 EXPECT_EQ(1, bitmap.FindBits(&index, 63, true)); | |
258 EXPECT_EQ(16, index); | |
259 | |
260 index = 17; | |
261 EXPECT_EQ(11, bitmap.FindBits(&index, 63, true)); | |
262 EXPECT_EQ(20, index); | |
263 | |
264 index = 31; | |
265 EXPECT_EQ(0, bitmap.FindBits(&index, 63, true)); | |
266 EXPECT_EQ(31, index); | |
267 | |
268 // With a limit. | |
269 index = 8; | |
270 EXPECT_EQ(0, bitmap.FindBits(&index, 16, true)); | |
271 } | |
272 | |
273 TEST(BitmapTest, MultiWordFindBits) { | |
274 disk_cache::Bitmap bitmap(500, true); | |
275 bitmap.SetMapElement(10, 0xff00); | |
276 | |
277 int index = 0; | |
278 EXPECT_EQ(0, bitmap.FindBits(&index, 300, true)); | |
279 | |
280 EXPECT_EQ(8, bitmap.FindBits(&index, 500, true)); | |
281 EXPECT_EQ(328, index); | |
282 | |
283 bitmap.SetMapElement(10, 0xff000000); | |
284 bitmap.SetMapElement(11, 0xff); | |
285 | |
286 index = 0; | |
287 EXPECT_EQ(16, bitmap.FindBits(&index, 500, true)); | |
288 EXPECT_EQ(344, index); | |
289 | |
290 index = 0; | |
291 EXPECT_EQ(4, bitmap.FindBits(&index, 348, true)); | |
292 EXPECT_EQ(344, index); | |
293 } | |
OLD | NEW |