51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
# 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 logging
|
|
import shutil
|
|
import subprocess
|
|
|
|
from mach.decorators import Command, CommandArgument
|
|
|
|
|
|
@Command(
|
|
"shell-test",
|
|
category="testing",
|
|
description="Run shell unit tests using shunit2.",
|
|
)
|
|
@CommandArgument("tests", nargs="+", metavar="PATH", help="Test files to run.")
|
|
def shell_test(command_context, tests):
|
|
if not _is_shunit2_on_path():
|
|
command_context.log(
|
|
logging.ERROR,
|
|
"shell-test",
|
|
{},
|
|
"shunit2 not found. Install it with: "
|
|
"apt install shunit2 (Debian/Ubuntu), "
|
|
"dnf install shunit2 (Fedora), "
|
|
"zypper install shunit2 (openSUSE), "
|
|
"or brew install shunit2 (macOS).",
|
|
)
|
|
return 1
|
|
|
|
failed = False
|
|
for path in tests:
|
|
result = subprocess.run([_read_shebang(path), path], check=False)
|
|
if result.returncode != 0:
|
|
failed = True
|
|
|
|
return 1 if failed else 0
|
|
|
|
|
|
def _read_shebang(path):
|
|
with open(path) as f:
|
|
first_line = f.readline().strip()
|
|
if first_line.startswith("#!"):
|
|
return first_line[2:].split()[0]
|
|
return "sh"
|
|
|
|
|
|
def _is_shunit2_on_path():
|
|
return shutil.which("shunit2") is not None
|