Skip to content

Commit db7c53e

Browse files
committed
Support separate version of Node.js for running tests. NFC
This is needed for #20551 so that we can continue to run tests under versions of node that are too old to run the compiler.
1 parent 0f15c2a commit db7c53e

File tree

10 files changed

+101
-67
lines changed

10 files changed

+101
-67
lines changed

.circleci/config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ commands:
9898
wget https://nodejs.org/dist/v${version}/node-v${version}-linux-x64.tar.xz
9999
fi
100100
tar xf node-v${version}-linux-x64.tar.xz
101-
echo "NODE_JS = [os.path.expanduser('~/node-v${version}-linux-x64/bin/node')]" >> ~/emsdk/.emscripten
102-
echo "JS_ENGINES = [NODE_JS]" >> ~/emsdk/.emscripten
101+
echo "NODE_JS_TEST = [os.path.expanduser('~/node-v${version}-linux-x64/bin/node')]" >> ~/emsdk/.emscripten
102+
echo "JS_ENGINES = [NODE_JS_TEST]" >> ~/emsdk/.emscripten
103103
echo "if os.path.exists(V8_ENGINE[0]): JS_ENGINES.append(V8_ENGINE)" >> ~/emsdk/.emscripten
104104
cat ~/emsdk/.emscripten
105105
echo "export PATH=\"$HOME/node-v${version}-linux-x64/bin:\$PATH\"" >> $BASH_ENV

emcc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,7 @@ def make_js_executable(script):
748748
if settings.MEMORY64 == 1:
749749
cmd += shared.node_memory64_flags()
750750
elif settings.WASM_BIGINT:
751-
cmd += shared.node_bigint_flags()
751+
cmd += shared.node_bigint_flags(config.NODE_JS)
752752
if len(cmd) > 1 or not os.path.isabs(cmd[0]):
753753
# Using -S (--split-string) here means that arguments to the executable are
754754
# correctly parsed. We don't do this by default because old versions of env

emcmake.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def has_substr(args, substr):
3939
node_js = [config.NODE_JS[0]]
4040
# In order to allow cmake to run code built with pthreads we need to pass
4141
# some extra flags to node.
42-
node_js += shared.node_pthread_flags()
42+
node_js += shared.node_pthread_flags(config.NODE_JS)
4343
node_js = ';'.join(node_js)
4444
# See https://github.com/emscripten-core/emscripten/issues/15522
4545
args.append(f'-DCMAKE_CROSSCOMPILING_EMULATOR={node_js}')

test/common.py

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@
8383
WASM_DIS = Path(building.get_binaryen_bin(), 'wasm-dis')
8484
LLVM_OBJDUMP = os.path.expanduser(shared.build_llvm_tool_path(shared.exe_suffix('llvm-objdump')))
8585
PYTHON = sys.executable
86+
if not config.NODE_JS_TEST:
87+
config.NODE_JS_TEST = config.NODE_JS
8688

8789

8890
def test_file(*path_components):
@@ -317,7 +319,8 @@ def metafunc(self, with_bigint):
317319
if self.get_setting('WASM_BIGINT') is not None:
318320
self.skipTest('redundant in bigint test config')
319321
self.set_setting('WASM_BIGINT')
320-
self.node_args += shared.node_bigint_flags()
322+
nodejs = self.require_node()
323+
self.node_args += shared.node_bigint_flags(nodejs)
321324
f(self)
322325
else:
323326
f(self)
@@ -381,7 +384,8 @@ def metafunc(self, standalone):
381384
# if we are impure, disallow all wasm engines
382385
if impure:
383386
self.wasm_engines = []
384-
self.node_args += shared.node_bigint_flags()
387+
nodejs = self.require_node()
388+
self.node_args += shared.node_bigint_flags(nodejs)
385389
func(self)
386390

