GeezerVison is showing github.com — build,test: add tests for binary linked with shared libnode · nodejs/node@e83648e
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: node.gyp +55Lines changed: 55 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| 1511 | 1511 | ], | 1512 | 1512 | }, # embedtest | 1513 | 1513 |
| | 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 | + | 1514 | 1569 | { | 1515 | 1570 | 'target_name': 'overlapped-checker', | 1516 | 1571 | 'type': 'executable', | |
Collapse file Copy file name to clipboardExpand all lines: test/common/index.js +11Lines changed: 11 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -51,6 +51,8 @@ if (isMainThread) | 51 | 51 |
| 52 | 52 | const noop = () => {}; | 53 | 53 |
| | 54 | +// Whether the executable is linked against the shared library i.e. libnode. | | 55 | +const usesSharedLibrary = process.config.variables.node_shared; | 54 | 56 | const hasCrypto = Boolean(process.versions.openssl) && | 55 | 57 | !process.env.NODE_SKIP_CRYPTO; | 56 | 58 |
| @@ -945,6 +947,13 @@ function sleepSync(ms) { | 945 | 947 | Atomics.wait(i32, 0, 0, ms); | 946 | 948 | } | 947 | 949 |
| | 950 | +function resolveBuiltBinary(binary) { | | 951 | + if (isWindows) { | | 952 | + binary += '.exe'; | | 953 | + } | | 954 | + return path.join(path.dirname(process.execPath), binary); | | 955 | +} | | 956 | + | 948 | 957 | const common = { | 949 | 958 | allowGlobals, | 950 | 959 | buildType, | @@ -990,6 +999,7 @@ const common = { | 990 | 999 | printSkipMessage, | 991 | 1000 | pwdCommand, | 992 | 1001 | requireNoPackageJSONAbove, | | 1002 | + resolveBuiltBinary, | 993 | 1003 | runWithInvalidFD, | 994 | 1004 | skip, | 995 | 1005 | skipIf32Bits, | @@ -998,6 +1008,7 @@ const common = { | 998 | 1008 | skipIfSQLiteMissing, | 999 | 1009 | spawnPromisified, | 1000 | 1010 | sleepSync, | | 1011 | + usesSharedLibrary, | 1001 | 1012 |
| 1002 | 1013 | get enoughTestMem() { | 1003 | 1014 | return require('os').totalmem() > 0x70000000; /* 1.75 Gb */ | |
Collapse file Copy file name to clipboard +58Lines changed: 58 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 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 | +} |
Collapse file Copy file name to clipboardExpand all lines: test/embedding/test-embedding.js +1-9Lines changed: 1 addition & 9 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -8,22 +8,14 @@ const { | 8 | 8 | spawnSyncAndExit, | 9 | 9 | spawnSyncAndExitWithoutError, | 10 | 10 | } = require('../common/child_process'); | 11 | | -const path = require('path'); | 12 | 11 | const fs = require('fs'); | 13 | 12 | const os = require('os'); | 14 | 13 |
| 15 | 14 | tmpdir.refresh(); | 16 | 15 | common.allowGlobals(global.require); | 17 | 16 | common.allowGlobals(global.embedVars); | 18 | 17 |
| 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'); | 27 | 19 |
| 28 | 20 | spawnSyncAndAssert( | 29 | 21 | binary, | |
Collapse file Copy file name to clipboard +25Lines changed: 25 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 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 | +}); |
|