• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 the V8 project 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 "src/heap/spaces.h"
6 #include "testing/gtest/include/gtest/gtest.h"
7 
8 namespace {
9 
10 using v8::internal::Bitmap;
11 
12 class BitmapTest : public ::testing::Test {
13  public:
14   static const uint32_t kBlackCell;
15   static const uint32_t kWhiteCell;
16   static const uint32_t kBlackByte;
17   static const uint32_t kWhiteByte;
18 
BitmapTest()19   BitmapTest() : memory_(new uint8_t[Bitmap::kSize]) {
20     memset(memory_, 0, Bitmap::kSize);
21   }
22 
~BitmapTest()23   virtual ~BitmapTest() { delete[] memory_; }
24 
bitmap()25   Bitmap* bitmap() { return reinterpret_cast<Bitmap*>(memory_); }
raw_bitmap()26   uint8_t* raw_bitmap() { return memory_; }
27 
28  private:
29   uint8_t* memory_;
30 };
31 
32 
33 const uint32_t BitmapTest::kBlackCell = 0xAAAAAAAA;
34 const uint32_t BitmapTest::kWhiteCell = 0x00000000;
35 const uint32_t BitmapTest::kBlackByte = 0xAA;
36 const uint32_t BitmapTest::kWhiteByte = 0x00;
37 
38 
TEST_F(BitmapTest,IsZeroInitialized)39 TEST_F(BitmapTest, IsZeroInitialized) {
40   // We require all tests to start from a zero-initialized bitmap. Manually
41   // verify this invariant here.
42   for (size_t i = 0; i < Bitmap::kSize; i++) {
43     EXPECT_EQ(raw_bitmap()[i], kWhiteByte);
44   }
45 }
46 
47 
TEST_F(BitmapTest,Cells)48 TEST_F(BitmapTest, Cells) {
49   Bitmap* bm = bitmap();
50   bm->cells()[1] = kBlackCell;
51   uint8_t* raw = raw_bitmap();
52   int second_cell_base = Bitmap::kBytesPerCell;
53   for (size_t i = 0; i < Bitmap::kBytesPerCell; i++) {
54     EXPECT_EQ(raw[second_cell_base + i], kBlackByte);
55   }
56 }
57 
58 
TEST_F(BitmapTest,CellsCount)59 TEST_F(BitmapTest, CellsCount) {
60   int last_cell_index = bitmap()->CellsCount() - 1;
61   bitmap()->cells()[last_cell_index] = kBlackCell;
62   // Manually verify on raw memory.
63   uint8_t* raw = raw_bitmap();
64   for (size_t i = 0; i < Bitmap::kSize; i++) {
65     // Last cell should be set.
66     if (i >= (Bitmap::kSize - Bitmap::kBytesPerCell)) {
67       EXPECT_EQ(raw[i], kBlackByte);
68     } else {
69       EXPECT_EQ(raw[i], kWhiteByte);
70     }
71   }
72 }
73 
74 
TEST_F(BitmapTest,IsClean)75 TEST_F(BitmapTest, IsClean) {
76   Bitmap* bm = bitmap();
77   EXPECT_TRUE(bm->IsClean());
78   bm->cells()[0] = kBlackCell;
79   EXPECT_FALSE(bm->IsClean());
80 }
81 
82 
TEST_F(BitmapTest,ClearRange1)83 TEST_F(BitmapTest, ClearRange1) {
84   Bitmap* bm = bitmap();
85   bm->cells()[0] = kBlackCell;
86   bm->cells()[1] = kBlackCell;
87   bm->cells()[2] = kBlackCell;
88   bm->ClearRange(0, Bitmap::kBitsPerCell + Bitmap::kBitsPerCell / 2);
89   EXPECT_EQ(bm->cells()[0], kWhiteCell);
90   EXPECT_EQ(bm->cells()[1], 0xAAAA0000);
91   EXPECT_EQ(bm->cells()[2], kBlackCell);
92 }
93 
94 
TEST_F(BitmapTest,ClearRange2)95 TEST_F(BitmapTest, ClearRange2) {
96   Bitmap* bm = bitmap();
97   bm->cells()[0] = kBlackCell;
98   bm->cells()[1] = kBlackCell;
99   bm->cells()[2] = kBlackCell;
100   bm->ClearRange(Bitmap::kBitsPerCell,
101                  Bitmap::kBitsPerCell + Bitmap::kBitsPerCell / 2);
102   EXPECT_EQ(bm->cells()[0], kBlackCell);
103   EXPECT_EQ(bm->cells()[1], 0xAAAA0000);
104   EXPECT_EQ(bm->cells()[2], kBlackCell);
105 }
106 
107 }  // namespace
108