PR-URL: https://github.com/nodejs/node/pull/58070 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
88 lines
2.8 KiB
C++
88 lines
2.8 KiB
C++
// Copyright 2021 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/marking-progress-tracker.h"
|
|
|
|
#include "testing/gtest/include/gtest/gtest.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
|
|
static constexpr size_t kObjectSize = 1 << 18;
|
|
|
|
TEST(MarkingProgressTracker, DefaultDisabled) {
|
|
MarkingProgressTracker progress_tracker;
|
|
EXPECT_FALSE(progress_tracker.IsEnabled());
|
|
}
|
|
|
|
TEST(MarkingProgressTracker, EnabledAfterExplicitEnable) {
|
|
MarkingProgressTracker progress_tracker;
|
|
progress_tracker.Enable(kObjectSize);
|
|
EXPECT_TRUE(progress_tracker.IsEnabled());
|
|
}
|
|
|
|
TEST(MarkingProgressTracker, ZerothChunkFirst) {
|
|
MarkingProgressTracker progress_tracker;
|
|
progress_tracker.Enable(kObjectSize);
|
|
ASSERT_TRUE(progress_tracker.IsEnabled());
|
|
EXPECT_EQ(0u, progress_tracker.GetNextChunkToMark());
|
|
}
|
|
|
|
TEST(MarkingProgressTracker, NumberOfChunks) {
|
|
MarkingProgressTracker progress_tracker;
|
|
progress_tracker.Enable(kObjectSize);
|
|
ASSERT_TRUE(progress_tracker.IsEnabled());
|
|
EXPECT_EQ((kObjectSize + MarkingProgressTracker::kChunkSize - 1) /
|
|
MarkingProgressTracker::kChunkSize,
|
|
progress_tracker.TotalNumberOfChunks());
|
|
}
|
|
|
|
TEST(MarkingProgressTracker, GetNextChunkToMarkIncrements) {
|
|
MarkingProgressTracker progress_tracker;
|
|
progress_tracker.Enable(kObjectSize);
|
|
const size_t num_chunks = progress_tracker.TotalNumberOfChunks();
|
|
ASSERT_TRUE(progress_tracker.IsEnabled());
|
|
for (size_t i = 0; i < num_chunks; ++i) {
|
|
EXPECT_EQ(progress_tracker.GetNextChunkToMark(), i);
|
|
}
|
|
}
|
|
|
|
TEST(MarkingProgressTracker, ResetIfEnabledOnDisabled) {
|
|
MarkingProgressTracker progress_tracker;
|
|
progress_tracker.ResetIfEnabled();
|
|
EXPECT_FALSE(progress_tracker.IsEnabled());
|
|
}
|
|
|
|
TEST(MarkingProgressTracker, ResetIfEnabledOnEnabled) {
|
|
MarkingProgressTracker progress_tracker;
|
|
progress_tracker.Enable(kObjectSize);
|
|
progress_tracker.GetNextChunkToMark();
|
|
progress_tracker.ResetIfEnabled();
|
|
ASSERT_TRUE(progress_tracker.IsEnabled());
|
|
EXPECT_EQ(0u, progress_tracker.GetNextChunkToMark());
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
|
|
TEST(MarkingProgressTrackerDeathTest, DiesOnTrySetValueOnDisabled) {
|
|
MarkingProgressTracker progress_tracker;
|
|
EXPECT_DEATH_IF_SUPPORTED(progress_tracker.GetNextChunkToMark(), "");
|
|
}
|
|
|
|
TEST(MarkingProgressTrackerDeathTest, GetNextChunkToMarkIncrementOOBs) {
|
|
MarkingProgressTracker progress_tracker;
|
|
progress_tracker.Enable(kObjectSize);
|
|
const size_t num_chunks = progress_tracker.TotalNumberOfChunks();
|
|
ASSERT_TRUE(progress_tracker.IsEnabled());
|
|
for (size_t i = 0; i < num_chunks; ++i) {
|
|
EXPECT_EQ(progress_tracker.GetNextChunkToMark(), i);
|
|
}
|
|
EXPECT_DEATH_IF_SUPPORTED(progress_tracker.GetNextChunkToMark(), "");
|
|
}
|
|
|
|
#endif // DEBUG
|
|
|
|
} // namespace internal
|
|
} // namespace v8
|