Home | History | Annotate | Download | only in blockfile
      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/blockfile/addr.h"
      6 #include "net/disk_cache/blockfile/block_bitmaps_v3.h"
      7 #include "net/disk_cache/blockfile/block_files.h"
      8 #include "net/disk_cache/blockfile/disk_format_base.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