Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 150910d

Browse filesBrowse 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 Refs: #61144 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Richard Lau <richard.lau@ibm.com>
1 parent fb7868b commit 150910d
Copy full SHA for 150910d

5 files changed

+152-9Lines changed: 152 additions & 9 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎node.gyp‎

Copy file name to clipboardExpand all lines: node.gyp
+55Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,6 +1423,61 @@
14231423
],
14241424
}, # embedtest
14251425

1426+
{
1427+
'target_name': 'shared_embedtest',
1428+
'type': 'executable',
1429+
1430+
'dependencies': [
1431+
'<(node_lib_target_name)',
1432+
],
1433+
1434+
# Don't depend on node.gypi - it otherwise links to
1435+
# the static libraries and resolve symbols at build time.
1436+
'include_dirs': [
1437+
'deps/v8/include',
1438+
],
1439+
1440+
'sources': [
1441+
'test/embedding/shared_embedtest.cc',
1442+
],
1443+
'conditions': [
1444+
[ 'node_shared=="true"', {
1445+
'defines': [
1446+
'USING_V8_SHARED',
1447+
'USING_V8_PLATFORM_SHARED',
1448+
],
1449+
'defines!': [
1450+
'BUILDING_V8_PLATFORM_SHARED=1',
1451+
'BUILDING_V8_SHARED=1',
1452+
],
1453+
}, {
1454+
# Only test shared embedding when Node is built as shared library.
1455+
'type': 'none',
1456+
}],
1457+
# Only test platforms known to work.
1458+
['OS not in "mac win linux"', {
1459+
'type': 'none',
1460+
}],
1461+
['OS=="win"', {
1462+
'libraries': [
1463+
'Dbghelp.lib',
1464+
'winmm.lib',
1465+
'Ws2_32.lib',
1466+
],
1467+
}],
1468+
['OS=="mac"', {
1469+
'xcode_settings': {
1470+
'OTHER_LDFLAGS': [ '-Wl,-rpath,@loader_path', ],
1471+
}
1472+
}],
1473+
['OS=="linux"', {
1474+
'ldflags': [
1475+
'-Wl,-rpath,\\$$ORIGIN'
1476+
],
1477+
}],
1478+
],
1479+
}, # shared_embedtest
1480+
14261481
{
14271482
'target_name': 'overlapped-checker',
14281483
'type': 'executable',
Collapse file

‎test/common/index.js‎

Copy file name to clipboardExpand all lines: test/common/index.js
+11Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ if (isMainThread)
6262

6363
const noop = () => {};
6464

65+
// Whether the executable is linked against the shared library i.e. libnode.
66+
const usesSharedLibrary = process.config.variables.node_shared;
6567
const hasCrypto = Boolean(process.versions.openssl) &&
6668
!process.env.NODE_SKIP_CRYPTO;
6769

@@ -935,6 +937,13 @@ function sleepSync(ms) {
935937
Atomics.wait(i32, 0, 0, ms);
936938
}
937939

940+
function resolveBuiltBinary(binary) {
941+
if (isWindows) {
942+
binary += '.exe';
943+
}
944+
return path.join(path.dirname(process.execPath), binary);
945+
}
946+
938947
const common = {
939948
allowGlobals,
940949
buildType,
@@ -979,6 +988,7 @@ const common = {
979988
printSkipMessage,
980989
pwdCommand,
981990
requireNoPackageJSONAbove,
991+
resolveBuiltBinary,
982992
runWithInvalidFD,
983993
skip,
984994
skipIf32Bits,
@@ -987,6 +997,7 @@ const common = {
987997
skipIfSQLiteMissing,
988998
spawnPromisified,
989999
sleepSync,
1000+
usesSharedLibrary,
9901001

9911002
get enoughTestMem() {
9921003
return require('os').totalmem() > 0x70000000; /* 1.75 Gb */
Collapse file

‎test/embedding/shared_embedtest.cc‎

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

‎test/embedding/test-embedding.js‎

Copy file name to clipboardExpand all lines: test/embedding/test-embedding.js
+1-9Lines 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,
Collapse file
+25Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.