| # Copyright 2016 WebAssembly Community Group participants |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| import os |
| import subprocess |
| |
| from . import shared, support |
| |
| |
| def make_js_test_header(binaryen_js): |
| # common wrapper code for JS tests, waiting for binaryen.js to become ready |
| # and providing common utility used by all tests: |
| return f''' |
| import Binaryen from "{binaryen_js}"; |
| var binaryen = await Binaryen() |
| |
| // avoid stdout/stderr ordering issues in some js shells - use just stdout |
| console.warn = console.error = console.log; |
| |
| function assert(x) {{ |
| if (!x) throw Error('Test assertion failed'); |
| }} |
| ''' |
| |
| |
| def make_js_test(input_js_file, binaryen_js): |
| basename = os.path.basename(input_js_file) |
| outname = os.path.splitext(basename)[0] + '.mjs' |
| with open(outname, 'w') as f: |
| f.write(make_js_test_header(binaryen_js)) |
| test_src = open(input_js_file).read() |
| f.write(test_src) |
| return outname |
| |
| |
| def do_test_binaryen_js_with(which): |
| if not (shared.MOZJS or shared.NODEJS): |
| shared.fail_with_error('no vm to run binaryen.js tests') |
| |
| node_has_wasm = shared.NODEJS and support.node_has_webassembly(shared.NODEJS) |
| if not os.path.exists(which): |
| shared.fail_with_error('no ' + which + ' build to test') |
| |
| print('\n[ checking binaryen.js testcases (' + which + ')... ]\n') |
| |
| for s in shared.get_tests(shared.get_test_dir('binaryen.js'), ['.js']): |
| outname = make_js_test(s, which) |
| |
| def test(cmd): |
| if 'fatal' not in s: |
| out = support.run_command(cmd, stderr=subprocess.STDOUT) |
| else: |
| # expect an error - the specific error code will depend on the vm |
| out = support.run_command(cmd, stderr=subprocess.STDOUT, expected_status=None) |
| expected = open(os.path.join(shared.options.binaryen_test, 'binaryen.js', s + '.txt')).read() |
| if expected not in out: |
| shared.fail(out, expected) |
| |
| # run in all possible shells |
| if shared.MOZJS: |
| test([shared.MOZJS, '-m', outname]) |
| if shared.NODEJS: |
| test_src = open(s).read() |
| if node_has_wasm or 'WebAssembly.' not in test_src: |
| test([shared.NODEJS, outname]) |
| else: |
| print('Skipping ' + s + ' because WebAssembly might not be supported') |
| |
| |
| def update_binaryen_js_tests(): |
| if not (shared.MOZJS or shared.NODEJS): |
| print('no vm to run binaryen.js tests') |
| return |
| |
| if not os.path.exists(shared.BINARYEN_JS): |
| print('no binaryen.js build to test') |
| return |
| |
| print('\n[ checking binaryen.js testcases... ]\n') |
| node_has_wasm = shared.NODEJS and support.node_has_webassembly(shared.NODEJS) |
| for s in shared.get_tests(shared.get_test_dir('binaryen.js'), ['.js']): |
| outname = make_js_test(s, shared.BINARYEN_JS) |
| |
| def update(cmd): |
| if 'fatal' not in outname: |
| out = support.run_command(cmd, stderr=subprocess.STDOUT) |
| else: |
| # expect an error - the specific error code will depend on the vm |
| out = support.run_command(cmd, stderr=subprocess.STDOUT, expected_status=None) |
| with open(s + '.txt', 'w') as o: |
| o.write(out) |
| |
| # run in available shell |
| test_src = open(s).read() |
| if shared.MOZJS: |
| update([shared.MOZJS, '-m', outname]) |
| elif node_has_wasm or 'WebAssembly.' not in test_src: |
| update([shared.NODEJS, outname]) |
| else: |
| print('Skipping ' + s + ' because WebAssembly might not be supported') |
| |
| |
| def test_binaryen_js(): |
| do_test_binaryen_js_with(shared.BINARYEN_JS) |
| |
| |
| def test_binaryen_wasm(): |
| do_test_binaryen_js_with(shared.BINARYEN_WASM) |