diff options
author | Marcel Laverdet <marcel@laverdet.com> | 2019-11-12 14:26:08 -0800 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2019-11-20 19:02:55 +0100 |
commit | c712fb7cd6222018cf615fd0071998bde6f16da9 (patch) | |
tree | 2f6713dc39dfea54e6fb6b1a56a82c9da64469a6 /test | |
parent | c63af4fea041673eb7c33f6df3c474d4537fe5eb (diff) | |
download | android-node-v8-c712fb7cd6222018cf615fd0071998bde6f16da9.tar.gz android-node-v8-c712fb7cd6222018cf615fd0071998bde6f16da9.tar.bz2 android-node-v8-c712fb7cd6222018cf615fd0071998bde6f16da9.zip |
src: add abstract `IsolatePlatformDelegate`
Adds a new abstract class for module authors and embedders to register
arbitrary isolates with `node::MultiIsolatePlatform`.
PR-URL: https://github.com/nodejs/node/pull/30324
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/cctest/node_test_fixture.cc | 10 | ||||
-rw-r--r-- | test/cctest/node_test_fixture.h | 16 | ||||
-rw-r--r-- | test/cctest/test_platform.cc | 47 |
3 files changed, 65 insertions, 8 deletions
diff --git a/test/cctest/node_test_fixture.cc b/test/cctest/node_test_fixture.cc index 1a50e58dd9..b6f4af6b9e 100644 --- a/test/cctest/node_test_fixture.cc +++ b/test/cctest/node_test_fixture.cc @@ -1,7 +1,7 @@ #include "node_test_fixture.h" -ArrayBufferUniquePtr NodeTestFixture::allocator{nullptr, nullptr}; -uv_loop_t NodeTestFixture::current_loop; -NodePlatformUniquePtr NodeTestFixture::platform; -TracingAgentUniquePtr NodeTestFixture::tracing_agent; -bool NodeTestFixture::node_initialized = false; +ArrayBufferUniquePtr NodeZeroIsolateTestFixture::allocator{nullptr, nullptr}; +uv_loop_t NodeZeroIsolateTestFixture::current_loop; +NodePlatformUniquePtr NodeZeroIsolateTestFixture::platform; +TracingAgentUniquePtr NodeZeroIsolateTestFixture::tracing_agent; +bool NodeZeroIsolateTestFixture::node_initialized = false; diff --git a/test/cctest/node_test_fixture.h b/test/cctest/node_test_fixture.h index ac0701d094..c8cb923297 100644 --- a/test/cctest/node_test_fixture.h +++ b/test/cctest/node_test_fixture.h @@ -60,14 +60,13 @@ using ArrayBufferUniquePtr = std::unique_ptr<node::ArrayBufferAllocator, using TracingAgentUniquePtr = std::unique_ptr<node::tracing::Agent>; using NodePlatformUniquePtr = std::unique_ptr<node::NodePlatform>; -class NodeTestFixture : public ::testing::Test { +class NodeZeroIsolateTestFixture : public ::testing::Test { protected: static ArrayBufferUniquePtr allocator; static TracingAgentUniquePtr tracing_agent; static NodePlatformUniquePtr platform; static uv_loop_t current_loop; static bool node_initialized; - v8::Isolate* isolate_; static void SetUpTestCase() { if (!node_initialized) { @@ -99,8 +98,18 @@ class NodeTestFixture : public ::testing::Test { void SetUp() override { allocator = ArrayBufferUniquePtr(node::CreateArrayBufferAllocator(), &node::FreeArrayBufferAllocator); + } +}; + + +class NodeTestFixture : public NodeZeroIsolateTestFixture { + protected: + v8::Isolate* isolate_; + + void SetUp() override { + NodeZeroIsolateTestFixture::SetUp(); isolate_ = NewIsolate(allocator.get(), ¤t_loop); - CHECK_NE(isolate_, nullptr); + CHECK_NOT_NULL(isolate_); isolate_->Enter(); } @@ -110,6 +119,7 @@ class NodeTestFixture : public ::testing::Test { isolate_->Dispose(); platform->UnregisterIsolate(isolate_); isolate_ = nullptr; + NodeZeroIsolateTestFixture::TearDown(); } }; diff --git a/test/cctest/test_platform.cc b/test/cctest/test_platform.cc index 5420502124..73057bb2d8 100644 --- a/test/cctest/test_platform.cc +++ b/test/cctest/test_platform.cc @@ -57,3 +57,50 @@ TEST_F(PlatformTest, SkipNewTasksInFlushForegroundTasks) { EXPECT_EQ(3, run_count); EXPECT_FALSE(platform->FlushForegroundTasks(isolate_)); } + +// Tests the registration of an abstract `IsolatePlatformDelegate` instance as +// opposed to the more common `uv_loop_s*` version of `RegisterIsolate`. +TEST_F(NodeZeroIsolateTestFixture, IsolatePlatformDelegateTest) { + // Allocate isolate + v8::Isolate::CreateParams create_params; + create_params.array_buffer_allocator = allocator.get(); + auto isolate = v8::Isolate::Allocate(); + CHECK_NOT_NULL(isolate); + + // Register *first*, then initialize + auto delegate = std::make_shared<node::PerIsolatePlatformData>( + isolate, + ¤t_loop); + platform->RegisterIsolate(isolate, delegate.get()); + v8::Isolate::Initialize(isolate, create_params); + + // Try creating Context + IsolateData + Environment + { + v8::Isolate::Scope isolate_scope(isolate); + v8::HandleScope handle_scope(isolate); + + auto context = node::NewContext(isolate); + CHECK(!context.IsEmpty()); + v8::Context::Scope context_scope(context); + + std::unique_ptr<node::IsolateData, decltype(&node::FreeIsolateData)> + isolate_data{node::CreateIsolateData(isolate, + ¤t_loop, + platform.get()), + node::FreeIsolateData}; + CHECK(isolate_data); + + std::unique_ptr<node::Environment, decltype(&node::FreeEnvironment)> + environment{node::CreateEnvironment(isolate_data.get(), + context, + 0, nullptr, + 0, nullptr), + node::FreeEnvironment}; + CHECK(environment); + } + + // Graceful shutdown + delegate->Shutdown(); + isolate->Dispose(); + platform->UnregisterIsolate(isolate); +} |