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
8namespace {
9
10using v8::internal::Bitmap;
11
12class 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
19  BitmapTest() : memory_(new uint8_t[Bitmap::kSize]) {
20    memset(memory_, 0, Bitmap::kSize);
21  }
22
23  virtual ~BitmapTest() { delete[] memory_; }
24
25  Bitmap* bitmap() { return reinterpret_cast<Bitmap*>(memory_); }
26  uint8_t* raw_bitmap() { return memory_; }
27
28 private:
29  uint8_t* memory_;
30};
31
32
33const uint32_t BitmapTest::kBlackCell = 0xAAAAAAAA;
34const uint32_t BitmapTest::kWhiteCell = 0x00000000;
35const uint32_t BitmapTest::kBlackByte = 0xAA;
36const uint32_t BitmapTest::kWhiteByte = 0x00;
37
38
39TEST_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
48TEST_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
59TEST_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
75TEST_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
83TEST_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
95TEST_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