OLD | NEW |
1 // Copyright (C) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (C) 2010 The Chromium OS Authors. All rights reserved. |
2 // Use of this source code is governed by the GPL v2 license that can | 2 // Use of this source code is governed by the GPL v2 license that can |
3 // be found in the LICENSE file. | 3 // be found in the LICENSE file. |
4 // | 4 // |
5 // Basic unittesting of dm-bht using google-gtest. | 5 // Basic unittesting of dm-bht using google-gtest. |
6 | 6 |
7 #include <base/basictypes.h> | 7 #include <base/basictypes.h> |
8 #include <base/logging.h> | 8 #include <base/logging.h> |
9 #include <base/scoped_ptr.h> | 9 #include <base/scoped_ptr.h> |
10 #include <gtest/gtest.h> | 10 #include <gtest/gtest.h> |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 u8 *zero_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); | 165 u8 *zero_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); |
166 | 166 |
167 memset(zero_page, 0, PAGE_SIZE); | 167 memset(zero_page, 0, PAGE_SIZE); |
168 | 168 |
169 SetupBht(total_blocks, "sha256"); | 169 SetupBht(total_blocks, "sha256"); |
170 dm_bht_set_root_hexdigest(bht_.get(), | 170 dm_bht_set_root_hexdigest(bht_.get(), |
171 reinterpret_cast<const u8 *>(kRootDigest)); | 171 reinterpret_cast<const u8 *>(kRootDigest)); |
172 | 172 |
173 for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) { | 173 for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) { |
174 DLOG(INFO) << "verifying block: " << blocks; | 174 DLOG(INFO) << "verifying block: " << blocks; |
175 EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks, zero_page)); | 175 EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks, |
| 176 virt_to_page(zero_page), 0)); |
176 } | 177 } |
177 | 178 |
178 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); | 179 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); |
179 free(zero_page); | 180 free(zero_page); |
180 } | 181 } |
181 | 182 |
182 TEST_F(MemoryBhtTest, CreateThenVerifySingleLevel) { | 183 TEST_F(MemoryBhtTest, CreateThenVerifySingleLevel) { |
183 static const unsigned int total_blocks = 32; | 184 static const unsigned int total_blocks = 32; |
184 // Set the root hash for a 0-filled image | 185 // Set the root hash for a 0-filled image |
185 static const char kRootDigest[] = | 186 static const char kRootDigest[] = |
186 "2d3a43008286f56536fa24dcdbf14d342f0548827e374210415c7be0b610d2ba"; | 187 "2d3a43008286f56536fa24dcdbf14d342f0548827e374210415c7be0b610d2ba"; |
187 // A page of all zeros | 188 // A page of all zeros |
188 u8 *zero_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); | 189 u8 *zero_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); |
189 | 190 |
190 memset(zero_page, 0, PAGE_SIZE); | 191 memset(zero_page, 0, PAGE_SIZE); |
191 | 192 |
192 SetupBht(total_blocks, "sha256"); | 193 SetupBht(total_blocks, "sha256"); |
193 dm_bht_set_root_hexdigest(bht_.get(), | 194 dm_bht_set_root_hexdigest(bht_.get(), |
194 reinterpret_cast<const u8 *>(kRootDigest)); | 195 reinterpret_cast<const u8 *>(kRootDigest)); |
195 | 196 |
196 for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) { | 197 for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) { |
197 DLOG(INFO) << "verifying block: " << blocks; | 198 DLOG(INFO) << "verifying block: " << blocks; |
198 EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks, zero_page)); | 199 EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks, |
| 200 virt_to_page(zero_page), 0)); |
199 } | 201 } |
200 | 202 |
201 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); | 203 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); |
202 free(zero_page); | 204 free(zero_page); |
203 } | 205 } |
204 | 206 |
205 TEST_F(MemoryBhtTest, CreateThenVerifyRealParameters) { | 207 TEST_F(MemoryBhtTest, CreateThenVerifyRealParameters) { |
206 static const unsigned int total_blocks = 217600; | 208 static const unsigned int total_blocks = 217600; |
207 // Set the root hash for a 0-filled image | 209 // Set the root hash for a 0-filled image |
208 static const char kRootDigest[] = | 210 static const char kRootDigest[] = |
209 "15d5a180b5080a1d43e3fbd1f2cd021d0fc3ea91a8e330bad468b980c2fd4d8b"; | 211 "15d5a180b5080a1d43e3fbd1f2cd021d0fc3ea91a8e330bad468b980c2fd4d8b"; |
210 // A page of all zeros | 212 // A page of all zeros |
211 u8 *zero_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); | 213 u8 *zero_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); |
212 | 214 |
213 memset(zero_page, 0, PAGE_SIZE); | 215 memset(zero_page, 0, PAGE_SIZE); |
214 | 216 |
215 SetupBht(total_blocks, "sha256"); | 217 SetupBht(total_blocks, "sha256"); |
216 dm_bht_set_root_hexdigest(bht_.get(), | 218 dm_bht_set_root_hexdigest(bht_.get(), |
217 reinterpret_cast<const u8 *>(kRootDigest)); | 219 reinterpret_cast<const u8 *>(kRootDigest)); |
218 | 220 |
219 for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) { | 221 for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) { |
220 DLOG(INFO) << "verifying block: " << blocks; | 222 DLOG(INFO) << "verifying block: " << blocks; |
221 EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks, zero_page)); | 223 EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks, |
| 224 virt_to_page(zero_page), 0)); |
222 } | 225 } |
223 | 226 |
224 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); | 227 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); |
225 free(zero_page); | 228 free(zero_page); |
226 } | 229 } |
227 | 230 |
228 TEST_F(MemoryBhtTest, CreateThenVerifyOddLeafCount) { | 231 TEST_F(MemoryBhtTest, CreateThenVerifyOddLeafCount) { |
229 static const unsigned int total_blocks = 16383; | 232 static const unsigned int total_blocks = 16383; |
230 // Set the root hash for a 0-filled image | 233 // Set the root hash for a 0-filled image |
231 static const char kRootDigest[] = | 234 static const char kRootDigest[] = |
232 "dc8cec4220d388b05ba75c853f858bb8cc25edfb1d5d2f3be6bdf9edfa66dc6a"; | 235 "dc8cec4220d388b05ba75c853f858bb8cc25edfb1d5d2f3be6bdf9edfa66dc6a"; |
233 // A page of all zeros | 236 // A page of all zeros |
234 u8 *zero_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); | 237 u8 *zero_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); |
235 | 238 |
236 memset(zero_page, 0, PAGE_SIZE); | 239 memset(zero_page, 0, PAGE_SIZE); |
237 | 240 |
238 SetupBht(total_blocks, "sha256"); | 241 SetupBht(total_blocks, "sha256"); |
239 dm_bht_set_root_hexdigest(bht_.get(), | 242 dm_bht_set_root_hexdigest(bht_.get(), |
240 reinterpret_cast<const u8 *>(kRootDigest)); | 243 reinterpret_cast<const u8 *>(kRootDigest)); |
241 | 244 |
242 for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) { | 245 for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) { |
243 DLOG(INFO) << "verifying block: " << blocks; | 246 DLOG(INFO) << "verifying block: " << blocks; |
244 EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks, zero_page)); | 247 EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks, |
| 248 virt_to_page(zero_page), 0)); |
245 } | 249 } |
246 | 250 |
247 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); | 251 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); |
248 free(zero_page); | 252 free(zero_page); |
249 } | 253 } |
250 | 254 |
251 TEST_F(MemoryBhtTest, CreateThenVerifyOddNodeCount) { | 255 TEST_F(MemoryBhtTest, CreateThenVerifyOddNodeCount) { |
252 static const unsigned int total_blocks = 16000; | 256 static const unsigned int total_blocks = 16000; |
253 // Set the root hash for a 0-filled image | 257 // Set the root hash for a 0-filled image |
254 static const char kRootDigest[] = | 258 static const char kRootDigest[] = |
255 "10832dd62c427bcf68c56c8de0d1f9c32b61d9e5ddf43c77c56a97b372ad4b07"; | 259 "10832dd62c427bcf68c56c8de0d1f9c32b61d9e5ddf43c77c56a97b372ad4b07"; |
256 // A page of all zeros | 260 // A page of all zeros |
257 u8 *zero_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); | 261 u8 *zero_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); |
258 | 262 |
259 memset(zero_page, 0, PAGE_SIZE); | 263 memset(zero_page, 0, PAGE_SIZE); |
260 | 264 |
261 SetupBht(total_blocks, "sha256"); | 265 SetupBht(total_blocks, "sha256"); |
262 dm_bht_set_root_hexdigest(bht_.get(), | 266 dm_bht_set_root_hexdigest(bht_.get(), |
263 reinterpret_cast<const u8 *>(kRootDigest)); | 267 reinterpret_cast<const u8 *>(kRootDigest)); |
264 | 268 |
265 for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) { | 269 for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) { |
266 DLOG(INFO) << "verifying block: " << blocks; | 270 DLOG(INFO) << "verifying block: " << blocks; |
267 EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks, zero_page)); | 271 EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks, |
| 272 virt_to_page(zero_page), 0)); |
268 } | 273 } |
269 | 274 |
270 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); | 275 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); |
271 free(zero_page); | 276 free(zero_page); |
272 } | 277 } |
273 | 278 |
274 TEST_F(MemoryBhtTest, CreateThenVerifyBadHashBlock) { | 279 TEST_F(MemoryBhtTest, CreateThenVerifyBadHashBlock) { |
275 static const unsigned int total_blocks = 16384; | 280 static const unsigned int total_blocks = 16384; |
276 // Set the root hash for a 0-filled image | 281 // Set the root hash for a 0-filled image |
277 static const char kRootDigest[] = | 282 static const char kRootDigest[] = |
(...skipping 10 matching lines...) Expand all Loading... |
288 | 293 |
289 // TODO(wad) add tests for partial tree validity/verification | 294 // TODO(wad) add tests for partial tree validity/verification |
290 | 295 |
291 // Corrupt one has hblock | 296 // Corrupt one has hblock |
292 static const unsigned int kBadBlock = 256; | 297 static const unsigned int kBadBlock = 256; |
293 u8 *bad_hash_block= (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); | 298 u8 *bad_hash_block= (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); |
294 memset(bad_hash_block, 'A', PAGE_SIZE); | 299 memset(bad_hash_block, 'A', PAGE_SIZE); |
295 EXPECT_EQ(dm_bht_store_block(bht_.get(), kBadBlock, bad_hash_block), 0); | 300 EXPECT_EQ(dm_bht_store_block(bht_.get(), kBadBlock, bad_hash_block), 0); |
296 | 301 |
297 // Attempt to verify both the bad block and all the neighbors. | 302 // Attempt to verify both the bad block and all the neighbors. |
298 EXPECT_LT(dm_bht_verify_block(bht_.get(), kBadBlock + 1, zero_page), 0); | 303 EXPECT_LT(dm_bht_verify_block(bht_.get(), kBadBlock + 1, |
| 304 virt_to_page(zero_page), 0), 0); |
299 | 305 |
300 EXPECT_LT(dm_bht_verify_block(bht_.get(), kBadBlock + 2, zero_page), 0); | 306 EXPECT_LT(dm_bht_verify_block(bht_.get(), kBadBlock + 2, |
| 307 virt_to_page(zero_page), 0), 0); |
301 | 308 |
302 EXPECT_LT(dm_bht_verify_block(bht_.get(), kBadBlock + (bht_->node_count / 2), | 309 EXPECT_LT(dm_bht_verify_block(bht_.get(), kBadBlock + (bht_->node_count / 2), |
303 zero_page), | 310 virt_to_page(zero_page), 0), 0); |
304 0); | |
305 | 311 |
306 EXPECT_LT(dm_bht_verify_block(bht_.get(), kBadBlock, zero_page), 0); | 312 EXPECT_LT(dm_bht_verify_block(bht_.get(), kBadBlock, |
| 313 virt_to_page(zero_page), 0), 0); |
307 | 314 |
308 // Verify that the prior entry is untouched and still safe | 315 // Verify that the prior entry is untouched and still safe |
309 EXPECT_EQ(dm_bht_verify_block(bht_.get(), kBadBlock - 1, zero_page), 0); | 316 EXPECT_EQ(dm_bht_verify_block(bht_.get(), kBadBlock - 1, |
| 317 virt_to_page(zero_page), 0), 0); |
310 | 318 |
311 // Same for the next entry | 319 // Same for the next entry |
312 EXPECT_EQ(dm_bht_verify_block(bht_.get(), kBadBlock + bht_->node_count, | 320 EXPECT_EQ(dm_bht_verify_block(bht_.get(), kBadBlock + bht_->node_count, |
313 zero_page), | 321 virt_to_page(zero_page), 0), 0); |
314 0); | |
315 | 322 |
316 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); | 323 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); |
317 free(bad_hash_block); | 324 free(bad_hash_block); |
318 free(zero_page); | 325 free(zero_page); |
319 } | 326 } |
320 | 327 |
321 TEST_F(MemoryBhtTest, CreateThenVerifyBadDataBlock) { | 328 TEST_F(MemoryBhtTest, CreateThenVerifyBadDataBlock) { |
322 static const unsigned int total_blocks = 384; | 329 static const unsigned int total_blocks = 384; |
323 SetupBht(total_blocks, "sha256"); | 330 SetupBht(total_blocks, "sha256"); |
324 // Set the root hash for a 0-filled image | 331 // Set the root hash for a 0-filled image |
325 static const char kRootDigest[] = | 332 static const char kRootDigest[] = |
326 "45d65d6f9e5a962f4d80b5f1bd7a918152251c27bdad8c5f52b590c129833372"; | 333 "45d65d6f9e5a962f4d80b5f1bd7a918152251c27bdad8c5f52b590c129833372"; |
327 dm_bht_set_root_hexdigest(bht_.get(), | 334 dm_bht_set_root_hexdigest(bht_.get(), |
328 reinterpret_cast<const u8 *>(kRootDigest)); | 335 reinterpret_cast<const u8 *>(kRootDigest)); |
329 // A corrupt page | 336 // A corrupt page |
330 u8 *bad_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); | 337 u8 *bad_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE); |
331 | 338 |
332 memset(bad_page, 'A', PAGE_SIZE); | 339 memset(bad_page, 'A', PAGE_SIZE); |
333 | 340 |
334 | 341 |
335 EXPECT_LT(dm_bht_verify_block(bht_.get(), 0, bad_page), 0); | 342 EXPECT_LT(dm_bht_verify_block(bht_.get(), 0, virt_to_page(bad_page), 0), 0); |
336 EXPECT_LT(dm_bht_verify_block(bht_.get(), 127, bad_page), 0); | 343 EXPECT_LT(dm_bht_verify_block(bht_.get(), 127, virt_to_page(bad_page), 0), 0); |
337 EXPECT_LT(dm_bht_verify_block(bht_.get(), 128, bad_page), 0); | 344 EXPECT_LT(dm_bht_verify_block(bht_.get(), 128, virt_to_page(bad_page), 0), 0); |
338 EXPECT_LT(dm_bht_verify_block(bht_.get(), 255, bad_page), 0); | 345 EXPECT_LT(dm_bht_verify_block(bht_.get(), 255, virt_to_page(bad_page), 0), 0); |
339 EXPECT_LT(dm_bht_verify_block(bht_.get(), 256, bad_page), 0); | 346 EXPECT_LT(dm_bht_verify_block(bht_.get(), 256, virt_to_page(bad_page), 0), 0); |
340 EXPECT_LT(dm_bht_verify_block(bht_.get(), 383, bad_page), 0); | 347 EXPECT_LT(dm_bht_verify_block(bht_.get(), 383, virt_to_page(bad_page), 0), 0); |
341 | 348 |
342 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); | 349 EXPECT_EQ(0, dm_bht_destroy(bht_.get())); |
343 free(bad_page); | 350 free(bad_page); |
344 } | 351 } |
OLD | NEW |