| Index: test/unittests/heap/bitmap-unittest.cc | 
| diff --git a/test/unittests/heap/bitmap-unittest.cc b/test/unittests/heap/bitmap-unittest.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..a84437d5341f7edf5830518043456dbc02bd11a9 | 
| --- /dev/null | 
| +++ b/test/unittests/heap/bitmap-unittest.cc | 
| @@ -0,0 +1,107 @@ | 
| +// Copyright 2015 the V8 project authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "src/heap/spaces.h" | 
| +#include "testing/gtest/include/gtest/gtest.h" | 
| + | 
| +namespace { | 
| + | 
| +using v8::internal::Bitmap; | 
| + | 
| +class BitmapTest : public ::testing::Test { | 
| + public: | 
| +  static const uint32_t kBlackCell; | 
| +  static const uint32_t kWhiteCell; | 
| +  static const uint32_t kBlackByte; | 
| +  static const uint32_t kWhiteByte; | 
| + | 
| +  BitmapTest() : memory_(new uint8_t[Bitmap::kSize]) { | 
| +    memset(memory_, 0, Bitmap::kSize); | 
| +  } | 
| + | 
| +  virtual ~BitmapTest() { delete[] memory_; } | 
| + | 
| +  Bitmap* bitmap() { return reinterpret_cast<Bitmap*>(memory_); } | 
| +  uint8_t* raw_bitmap() { return memory_; } | 
| + | 
| + private: | 
| +  uint8_t* memory_; | 
| +}; | 
| + | 
| + | 
| +const uint32_t BitmapTest::kBlackCell = 0xAAAAAAAA; | 
| +const uint32_t BitmapTest::kWhiteCell = 0x00000000; | 
| +const uint32_t BitmapTest::kBlackByte = 0xAA; | 
| +const uint32_t BitmapTest::kWhiteByte = 0x00; | 
| + | 
| + | 
| +TEST_F(BitmapTest, IsZeroInitialized) { | 
| +  // We require all tests to start from a zero-initialized bitmap. Manually | 
| +  // verify this invariant here. | 
| +  for (size_t i = 0; i < Bitmap::kSize; i++) { | 
| +    EXPECT_EQ(raw_bitmap()[i], kWhiteByte); | 
| +  } | 
| +} | 
| + | 
| + | 
| +TEST_F(BitmapTest, Cells) { | 
| +  Bitmap* bm = bitmap(); | 
| +  bm->cells()[1] = kBlackCell; | 
| +  uint8_t* raw = raw_bitmap(); | 
| +  int second_cell_base = Bitmap::kBytesPerCell; | 
| +  for (size_t i = 0; i < Bitmap::kBytesPerCell; i++) { | 
| +    EXPECT_EQ(raw[second_cell_base + i], kBlackByte); | 
| +  } | 
| +} | 
| + | 
| + | 
| +TEST_F(BitmapTest, CellsCount) { | 
| +  int last_cell_index = bitmap()->CellsCount() - 1; | 
| +  bitmap()->cells()[last_cell_index] = kBlackCell; | 
| +  // Manually verify on raw memory. | 
| +  uint8_t* raw = raw_bitmap(); | 
| +  for (size_t i = 0; i < Bitmap::kSize; i++) { | 
| +    // Last cell should be set. | 
| +    if (i >= (Bitmap::kSize - Bitmap::kBytesPerCell)) { | 
| +      EXPECT_EQ(raw[i], kBlackByte); | 
| +    } else { | 
| +      EXPECT_EQ(raw[i], kWhiteByte); | 
| +    } | 
| +  } | 
| +} | 
| + | 
| + | 
| +TEST_F(BitmapTest, IsClean) { | 
| +  Bitmap* bm = bitmap(); | 
| +  EXPECT_TRUE(bm->IsClean()); | 
| +  bm->cells()[0] = kBlackCell; | 
| +  EXPECT_FALSE(bm->IsClean()); | 
| +} | 
| + | 
| + | 
| +TEST_F(BitmapTest, ClearRange1) { | 
| +  Bitmap* bm = bitmap(); | 
| +  bm->cells()[0] = kBlackCell; | 
| +  bm->cells()[1] = kBlackCell; | 
| +  bm->cells()[2] = kBlackCell; | 
| +  bm->ClearRange(0, Bitmap::kBitsPerCell + Bitmap::kBitsPerCell / 2); | 
| +  EXPECT_EQ(bm->cells()[0], kWhiteCell); | 
| +  EXPECT_EQ(bm->cells()[1], 0xAAAA0000); | 
| +  EXPECT_EQ(bm->cells()[2], kBlackCell); | 
| +} | 
| + | 
| + | 
| +TEST_F(BitmapTest, ClearRange2) { | 
| +  Bitmap* bm = bitmap(); | 
| +  bm->cells()[0] = kBlackCell; | 
| +  bm->cells()[1] = kBlackCell; | 
| +  bm->cells()[2] = kBlackCell; | 
| +  bm->ClearRange(Bitmap::kBitsPerCell, | 
| +                 Bitmap::kBitsPerCell + Bitmap::kBitsPerCell / 2); | 
| +  EXPECT_EQ(bm->cells()[0], kBlackCell); | 
| +  EXPECT_EQ(bm->cells()[1], 0xAAAA0000); | 
| +  EXPECT_EQ(bm->cells()[2], kBlackCell); | 
| +} | 
| + | 
| +}  // namespace | 
|  |