Skip to content

Commit e83648e

Browse files
joyeecheungaduh95
authored andcommitted
build,test: add tests for binary linked with shared libnode
This adds tests to ensure the V8 parts (v8, libplatform, cppgc) in shared libnode works correctly. PR-URL: #61463 Backport-PR-URL: #65219 Refs: #61144 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
1 parent b12bcc9 commit e83648e

5 files changed

Lines changed: 150 additions & 9 deletions

File tree

node.gyp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,6 +1511,61 @@
15111511
],
15121512
}, # embedtest
15131513

1514+
{
1515+
'target_name': 'shared_embedtest',
1516+
'type': 'executable',
1517+
1518+
'dependencies': [
1519+
'<(node_lib_target_name)',
1520+
],
1521+
1522+
# Don't depend on node.gypi - it otherwise links to
1523+
# the static libraries and resolve symbols at build time.
1524+
'include_dirs': [
1525+
'deps/v8/include',
1526+
],
1527+
1528+
'sources': [
1529+
'test/embedding/shared_embedtest.cc',
1530+
],
1531+
'conditions': [
1532+
[ 'node_shared=="true"', {
1533+
'defines': [
1534+
'USING_V8_SHARED',
1535+
'USING_V8_PLATFORM_SHARED',
1536+
],
1537+
'defines!': [
1538+
'BUILDING_V8_PLATFORM_SHARED=1',
1539+
'BUILDING_V8_SHARED=1',
1540+
],
1541+
}, {
1542+
# Only test shared embedding when Node is built as shared library.
1543+
'type': 'none',
1544+
}],
1545+
# Only test platforms known to work.
1546+
['OS not in "mac win linux"', {
1547+
'type': 'none',
1548+
}],
1549+
['OS=="win"', {
1550+
'libraries': [
1551+
'Dbghelp.lib',
1552+
'winmm.lib',
1553+
'Ws2_32.lib',
1554+
],
1555+
}],
1556+
['OS=="mac"', {
1557+
'xcode_settings': {
1558+
'OTHER_LDFLAGS': [ '-Wl,-rpath,@loader_path', ],
1559+
}
1560+
}],
1561+
['OS=="linux"', {
1562+
'ldflags': [
1563+
'-Wl,-rpath,\\$$ORIGIN'
1564+
],
1565+
}],
1566+
],
1567+
}, # shared_embedtest
1568+
15141569
{
15151570
'target_name': 'overlapped-checker',
15161571
'type': 'executable',

test/common/index.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ if (isMainThread)
5151

5252
const noop = () => {};
5353

54+
// Whether the executable is linked against the shared library i.e. libnode.
55+
const usesSharedLibrary = process.config.variables.node_shared;
5456
const hasCrypto = Boolean(process.versions.openssl) &&
5557
!process.env.NODE_SKIP_CRYPTO;
5658

@@ -945,6 +947,13 @@ function sleepSync(ms) {
945947
Atomics.wait(i32, 0, 0, ms);
946948
}
947949

950+
function resolveBuiltBinary(binary) {
951+
if (isWindows) {
952+
binary += '.exe';
953+
}
954+
return path.join(path.dirname(process.execPath), binary);
955+
}
956+
948957
const common = {
949958
allowGlobals,
950959
buildType,
@@ -990,6 +999,7 @@ const common = {
990999
printSkipMessage,
9911000
pwdCommand,
9921001
requireNoPackageJSONAbove,
1002+
resolveBuiltBinary,
9931003
runWithInvalidFD,
9941004
skip,
9951005
skipIf32Bits,
@@ -998,6 +1008,7 @@ const common = {
9981008
skipIfSQLiteMissing,
9991009
spawnPromisified,
10001010
sleepSync,
1011+
usesSharedLibrary,
10011012

10021013
get enoughTestMem() {
10031014
return require('os').totalmem() > 0x70000000; /* 1.75 Gb */

test/embedding/shared_embedtest.cc

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#include <libplatform/libplatform.h>
2+
#include <v8-cppgc.h>
3+
#include <v8.h>
4+
5+
#include <cppgc/allocation.h>
6+
#include <cppgc/default-platform.h>
7+
#include <cppgc/garbage-collected.h>
8+
#include <cppgc/heap.h>
9+
#include <cppgc/member.h>
10+
#include <cppgc/platform.h>
11+
#include <cppgc/visitor.h>
12+
13+
class Wrappable final : public cppgc::GarbageCollected<Wrappable> {
14+
public:
15+
void Trace(cppgc::Visitor* visitor) const {}
16+
};
17+
18+
int main(int argc, char* argv[]) {
19+
std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
20+
v8::V8::InitializePlatform(platform.get());
21+
cppgc::InitializeProcess(platform->GetPageAllocator());
22+
v8::V8::Initialize();
23+
24+
auto heap = v8::CppHeap::Create(platform.get(), v8::CppHeapCreateParams{{}});
25+
v8::Isolate::CreateParams create_params;
26+
create_params.array_buffer_allocator =
27+
v8::ArrayBuffer::Allocator::NewDefaultAllocator();
28+
create_params.cpp_heap = heap.release();
29+
30+
v8::Isolate* isolate = v8::Isolate::New(create_params);
31+
{
32+
v8::Isolate::Scope isolate_scope(isolate);
33+
v8::HandleScope handle_scope(isolate);
34+
v8::Local<v8::Context> context = v8::Context::New(isolate);
35+
v8::Context::Scope context_scope(context);
36+
37+
v8::Local<v8::Object> obj = v8::Object::New(isolate);
38+
Wrappable* wrappable = cppgc::MakeGarbageCollected<Wrappable>(
39+
isolate->GetCppHeap()->GetAllocationHandle());
40+
v8::Object::Wrap<v8::CppHeapPointerTag::kDefaultTag>(
41+
isolate, obj, wrappable);
42+
v8::Local<v8::String> source =
43+
v8::String::NewFromUtf8Literal(isolate, "'Hello' + ', World!'");
44+
v8::Local<v8::Script> script =
45+
v8::Script::Compile(context, source).ToLocalChecked();
46+
v8::Local<v8::Value> result = script->Run(context).ToLocalChecked();
47+
v8::String::Utf8Value utf8(isolate, result);
48+
printf("%s\n", *utf8);
49+
}
50+
51+
isolate->Dispose();
52+
cppgc::ShutdownProcess();
53+
v8::V8::Dispose();
54+
v8::V8::DisposePlatform();
55+
delete create_params.array_buffer_allocator;
56+
57+
return 0;
58+
}

test/embedding/test-embedding.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,14 @@ const {
88
spawnSyncAndExit,
99
spawnSyncAndExitWithoutError,
1010
} = require('../common/child_process');
11-
const path = require('path');
1211
const fs = require('fs');
1312
const os = require('os');
1413

1514
tmpdir.refresh();
1615
common.allowGlobals(global.require);
1716
common.allowGlobals(global.embedVars);
1817

19-
function resolveBuiltBinary(binary) {
20-
if (common.isWindows) {
21-
binary += '.exe';
22-
}
23-
return path.join(path.dirname(process.execPath), binary);
24-
}
25-
26-
const binary = resolveBuiltBinary('embedtest');
18+
const binary = common.resolveBuiltBinary('embedtest');
2719

2820
spawnSyncAndAssert(
2921
binary,
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
'use strict';
2+
3+
// This tests the V8 parts in the shared library work correctly.
4+
// TODO(joyeecheung): also test that the Node.js parts work correctly,
5+
// which can be done in embedtest just built in shared library mode.
6+
7+
const common = require('../common');
8+
9+
if (!common.usesSharedLibrary) {
10+
common.skip('Only tests builds linking against Node.js shared library');
11+
}
12+
13+
const { spawnSyncAndAssert } = require('../common/child_process');
14+
const fs = require('fs');
15+
16+
const binary = common.resolveBuiltBinary('shared_embedtest');
17+
18+
if (!fs.existsSync(binary)) {
19+
common.skip('shared_embedtest binary not built');
20+
}
21+
22+
spawnSyncAndAssert(binary, {
23+
trim: true,
24+
stdout: 'Hello, World!',
25+
});

0 commit comments

Comments
 (0)