Source code

Revision control

Copy as Markdown

Other Tools

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import argparse
import os
import subprocess
from mach.decorators import Command, CommandArgument
from mozbuild.base import MozbuildObject
from mozbuild.nodeutil import find_node_executable
suites = [
"aboutdebugging",
"accessibility",
"all",
"application",
"compatibility",
"debugger",
"framework",
"netmonitor",
"performance",
"shared_components",
"webconsole",
]
class DevToolsNodeTestRunner(MozbuildObject):
"""Run DevTools node tests."""
def run_node_tests(self, suite=None, artifact=None):
"""Run the DevTools node test suites."""
devtools_bin_dir = os.path.join(self.topsrcdir, "devtools", "client", "bin")
test_runner_script = os.path.join(
devtools_bin_dir, "devtools-node-test-runner.js"
)
if suite and suite not in suites:
print(
f"ERROR: Invalid suite '{suite}'. Valid suites are: {', '.join(suites)}"
)
return 1
# Build the command to run
node_binary, _ = find_node_executable()
cmd = [node_binary, test_runner_script]
# Add artifact argument if specified
if artifact:
cmd.append(f"--artifact={artifact}")
# Add suite argument
cmd.append(f"--suite={suite}")
print(f"Running: {' '.join(cmd)}")
print(f"Working directory: {devtools_bin_dir}")
try:
# Run the test runner from the devtools bin directory
result = subprocess.run(cmd, cwd=devtools_bin_dir, check=False)
return result.returncode
except FileNotFoundError:
print(
"ERROR: Node.js not found. Please ensure Node.js is installed and in your PATH."
)
return 1
except Exception as e:
print(f"ERROR: Failed to run DevTools node tests: {e}")
return 1
@Command(
"devtools-node-test",
category="testing",
description="Run DevTools node tests",
parser=argparse.ArgumentParser(),
)
@CommandArgument(
"--suite",
default="all",
help=f"(optional) Test suite to run. Runs all suites when omitted. Available suites: {', '.join(suites)}",
)
@CommandArgument(
"--artifact",
help="Path to write test error artifacts as JSON. Useful for CI integration "
"and error reporting.",
)
def run_devtools_node_test(command_context, suite=None, artifact=None, **kwargs):
"""Run DevTools node tests."""
runner = DevToolsNodeTestRunner.from_environment(
cwd=os.getcwd(), detect_virtualenv_mozinfo=False
)
return runner.run_node_tests(suite=suite, artifact=artifact)