Skip to content

Commit 1881b28

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 1881b28

File tree

10 files changed

+98
-63
lines changed

10 files changed

+98
-63
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: 52 additions & 28 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):
@@ -102,6 +104,14 @@ def compiler_for(filename, force_c=False):
102104
return EMCC
103105

104106

107+
def get_nodejs(all_engines=None):
108+
if not all_engines:
109+
all_engines = config.JS_ENGINES
110+
if config.NODE_JS_TEST and config.NODE_JS_TEST in all_engines:
111+
return config.NODE_JS_TEST
112+
return None
113+
114+
105115
# Generic decorator that calls a function named 'condition' on the test class and
106116
# skips the test if that function returns true
107117
def skip_if(func, condition, explanation='', negate=False):
@@ -317,7 +327,8 @@ def metafunc(self, with_bigint):
317327
if self.get_setting('WASM_BIGINT') is not None:
318328
self.skipTest('redundant in bigint test config')
319329
self.set_setting('WASM_BIGINT')
320-
self.node_args += shared.node_bigint_flags()
330+
nodejs = self.require_node()
331+
self.node_args += shared.node_bigint_flags(nodejs)
321332
f(self)
322333
else:
323334
f(self)
@@ -381,7 +392,8 @@ def metafunc(self, standalone):
381392
# if we are impure, disallow all wasm engines
382393
if impure:
383394
self.wasm_engines = []
384-
self.node_args += shared.node_bigint_flags()
395+
nodejs = self.require_node()
396+
self.node_args += shared.node_bigint_flags(nodejs)
385397
func(self)
386398