387391
metafunc._parameterize = {'': (False,),
@@ -606,19 +610,27 @@ def require_v8(self):
606610
self.require_engine(config.V8_ENGINE)
607611
self.emcc_args.append('-sENVIRONMENT=shell')
608612

613+
def get_nodejs(self):
614+
if config.NODE_JS_TEST not in self.js_engines:
615+
return None
616+
return config.NODE_JS_TEST
617+
609618
def require_node(self):
610-
if not config.NODE_JS or config.NODE_JS not in config.JS_ENGINES:
619+
nodejs = self.get_nodejs()
620+
if not nodejs:
611621
if 'EMTEST_SKIP_NODE' in os.environ:
612622
self.skipTest('test requires node and EMTEST_SKIP_NODE is set')
613623
else:
614624
self.fail('node required to run this test. Use EMTEST_SKIP_NODE to skip')
615-
self.require_engine(config.NODE_JS)
625+
self.require_engine(nodejs)
626+
return nodejs
616627

617628
def require_node_canary(self):
618-
if config.NODE_JS or config.NODE_JS in config.JS_ENGINES:
619-
version = shared.check_node_version()
629+
nodejs = self.get_nodejs()
630+
if nodejs:
631+
version = shared.get_node_version(nodejs)
620632
if version >= (20, 0, 0):
621-
self.require_engine(config.NODE_JS)
633+
self.require_engine(nodejs)
622634
return
623635

624636
if 'EMTEST_SKIP_NODE_CANARY' in os.environ:
@@ -635,10 +647,11 @@ def require_engine(self, engine):
635647
self.wasm_engines = []
636648

637649
def require_wasm64(self):
638-
if config.NODE_JS and config.NODE_JS in self.js_engines:
639-
version = shared.check_node_version()
650+
nodejs = self.get_nodejs()
651+
if nodejs:
652+
version = shared.get_node_version(nodejs)
640653
if version >= (16, 0, 0):
641-
self.js_engines = [config.NODE_JS]
654+
self.js_engines = [nodejs]
642655
self.node_args += shared.node_memory64_flags()
643656
return
644657

@@ -654,10 +667,11 @@ def require_wasm64(self):
654667
self.fail('either d8 or node >= 16 required to run wasm64 tests. Use EMTEST_SKIP_WASM64 to skip')
655668

656669
def require_simd(self):
657-
if config.NODE_JS and config.NODE_JS in self.js_engines:
658-
version = shared.check_node_version()
670+
nodejs = self.get_nodejs()
671+
if nodejs:
672+
version = shared.get_node_version(nodejs)
659673
if version >= (16, 0, 0):
660-
self.js_engines = [config.NODE_JS]
674+
self.js_engines = [nodejs]
661675
return
662676

663677
if config.V8_ENGINE and config.V8_ENGINE in self.js_engines:
@@ -671,10 +685,11 @@ def require_simd(self):
671685
self.fail('either d8 or node >= 16 required to run wasm64 tests. Use EMTEST_SKIP_SIMD to skip')
672686

673687
def require_wasm_eh(self):
674-
if config.NODE_JS and config.NODE_JS in self.js_engines:
675-
version = shared.check_node_version()
688+
nodejs = self.get_nodejs()
689+
if nodejs:
690+
version = shared.get_node_version(nodejs)
676691
if version >= (17, 0, 0):
677-
self.js_engines = [config.NODE_JS]
692+
self.js_engines = [nodejs]
678693
return
679694

680695
if config.V8_ENGINE and config.V8_ENGINE in self.js_engines:
@@ -701,12 +716,13 @@ def require_jspi(self):
701716
return
702717

703718
exp_args = ['--experimental-wasm-stack-switching', '--experimental-wasm-type-reflection']
704-
if config.NODE_JS and config.NODE_JS in self.js_engines:
705-
version = shared.check_node_version()
719+
nodejs = self.get_nodejs()
720+
if nodejs:
721+
version = shared.get_node_version(nodejs)
706722
# Support for JSPI came earlier than 19, but 19 is what currently works
707723
# with emscripten's implementation.
708724
if version >= (19, 0, 0):
709-
self.js_engines = [config.NODE_JS]
725+
self.js_engines = [nodejs]
710726
self.node_args += exp_args
711727
return
712728

@@ -726,8 +742,9 @@ def setup_node_pthreads(self):
726742
self.emcc_args += ['-Wno-pthreads-mem-growth', '-pthread']
727743
if self.get_setting('MINIMAL_RUNTIME'):
728744
self.skipTest('node pthreads not yet supported with MINIMAL_RUNTIME')
729-
self.js_engines = [config.NODE_JS]
730-
self.node_args += shared.node_pthread_flags()
745+
nodejs = self.get_nodejs()
746+
self.js_engines = [nodejs]
747+
self.node_args += shared.node_pthread_flags(nodejs)
731748

732749
def uses_memory_init_file(self):
733750
if self.get_setting('SIDE_MODULE') or (self.is_wasm() and not self.get_setting('WASM2JS')):
@@ -753,14 +770,16 @@ def setUpClass(cls):
753770

754771
def setUp(self):
755772
super().setUp()
773+
self.js_engines = config.JS_ENGINES.copy()
756774
self.settings_mods = {}
757775
self.emcc_args = ['-Wclosure', '-Werror', '-Wno-limited-postlink-optimizations']
758776
self.ldflags = []
759777
# Increate stack trace limit to maximise usefulness of test failure reports
760778
self.node_args = ['--stack-trace-limit=50']
761779

762-
node_version = shared.check_node_version()
763-
if node_version:
780+
nodejs = self.get_nodejs()
781+
if nodejs:
782+
node_version = shared.get_node_version(nodejs)
764783
if node_version < (11, 0, 0):
765784
self.node_args.append('--unhandled-rejections=strict')
766785
self.node_args.append('--experimental-wasm-se')
@@ -787,11 +806,10 @@ def setUp(self):
787806
self.env = {}
788807
self.temp_files_before_run = []
789808
self.uses_es6 = False
790-
self.js_engines = config.JS_ENGINES.copy()
791809
self.required_engine = None
792810
self.wasm_engines = config.WASM_ENGINES.copy()
793811
self.use_all_engines = EMTEST_ALL_ENGINES
794-
if self.js_engines[0] != config.NODE_JS:
812+
if self.js_engines[0] != config.NODE_JS_TEST:
795813
# If our primary JS engine is something other than node then enable
796814
# shell support.
797815
default_envs = 'web,webview,worker,node'
@@ -935,7 +953,7 @@ def verify_es5(self, filename):
935953
# use --quiet once its available
936954
# See: https://github.com/dollarshaveclub/es-check/pull/126/
937955
es_check_env = os.environ.copy()
938-
es_check_env['PATH'] = os.path.dirname(config.NODE_JS[0]) + os.pathsep + es_check_env['PATH']
956+
es_check_env['PATH'] = os.path.dirname(config.NODE_JS_TEST[0]) + os.pathsep + es_check_env['PATH']
939957
inputfile = os.path.abspath(filename)
940958
# For some reason es-check requires unix paths, even on windows
941959
if WINDOWS:
@@ -1091,7 +1109,7 @@ def run_js(self, filename, engine=None, args=None,
10911109
timeout_error = None
10921110
if not engine:
10931111
engine = self.js_engines[0]
1094-
if engine == config.NODE_JS:
1112+
if engine == config.NODE_JS_TEST:
10951113
engine = engine + self.node_args
10961114
if engine == config.V8_ENGINE:
10971115
engine = engine + self.v8_args
@@ -2103,8 +2121,8 @@ def btest(self, filename, expected=None, reference=None,
21032121
if not isinstance(expected, list):
21042122
expected = [expected]
21052123
if EMTEST_BROWSER == 'node':
2106-
self.require_node()
2107-
self.node_args += shared.node_pthread_flags()
2124+
nodejs = self.require_node()
2125+
self.node_args += shared.node_pthread_flags(nodejs)
21082126
output = self.run_js('test.js')
21092127
self.assertContained('RESULT: ' + expected[0], output)
21102128
else:

test/test_core.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ def test_i64_varargs(self):
526526
def test_i64_invoke_bigint(self):
527527
self.set_setting('WASM_BIGINT')
528528
self.emcc_args += ['-fexceptions']
529-
self.node_args += shared.node_bigint_flags()
529+
self.node_args += shared.node_bigint_flags(self.get_nodejs())
530530
self.do_core_test('test_i64_invoke_bigint.cpp')
531531

532532
def test_vararg_copy(self):
@@ -2287,7 +2287,7 @@ def test_em_js_i64(self):
22872287
self.assertContained('emcc: error: using 64-bit arguments in EM_JS function without WASM_BIGINT is not yet fully supported: `foo`', err)
22882288

22892289
self.set_setting('WASM_BIGINT')
2290-
self.node_args += shared.node_bigint_flags()
2290+
self.node_args += shared.node_bigint_flags(self.get_nodejs())
22912291
self.do_core_test('test_em_js_i64.c')
22922292

22932293
def test_em_js_address_taken(self):
@@ -6392,9 +6392,6 @@ def test_unistd_io(self):
63926392
self.emcc_args = orig_compiler_opts + ['-D' + fs]
63936393
if fs == 'NODEFS':
63946394
self.emcc_args += ['-lnodefs.js']
6395-
if config.NODE_JS not in config.JS_ENGINES:
6396-
# NODEFS requires node
6397-
continue
63986395
self.require_node()
63996396
if self.get_setting('WASMFS'):
64006397
if fs == 'NODEFS':
@@ -7867,14 +7864,14 @@ def test_embind_dynamic_initialization(self):
78677864
def test_embind_i64_val(self):
78687865
self.set_setting('WASM_BIGINT')
78697866
self.emcc_args += ['-lembind']
7870-
self.node_args += shared.node_bigint_flags()
7867+
self.node_args += shared.node_bigint_flags(self.get_nodejs())
78717868
self.do_run_in_out_file_test('embind/test_i64_val.cpp', assert_identical=True)
78727869

78737870
@no_wasm2js('wasm_bigint')
78747871
def test_embind_i64_binding(self):
78757872
self.set_setting('WASM_BIGINT')
78767873
self.emcc_args += ['-lembind']
7877-
self.node_args += shared.node_bigint_flags()
7874+
self.node_args += shared.node_bigint_flags(self.get_nodejs())
78787875
self.do_run_in_out_file_test('embind/test_i64_binding.cpp', assert_identical=True)
78797876

78807877
def test_embind_no_rtti(self):
@@ -8915,7 +8912,7 @@ def test(assert_returncode=0):
89158912
# set us to test in just this engine
89168913
self.require_engine(engine)
89178914
# tell the compiler to build with just that engine
8918-
if engine == config.NODE_JS:
8915+
if engine == config.NODE_JS_TEST:
89198916
right = 'node'
89208917
wrong = 'shell'
89218918
else:
@@ -9888,7 +9885,7 @@ def test_externref(self):
98889885
@no_wasm2js('wasm2js does not support reference types')
98899886
def test_externref_emjs(self, dynlink):
98909887
self.emcc_args += ['-mreference-types']
9891-
self.node_args += shared.node_reference_types_flags()
9888+
self.node_args += shared.node_reference_types_flags(self.get_nodejs())
98929889
if dynlink:
98939890
self.set_setting('MAIN_MODULE', 2)
98949891
self.do_core_test('test_externref_emjs.c')
@@ -9961,7 +9958,8 @@ def test_wasm_worker_wait_async(self):
99619958
def make_run(name, emcc_args, settings=None, env=None,
99629959
require_v8=False, v8_args=None,
99639960
require_node=False, node_args=None,
9964-
require_wasm64=False):
9961+
require_wasm64=False,
9962+
init=None):
99659963
if env is None:
99669964
env = {}
99679965
if settings is None:
@@ -10009,6 +10007,9 @@ def setUp(self):
1000910007
if require_wasm64:
1001010008
self.require_wasm64()
1001110009

10010+
if init:
10011+
init(self)
10012+
1001210013
TT.setUp = setUp
1001310014

1001410015
return TT
@@ -10047,7 +10048,7 @@ def setUp(self):
1004710048
# MEMORY64=2, or "lowered"
1004810049
wasm64l = make_run('wasm64l', emcc_args=['-O1', '-Wno-experimental', '--profiling-funcs'],
1004910050
settings={'MEMORY64': 2},
10050-
node_args=shared.node_bigint_flags())
10051+
init=lambda self: shared.node_bigint_flags(self.get_nodejs()))
1005110052

1005210053
lto0 = make_run('lto0', emcc_args=['-flto', '-O0'])
1005310054
lto1 = make_run('lto1', emcc_args=['-flto', '-O1'])
@@ -10084,7 +10085,7 @@ def setUp(self):
1008410085
core2ss = make_run('core2ss', emcc_args=['-O2'], settings={'STACK_OVERFLOW_CHECK': 2})
1008510086

1008610087
bigint = make_run('bigint', emcc_args=['--profiling-funcs'], settings={'WASM_BIGINT': 1},
10087-
node_args=shared.node_bigint_flags())
10088+
init=lambda self: shared.node_bigint_flags(self.get_nodejs()))
1008810089

1008910090
# Add DEFAULT_TO_CXX=0
1009010091
strict = make_run('strict', emcc_args=[], settings={'STRICT': 1})

0 commit comments

Comments
 (0)