Skip to content

Commit 365bcb9

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 356bf1c commit 365bcb9

File tree

9 files changed

+90
-53
lines changed

9 files changed

+90
-53
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: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,16 @@ def compiler_for(filename, force_c=False):
102102
return EMCC
103103

104104

105+
def get_nodejs(all_engines=None):
106+
if not all_engines:
107+
all_engines = config.JS_ENGINES
108+
if config.NODE_JS_TEST and config.NODE_JS_TEST in all_engines:
109+
return config.NODE_JS_TEST
110+
if config.NODE_JS and config.NODE_JS in all_engines:
111+
return config.NODE_JS
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_nodejs()
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_vession(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,7 +812,6 @@ 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
@@ -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: 8 additions & 8 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(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(get_nodejs())
22912291
self.do_core_test('test_em_js_i64.c')
22922292

22932293
def test_em_js_address_taken(self):
@@ -7867,14 +7867,14 @@ def test_embind_dynamic_initialization(self):
78677867
def test_embind_i64_val(self):
78687868
self.set_setting('WASM_BIGINT')
78697869
self.emcc_args += ['-lembind']
7870-
self.node_args += shared.node_bigint_flags()
7870+
self.node_args += shared.node_bigint_flags(get_nodejs())
78717871
self.do_run_in_out_file_test('embind/test_i64_val.cpp', assert_identical=True)
78727872

78737873
@no_wasm2js('wasm_bigint')
78747874
def test_embind_i64_binding(self):
78757875
self.set_setting('WASM_BIGINT')
78767876
self.emcc_args += ['-lembind']
7877-
self.node_args += shared.node_bigint_flags()
7877+
self.node_args += shared.node_bigint_flags(get_nodejs())
78787878
self.do_run_in_out_file_test('embind/test_i64_binding.cpp', assert_identical=True)
78797879

78807880
def test_embind_no_rtti(self):
@@ -9888,7 +9888,7 @@ def test_externref(self):
98889888
@no_wasm2js('wasm2js does not support reference types')
98899889
def test_externref_emjs(self, dynlink):
98909890
self.emcc_args += ['-mreference-types']
9891-
self.node_args += shared.node_reference_types_flags()
9891+
self.node_args += shared.node_reference_types_flags(get_nodejs())
98929892
if dynlink:
98939893
self.set_setting('MAIN_MODULE', 2)
98949894
self.do_core_test('test_externref_emjs.c')
@@ -10047,7 +10047,7 @@ def setUp(self):
1004710047
# MEMORY64=2, or "lowered"
1004810048
wasm64l = make_run('wasm64l', emcc_args=['-O1', '-Wno-experimental', '--profiling-funcs'],
1004910049
settings={'MEMORY64': 2},
10050-
node_args=shared.node_bigint_flags())
10050+
node_args=shared.node_bigint_flags(get_nodejs()))
1005110051

1005210052
lto0 = make_run('lto0', emcc_args=['-flto', '-O0'])
1005310053
lto1 = make_run('lto1', emcc_args=['-flto', '-O1'])
@@ -10084,7 +10084,7 @@ def setUp(self):
1008410084
core2ss = make_run('core2ss', emcc_args=['-O2'], settings={'STACK_OVERFLOW_CHECK': 2})
1008510085

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

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

test/test_other.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
from common import compiler_for, EMBUILDER, requires_v8, requires_node, requires_wasm64, requires_node_canary
3636
from common import requires_wasm_eh, crossplatform, with_both_sjlj, also_with_standalone_wasm
3737
from common import also_with_minimal_runtime, also_with_wasm_bigint, also_with_wasm64, flaky
38-
from common import EMTEST_BUILD_VERBOSE, PYTHON, WEBIDL_BINDER
38+
from common import EMTEST_BUILD_VERBOSE, PYTHON, WEBIDL_BINDER, get_nodejs
3939
from tools import shared, building, utils, response_file, cache
4040
from tools.utils import read_file, write_file, delete_file, read_binary
4141
import common
@@ -7478,7 +7478,7 @@ def test_i64_return_value(self, args, bind_js):
74787478
''')
74797479

74807480
# Run the test and confirm the output is as expected.
7481-
self.node_args += shared.node_bigint_flags()
7481+
self.node_args += shared.node_bigint_flags(get_nodefs())
74827482
out = self.run_js('testrun.js')
74837483
self.assertContained('''\
74847484
input = 0xaabbccdd11223344
@@ -12928,7 +12928,7 @@ def test_wasmfs_readfile(self):
1292812928
def test_wasmfs_readfile_bigint(self):
1292912929
self.set_setting('FORCE_FILESYSTEM')
1293012930
self.set_setting('WASM_BIGINT')
12931-
self.node_args += shared.node_bigint_flags()
12931+
self.node_args += shared.node_bigint_flags(get_nodejs())
1293212932
self.do_run_in_out_file_test('wasmfs/wasmfs_readfile.c')
1293312933

1293412934
def test_wasmfs_jsfile(self):
@@ -13692,7 +13692,7 @@ def test_missing_struct_info(self):
1369213692
def run_wasi_test_suite_test(self, name):
1369313693
if not os.path.exists(path_from_root('test/third_party/wasi-test-suite')):
1369413694
self.fail('wasi-testsuite not found; run `git submodule update --init`')
13695-
self.node_args += shared.node_bigint_flags()
13695+
self.node_args += shared.node_bigint_flags(get_nodejs())
1369613696
wasm = path_from_root('test', 'third_party', 'wasi-test-suite', name + '.wasm')
1369713697
with open(path_from_root('test', 'third_party', 'wasi-test-suite', name + '.json')) as f:
1369813698
config = json.load(f)

tools/config.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
# See parse_config_file below.
2121
EMSCRIPTEN_ROOT = __rootpath__
2222
NODE_JS = None
23+
NODE_JS_TEST = None
2324
BINARYEN_ROOT = None
2425
SPIDERMONKEY_ENGINE = None
2526
V8_ENGINE: Optional[List[str]] = None
@@ -61,7 +62,7 @@ def root_is_writable():
6162

6263
def normalize_config_settings():
6364
global CACHE, PORTS, LLVM_ADD_VERSION, CLANG_ADD_VERSION, CLOSURE_COMPILER
64-
global NODE_JS, V8_ENGINE, JS_ENGINES, SPIDERMONKEY_ENGINE, WASM_ENGINES
65+
global NODE_JS, NODE_JS_TEST, V8_ENGINE, JS_ENGINES, SPIDERMONKEY_ENGINE, WASM_ENGINES
6566

6667
# EM_CONFIG stuff
6768
if not JS_ENGINES:
@@ -74,6 +75,7 @@ def normalize_config_settings():
7475
new_spidermonkey += ['-w']
7576
SPIDERMONKEY_ENGINE = fix_js_engine(SPIDERMONKEY_ENGINE, new_spidermonkey)
7677
NODE_JS = fix_js_engine(NODE_JS, listify(NODE_JS))
78+
NODE_JS_TEST = fix_js_engine(NODE_JS_TEST, listify(NODE_JS_TEST))
7779
V8_ENGINE = fix_js_engine(V8_ENGINE, listify(V8_ENGINE))
7880
JS_ENGINES = [listify(engine) for engine in JS_ENGINES]
7981
WASM_ENGINES = [listify(engine) for engine in WASM_ENGINES]
@@ -120,6 +122,7 @@ def parse_config_file():
120122

121123
CONFIG_KEYS = (
122124
'NODE_JS',
125+
'NODE_JS_TEST',
123126
'BINARYEN_ROOT',
124127
'SPIDERMONKEY_ENGINE',
125128
'V8_ENGINE',

tools/gen_struct_info.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
sys.path.insert(0, __rootdir__)
6969

7070
from tools import building
71+
from tools import config
7172
from tools import shared
7273
from tools import system_libs
7374
from tools import utils
@@ -280,7 +281,7 @@ def inspect_headers(headers, cflags):
280281
show('Calling generated program... ' + js_file[1])
281282
args = []
282283
if settings.MEMORY64:
283-
args += shared.node_bigint_flags()
284+
args += shared.node_bigint_flags(config.NODE_JS)
284285
info = shared.run_js_tool(js_file[1], node_args=args, stdout=shared.PIPE).splitlines()
285286

286287
if not DEBUG:

0 commit comments

Comments
 (0)