Skip to content
Open
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions test/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,16 @@

import argparse
import atexit
import datetime
import fnmatch
import glob
import logging
import math
import operator
import os
import random
import re
import subprocess
import sys
import time
import unittest
Expand Down Expand Up @@ -506,6 +509,7 @@ def parse_args():
'Useful when combined with --failfast')
parser.add_argument('--force64', action='store_true')
parser.add_argument('--crossplatform-only', action='store_true')
parser.add_argument('--log-test-environment', action='store_true', help='Prints out detailed information about the current environment. Useful for adding more info to CI test runs.')
parser.add_argument('--force-browser-process-termination', action='store_true', help='If true, a fail-safe method is used to ensure that all browser processes are terminated before and after the test suite run. Note that this option will terminate all browser processes, not just those launched by the harness, so will result in loss of all open browsing sessions.')
parser.add_argument('--repeat', type=int, default=1,
help='Repeat each test N times (default: 1).')
Expand Down Expand Up @@ -563,6 +567,94 @@ def cleanup_emscripten_temp():
pass


def print_repository_info(directory, repository_name):
import subprocess
current_commit = subprocess.run(['git', 'log', '-n1'], cwd=directory, stdout=subprocess.PIPE, text=True).stdout.strip()
print(f'\n{repository_name} {current_commit}\n')
local_changes = subprocess.run(['git', 'diff'], cwd=directory, stdout=subprocess.PIPE, text=True).stdout.strip()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe just remove the stdout=subprocess.PIPE so that the output goes directly to stdout?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't work for Windows at least, but enters an interactive git diff prompt.

if local_changes:
print(f'\n{local_changes}\n')


def log_test_environment():
"""Print detailed information about the current test environment. Useful for
logging test run configuration in a CI."""
print('======================== Test Setup ========================')
print(f'Test time: {datetime.datetime.now(datetime.timezone.utc).strftime("%A, %B %d, %Y %H:%M:%S %Z")}')
print(f'Python: "{sys.executable}". Version: {sys.version}')
print(f'Emscripten test runner path: "{os.path.realpath(__file__)}"')

if os.path.isdir(os.path.join(config.EMSCRIPTEN_ROOT, '.git')):
print(f'\nEmscripten repository: "{config.EMSCRIPTEN_ROOT}"')

emscripten_version = os.path.realpath(os.path.join(config.EMSCRIPTEN_ROOT, 'emscripten-version.txt'))
if os.path.isfile(emscripten_version):
print(f'emscripten-version.txt: {utils.read_file(emscripten_version).strip()}')

if os.path.isdir(os.path.join(config.EMSCRIPTEN_ROOT, '.git')):
print_repository_info(config.EMSCRIPTEN_ROOT, 'Emscripten')

print(f'EM_CONFIG: "{config.EM_CONFIG}"')
if os.path.isfile(config.EM_CONFIG):
print(f'\n{utils.read_file(config.EM_CONFIG).strip()}\n')

node_js_version = subprocess.run(config.NODE_JS + ['--version'], stdout=subprocess.PIPE, text=True).stdout.strip()
print(f'NODE_JS: {config.NODE_JS}. Version: {node_js_version}')
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We already have this available via utils.get_node_version()

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's shared.get_node_version(), but that parses the output. I think it's better in this case to output the raw version string as emitted by NODE_JS --version.


print(f'BINARYEN_ROOT: {config.BINARYEN_ROOT}')
wasm_opt_version = subprocess.run([os.path.join(config.BINARYEN_ROOT, 'bin', 'wasm-opt.exe'), '--version'], stdout=subprocess.PIPE, text=True).stdout.strip()
print(f'wasm-opt version: {wasm_opt_version}')

binaryen_git_dir = config.BINARYEN_ROOT
# Detect emsdk directory structure (build root vs source root)
if re.match(r'main_.*_64bit_binaryen', os.path.basename(binaryen_git_dir)):
binaryen_git_dir = os.path.realpath(os.path.join(binaryen_git_dir, '..', 'main'))
if os.path.isdir(os.path.join(binaryen_git_dir, '.git')):
print(f'Binaryen git directory: "{binaryen_git_dir}"')
print_repository_info(binaryen_git_dir, 'Binaryen')

print(f'LLVM_ROOT: {config.LLVM_ROOT}')

# Find LLVM git directory in emsdk aware fashion
def find_llvm_git_root(dir):
while True:
if os.path.isdir(os.path.join(dir, ".git")):
return dir
if os.path.isdir(os.path.join(dir, "src", ".git")):
return os.path.join(dir, "src")
if os.path.dirname(dir) == dir:
return None
dir = os.path.dirname(dir)

llvm_git_root = find_llvm_git_root(config.LLVM_ROOT)
if llvm_git_root:
print(f'LLVM git directory: "{llvm_git_root}"')
print_repository_info(llvm_git_root, 'LLVM')

clang_version = subprocess.run([shared.CLANG_CC, '--version'], stdout=subprocess.PIPE, text=True).stdout.strip()
print(f'Clang: "{shared.CLANG_CC}"\n{clang_version}\n')
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have shared.get_clang_version() for this.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That too parses the output - it would be preferable to print the raw output here.


print(f'EMTEST_BROWSER: {browser_common.EMTEST_BROWSER}')
firefox_version = browser_common.get_firefox_version()
if firefox_version != 2**31 - 1:
print(f'Firefox version: {firefox_version}')
else:
print('Not detected as a Firefox browser')
safari_version = browser_common.get_safari_version()
if safari_version != 2**31 - 1:
print(f'Safari version: {safari_version}')
else:
print('Not detected as a Safari browser')

emsdk_dir = os.getenv('EMSDK')
print(f'\nEMSDK: "{emsdk_dir}"')
if emsdk_dir:
if os.path.isdir(os.path.join(emsdk_dir, '.git')):
print_repository_info(emsdk_dir, 'Emsdk')

print('==================== End of Test Setup =====================')


def main():
options = parse_args()

Expand Down Expand Up @@ -606,6 +698,9 @@ def set_env(name, option_value):

browser_common.init(options.force_browser_process_termination)

if options.log_test_environment:
log_test_environment()

def prepend_default(arg):
if arg.startswith('test_'):
return default_core_test_mode + '.' + arg
Expand Down