387399
metafunc._parameterize = {'': (False,),
@@ -606,19 +618,25 @@ def require_v8(self):
606618
self.require_engine(config.V8_ENGINE)
607619
self.emcc_args.append('-sENVIRONMENT=shell')
608620

621+
def get_nodejs(self):
622+
return get_nodejs(self.js_engines)
623+
609624
def require_node(self):
610-
if not config.NODE_JS or config.NODE_JS not in config.JS_ENGINES:
625+
nodejs = self.get_nodejs()
626+
if not nodejs:
611627
if 'EMTEST_SKIP_NODE' in os.environ:
612628
self.skipTest('test requires node and EMTEST_SKIP_NODE is set')
613629
else:
614630
self.fail('node required to run this test. Use EMTEST_SKIP_NODE to skip')
615-
self.require_engine(config.NODE_JS)
631+
self.require_engine(nodejs)
632+
return nodejs
616633

617634
def require_node_canary(self):
618-
if config.NODE_JS or config.NODE_JS in config.JS_ENGINES:
619-
version = shared.check_node_version()
635+
nodejs = self.get_nodejs()
636+
if nodejs:
637+
version = shared.get_node_version(nodejs)
620638
if version >= (20, 0, 0):
621-
self.require_engine(config.NODE_JS)
639+
self.require_engine(nodejs)
622640
return
623641

624642
if 'EMTEST_SKIP_NODE_CANARY' in os.environ:
@@ -635,10 +653,11 @@ def require_engine(self, engine):
635653
self.wasm_engines = []
636654

637655
def require_wasm64(self):
638-
if config.NODE_JS and config.NODE_JS in self.js_engines:
639-
version = shared.check_node_version()
656+
nodejs = self.get_nodejs()
657+
if nodejs:
658+
version = shared.get_node_version(nodejs)
640659
if version >= (16, 0, 0):
641-
self.js_engines = [config.NODE_JS]
660+
self.js_engines = [nodejs]
642661
self.node_args += shared.node_memory64_flags()
643662
return
644663

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

656675
def require_simd(self):
657-
if config.NODE_JS and config.NODE_JS in self.js_engines:
658-
version = shared.check_node_version()
676+
nodejs = self.get_nodejs()
677+
if nodejs:
678+
version = shared.get_node_version(nodejs)
659679
if version >= (16, 0, 0):
660-
self.js_engines = [config.NODE_JS]
680+
self.js_engines = [nodejs]
661681
return
662682

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

673693
def require_wasm_eh(self):
674-
if config.NODE_JS and config.NODE_JS in self.js_engines:
675-
version = shared.check_node_version()
694+
nodejs = self.get_nodejs()
695+
if nodejs:
696+
version = shared.get_node_version(nodejs)
676697
if version >= (17, 0, 0):
677-
self.js_engines = [config.NODE_JS]
698+
self.js_engines = [nodejs]
678699
return
679700

680701
if config.V8_ENGINE and config.V8_ENGINE in self.js_engines:
@@ -701,12 +722,13 @@ def require_jspi(self):
701722
return
702723

703724
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()
725+
nodejs = self.get_nodejs()
726+
if nodejs:
727+
version = shared.get_node_version(nodejs)
706728
# Support for JSPI came earlier than 19, but 19 is what currently works
707729
# with emscripten's implementation.
708730
if version >= (19, 0, 0):
709-
self.js_engines = [config.NODE_JS]
731+
self.js_engines = [nodejs]
710732
self.node_args += exp_args
711733
return
712734

@@ -726,8 +748,9 @@ def setup_node_pthreads(self):
726748
self.emcc_args += ['-Wno-pthreads-mem-growth', '-pthread']
727749
if self.get_setting('MINIMAL_RUNTIME'):
728750
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()
751+
nodejs = self.get_nodejs()
752+
self.js_engines = [nodejs]
753+
self.node_args += shared.node_pthread_flags(nodejs)
731754

732755
def uses_memory_init_file(self):
733756
if self.get_setting('SIDE_MODULE') or (self.is_wasm() and not self.get_setting('WASM2JS')):
@@ -753,13 +776,15 @@ def setUpClass(cls):
753776

754777
def setUp(self):
755778
super().setUp()
779+
self.js_engines = config.JS_ENGINES.copy()
756780
self.settings_mods = {}
757781
self.emcc_args = ['-Wclosure', '-Werror', '-Wno-limited-postlink-optimizations']
758782
self.ldflags = []
759783
# Increate stack trace limit to maximise usefulness of test failure reports
760784
self.node_args = ['--stack-trace-limit=50']
761785

762-
node_version = shared.check_node_version()
786+
nodejs = self.get_nodejs()
787+
node_version = shared.get_node_version(nodejs)
763788
if node_version:
764789
if node_version < (11, 0, 0):
765790
self.node_args.append('--unhandled-rejections=strict')
@@ -787,11 +812,10 @@ def setUp(self):
787812
self.env = {}
788813
self.temp_files_before_run = []
789814
self.uses_es6 = False
790-
self.js_engines = config.JS_ENGINES.copy()
791815
self.required_engine = None
792816
self.wasm_engines = config.WASM_ENGINES.copy()
793817
self.use_all_engines = EMTEST_ALL_ENGINES
794-
if self.js_engines[0] != config.NODE_JS:
818+
if self.js_engines[0] != config.NODE_JS_TEST:
795819
# If our primary JS engine is something other than node then enable
796820
# shell support.
797821
default_envs = 'web,webview,worker,node'
@@ -935,7 +959,7 @@ def verify_es5(self, filename):
935959
# use --quiet once its available
936960
# See: https://github.com/dollarshaveclub/es-check/pull/126/
937961
es_check_env = os.environ.copy()
938-
es_check_env['PATH'] = os.path.dirname(config.NODE_JS[0]) + os.pathsep + es_check_env['PATH']
962+
es_check_env['PATH'] = os.path.dirname(config.NODE_JS_TEST[0]) + os.pathsep + es_check_env['PATH']
939963
inputfile = os.path.abspath(filename)
940964
# For some reason es-check requires unix paths, even on windows
941965
if WINDOWS:
@@ -1091,7 +1115,7 @@ def run_js(self, filename, engine=None, args=None,
10911115
timeout_error = None
10921116
if not engine:
10931117
engine = self.js_engines[0]
1094-
if engine == config.NODE_JS:
1118+
if engine == config.NODE_JS_TEST:
10951119
engine = engine + self.node_args
10961120
if engine == config.V8_ENGINE:
10971121
engine = engine + self.v8_args
@@ -2103,8 +2127,8 @@ def btest(self, filename, expected=None, reference=None,
21032127
if not isinstance(expected, list):
21042128
expected = [expected]
21052129
if EMTEST_BROWSER == 'node':
2106-
self.require_node()
2107-
self.node_args += shared.node_pthread_flags()
2130+
nodejs = self.require_node()
2131+
self.node_args += shared.node_pthread_flags(nodejs)
21082132
output = self.run_js('test.js')
21092133
self.assertContained('RESULT: ' + expected[0], output)
21102134
else:

test/test_core.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from common import env_modify, with_env_modify, disabled, flaky, node_pthreads, also_with_wasm_bigint
3030
from common import read_file, read_binary, requires_v8, requires_node, requires_node_canary, compiler_for, crossplatform
3131
from common import with_both_sjlj, also_with_standalone_wasm, can_do_standalone
32-
from common import NON_ZERO, WEBIDL_BINDER, EMBUILDER, PYTHON
32+
from common import NON_ZERO, WEBIDL_BINDER, EMBUILDER, PYTHON, get_nodejs
3333
import clang_native
3434

3535
# decorators for limiting which modes a test can run in
@@ -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')
@@ -10047,7 +10044,7 @@ def setUp(self):
1004710044
# MEMORY64=2, or "lowered"
1004810045
wasm64l = make_run('wasm64l', emcc_args=['-O1', '-Wno-experimental', '--profiling-funcs'],
1004910046
settings={'MEMORY64': 2},
10050-
node_args=shared.node_bigint_flags())
10047+
node_args=shared.node_bigint_flags(get_nodejs()))
1005110048

1005210049
lto0 = make_run('lto0', emcc_args=['-flto', '-O0'])
1005310050
lto1 = make_run('lto1', emcc_args=['-flto', '-O1'])
@@ -10084,7 +10081,7 @@ def setUp(self):
1008410081
core2ss = make_run('core2ss', emcc_args=['-O2'], settings={'STACK_OVERFLOW_CHECK': 2})
1008510082

1008610083
bigint = make_run('bigint', emcc_args=['--profiling-funcs'], settings={'WASM_BIGINT': 1},
10087-
node_args=shared.node_bigint_flags())
10084+
node_args=shared.node_bigint_flags(get_nodejs()))
1008810085

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

test/test_other.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7480,7 +7480,7 @@ def test_i64_return_value(self, args, bind_js):
74807480
''')
74817481

74827482
# Run the test and confirm the output is as expected.
7483-
self.node_args += shared.node_bigint_flags()
7483+
self.node_args += shared.node_bigint_flags(self.get_nodefs())
74847484
out = self.run_js('testrun.js')
74857485
self.assertContained('''\
74867486
input = 0xaabbccdd11223344
@@ -7720,7 +7720,7 @@ def test_override_js_execution_environment(self):
77207720
for engine in config.JS_ENGINES:
77217721
if engine == config.V8_ENGINE:
77227722
continue # ban v8, weird failures
7723-
actual = 'NODE' if engine == config.NODE_JS else 'SHELL'
7723+
actual = 'NODE' if engine == config.NODE_JS_TEST else 'SHELL'
77247724
print(env, actual, engine)
77257725
module = {'ENVIRONMENT': env}
77267726
if env != actual:
@@ -9831,7 +9831,7 @@ def test_system_node_js(self):
98319831
def test_node_eval(self):
98329832
self.run_process([EMCC, '-sENVIRONMENT=node', test_file('hello_world.c'), '-o', 'a.js', '-O3'])
98339833
js = read_file('a.js')
9834-
ret = self.run_process(config.NODE_JS + ['-e', js], stdout=PIPE).stdout
9834+
ret = self.run_process(config.NODE_JS_TEST + ['-e', js], stdout=PIPE).stdout
98359835
self.assertContained('hello, world!', ret)
98369836

98379837
def test_is_bitcode(self):
@@ -12930,7 +12930,7 @@ def test_wasmfs_readfile(self):
1293012930
def test_wasmfs_readfile_bigint(self):
1293112931
self.set_setting('FORCE_FILESYSTEM')
1293212932
self.set_setting('WASM_BIGINT')
12933-
self.node_args += shared.node_bigint_flags()
12933+
self.node_args += shared.node_bigint_flags(self.get_nodejs())
1293412934
self.do_run_in_out_file_test('wasmfs/wasmfs_readfile.c')
1293512935

1293612936
def test_wasmfs_jsfile(self):
@@ -13201,7 +13201,7 @@ def test_clock_nanosleep(self):
1320113201

1320213202
# Tests the internal test suite of tools/unsafe_optimizations.js
1320313203
def test_unsafe_optimizations(self):
13204-
self.run_process(config.NODE_JS + [path_from_root('tools', 'unsafe_optimizations.js'), '--test'])
13204+
self.run_process(config.NODE_JS_TEST + [path_from_root('tools', 'unsafe_optimizations.js'), '--test'])
1320513205

1320613206
@requires_v8
1320713207
def test_extended_const(self):
@@ -13694,7 +13694,7 @@ def test_missing_struct_info(self):
1369413694
def run_wasi_test_suite_test(self, name):
1369513695
if not os.path.exists(path_from_root('test/third_party/wasi-test-suite')):
1369613696
self.fail('wasi-testsuite not found; run `git submodule update --init`')
13697-
self.node_args += shared.node_bigint_flags()
13697+
self.node_args += shared.node_bigint_flags(self.get_nodejs())
1369813698
wasm = path_from_root('test', 'third_party', 'wasi-test-suite', name + '.wasm')
1369913699
with open(path_from_root('test', 'third_party', 'wasi-test-suite', name + '.json')) as f:
1370013700
config = json.load(f)

0 commit comments

Comments
 (0)