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 |