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 3 // found in the LICENSE file. 4 5 #include "net/disk_cache/addr.h" 6 #include "net/disk_cache/block_files.h" 7 #include "net/disk_cache/disk_format_base.h" 8 #include "net/disk_cache/v3/block_bitmaps.h" 9 #include "testing/gtest/include/gtest/gtest.h" 10 11 // Tests that we add and remove blocks correctly. 12 TEST(DiskCacheBlockBitmaps, V3AllocationMap) { 13 disk_cache::BlockBitmaps block_bitmaps; 14 disk_cache::BlockFilesBitmaps bitmaps; 15 16 const int kNumHeaders = 10; 17 disk_cache::BlockFileHeader headers[kNumHeaders]; 18 for (int i = 0; i < kNumHeaders; i++) { 19 memset(&headers[i], 0, sizeof(headers[i])); 20 headers[i].magic = disk_cache::kBlockMagic; 21 headers[i].version = disk_cache::kBlockCurrentVersion; 22 headers[i].this_file = static_cast<int16>(i); 23 headers[i].empty[3] = 200; 24 headers[i].max_entries = 800; 25 bitmaps.push_back(disk_cache::BlockHeader(&headers[i])); 26 } 27 28 block_bitmaps.Init(bitmaps); 29 30 // Create a bunch of entries. 31 const int kSize = 100; 32 disk_cache::Addr address[kSize]; 33 for (int i = 0; i < kSize; i++) { 34 SCOPED_TRACE(i); 35 int block_size = i % 4 + 1; 36 ASSERT_TRUE(block_bitmaps.CreateBlock(disk_cache::BLOCK_1K, block_size, 37 &address[i])); 38 EXPECT_EQ(disk_cache::BLOCK_1K, address[i].file_type()); 39 EXPECT_EQ(block_size, address[i].num_blocks()); 40 int start = address[i].start_block(); 41 42 // Verify that the allocated entry doesn't cross a 4 block boundary. 43 EXPECT_EQ(start / 4, (start + block_size - 1) / 4); 44 } 45 46 for (int i = 0; i < kSize; i++) { 47 SCOPED_TRACE(i); 48 EXPECT_TRUE(block_bitmaps.IsValid(address[i])); 49 } 50 51 // The first part of the allocation map should be completely filled. We used 52 // 10 bits per each of four entries, so 250 bits total. All entries should go 53 // to the third file. 54 uint8* buffer = reinterpret_cast<uint8*>(&headers[2].allocation_map); 55 for (int i = 0; i < 29; i++) { 56 SCOPED_TRACE(i); 57 EXPECT_EQ(0xff, buffer[i]); 58 } 59 60 for (int i = 0; i < kSize; i++) { 61 SCOPED_TRACE(i); 62 block_bitmaps.DeleteBlock(address[i]); 63 } 64 65 // The allocation map should be empty. 66 for (int i =0; i < 50; i++) { 67 SCOPED_TRACE(i); 68 EXPECT_EQ(0, buffer[i]); 69 } 70 } 71