Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Unified Diff: test/unittests/heap/embedder-tracing-unittest.cc

Issue 2576453002: [heap] Create a thin wrapper around wrapper tracing in V8 to avoid misuse (Closed)
Patch Set: Include Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/unittests/BUILD.gn ('k') | test/unittests/unittests.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/unittests/heap/embedder-tracing-unittest.cc
diff --git a/test/unittests/heap/embedder-tracing-unittest.cc b/test/unittests/heap/embedder-tracing-unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0b321ef4cc0e6e7dc4ec98467ff6b820a0e24467
--- /dev/null
+++ b/test/unittests/heap/embedder-tracing-unittest.cc
@@ -0,0 +1,165 @@
+// Copyright 2016 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/embedder-tracing.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace v8 {
+namespace internal {
+namespace heap {
+
+using testing::StrictMock;
+using testing::_;
+using testing::Return;
+using v8::EmbedderHeapTracer;
+using v8::internal::LocalEmbedderHeapTracer;
+
+namespace {
+
+LocalEmbedderHeapTracer::WrapperInfo CreateWrapperInfo() {
+ return LocalEmbedderHeapTracer::WrapperInfo(nullptr, nullptr);
+}
+
+} // namespace
+
+class MockEmbedderHeapTracer : public EmbedderHeapTracer {
+ public:
+ MOCK_METHOD0(TracePrologue, void());
+ MOCK_METHOD0(TraceEpilogue, void());
+ MOCK_METHOD0(AbortTracing, void());
+ MOCK_METHOD0(EnterFinalPause, void());
+ MOCK_METHOD0(NumberOfWrappersToTrace, size_t());
+ MOCK_METHOD1(RegisterV8References,
+ void(const std::vector<std::pair<void*, void*> >&));
+ MOCK_METHOD2(AdvanceTracing,
+ bool(double deadline_in_ms, AdvanceTracingActions actions));
+};
+
+TEST(LocalEmbedderHeapTracer, InUse) {
+ LocalEmbedderHeapTracer local_tracer;
+ MockEmbedderHeapTracer mock_remote_tracer;
+ local_tracer.SetRemoteTracer(&mock_remote_tracer);
+ EXPECT_TRUE(local_tracer.InUse());
+}
+
+TEST(LocalEmbedderHeapTracer, NoRemoteTracer) {
+ LocalEmbedderHeapTracer local_tracer;
+ // We should be able to call all functions without a remote tracer being
+ // attached.
+ EXPECT_FALSE(local_tracer.InUse());
+ local_tracer.TracePrologue();
+ local_tracer.EnterFinalPause();
+ bool more_work = local_tracer.Trace(
+ 0, EmbedderHeapTracer::AdvanceTracingActions(
+ EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION));
+ EXPECT_FALSE(more_work);
+ local_tracer.TraceEpilogue();
+}
+
+TEST(LocalEmbedderHeapTracer, TracePrologueForwards) {
+ LocalEmbedderHeapTracer local_tracer;
+ StrictMock<MockEmbedderHeapTracer> remote_tracer;
+ local_tracer.SetRemoteTracer(&remote_tracer);
+ EXPECT_CALL(remote_tracer, TracePrologue());
+ local_tracer.TracePrologue();
+}
+
+TEST(LocalEmbedderHeapTracer, TraceEpilogueForwards) {
+ LocalEmbedderHeapTracer local_tracer;
+ StrictMock<MockEmbedderHeapTracer> remote_tracer;
+ local_tracer.SetRemoteTracer(&remote_tracer);
+ EXPECT_CALL(remote_tracer, TraceEpilogue());
+ local_tracer.TraceEpilogue();
+}
+
+TEST(LocalEmbedderHeapTracer, AbortTracingForwards) {
+ LocalEmbedderHeapTracer local_tracer;
+ StrictMock<MockEmbedderHeapTracer> remote_tracer;
+ local_tracer.SetRemoteTracer(&remote_tracer);
+ EXPECT_CALL(remote_tracer, AbortTracing());
+ local_tracer.AbortTracing();
+}
+
+TEST(LocalEmbedderHeapTracer, AbortTracingClearsCachedWrappers) {
+ LocalEmbedderHeapTracer local_tracer;
+ StrictMock<MockEmbedderHeapTracer> remote_tracer;
+ local_tracer.SetRemoteTracer(&remote_tracer);
+ local_tracer.AddWrapperToTrace(CreateWrapperInfo());
+ EXPECT_CALL(remote_tracer, AbortTracing());
+ local_tracer.AbortTracing();
+ EXPECT_EQ(0u, local_tracer.NumberOfCachedWrappersToTrace());
+}
+
+TEST(LocalEmbedderHeapTracer, EnterFinalPauseForwards) {
+ LocalEmbedderHeapTracer local_tracer;
+ StrictMock<MockEmbedderHeapTracer> remote_tracer;
+ local_tracer.SetRemoteTracer(&remote_tracer);
+ EXPECT_CALL(remote_tracer, EnterFinalPause());
+ local_tracer.EnterFinalPause();
+}
+
+TEST(LocalEmbedderHeapTracer, NumberOfWrappersToTraceIncludesRemote) {
+ LocalEmbedderHeapTracer local_tracer;
+ StrictMock<MockEmbedderHeapTracer> remote_tracer;
+ local_tracer.SetRemoteTracer(&remote_tracer);
+ EXPECT_CALL(remote_tracer, NumberOfWrappersToTrace());
+ local_tracer.NumberOfWrappersToTrace();
+}
+
+TEST(LocalEmbedderHeapTracer, NumberOfCachedWrappersToTraceExcludesRemote) {
+ LocalEmbedderHeapTracer local_tracer;
+ StrictMock<MockEmbedderHeapTracer> remote_tracer;
+ local_tracer.SetRemoteTracer(&remote_tracer);
+ local_tracer.NumberOfCachedWrappersToTrace();
+}
+
+TEST(LocalEmbedderHeapTracer, RegisterWrappersWithRemoteTracer) {
+ LocalEmbedderHeapTracer local_tracer;
+ StrictMock<MockEmbedderHeapTracer> remote_tracer;
+ local_tracer.SetRemoteTracer(&remote_tracer);
+ local_tracer.AddWrapperToTrace(CreateWrapperInfo());
+ EXPECT_EQ(1u, local_tracer.NumberOfCachedWrappersToTrace());
+ EXPECT_CALL(remote_tracer, RegisterV8References(_));
+ local_tracer.RegisterWrappersWithRemoteTracer();
+ EXPECT_EQ(0u, local_tracer.NumberOfCachedWrappersToTrace());
+ EXPECT_CALL(remote_tracer, NumberOfWrappersToTrace()).WillOnce(Return(1));
+ EXPECT_EQ(1u, local_tracer.NumberOfWrappersToTrace());
+}
+
+TEST(LocalEmbedderHeapTracer, TraceFinishes) {
+ LocalEmbedderHeapTracer local_tracer;
+ StrictMock<MockEmbedderHeapTracer> remote_tracer;
+ local_tracer.SetRemoteTracer(&remote_tracer);
+ local_tracer.AddWrapperToTrace(CreateWrapperInfo());
+ EXPECT_EQ(1u, local_tracer.NumberOfCachedWrappersToTrace());
+ EXPECT_CALL(remote_tracer, RegisterV8References(_));
+ EXPECT_CALL(remote_tracer, AdvanceTracing(0, _)).WillOnce(Return(false));
+ EXPECT_EQ(
+ false,
+ local_tracer.Trace(
+ 0, EmbedderHeapTracer::AdvanceTracingActions(
+ EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION)));
+ EXPECT_EQ(0u, local_tracer.NumberOfCachedWrappersToTrace());
+}
+
+TEST(LocalEmbedderHeapTracer, TraceDoesNotFinish) {
+ LocalEmbedderHeapTracer local_tracer;
+ StrictMock<MockEmbedderHeapTracer> remote_tracer;
+ local_tracer.SetRemoteTracer(&remote_tracer);
+ local_tracer.AddWrapperToTrace(CreateWrapperInfo());
+ EXPECT_EQ(1u, local_tracer.NumberOfCachedWrappersToTrace());
+ EXPECT_CALL(remote_tracer, RegisterV8References(_));
+ EXPECT_CALL(remote_tracer, AdvanceTracing(0, _)).WillOnce(Return(true));
+ EXPECT_EQ(
+ true,
+ local_tracer.Trace(
+ 0, EmbedderHeapTracer::AdvanceTracingActions(
+ EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION)));
+ EXPECT_EQ(0u, local_tracer.NumberOfCachedWrappersToTrace());
+}
+
+} // namespace heap
+} // namespace internal
+} // namespace v8
« no previous file with comments | « test/unittests/BUILD.gn ('k') | test/unittests/unittests.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698