mirror of
https://github.com/AdaCore/aws.git
synced 2026-02-12 12:29:46 -08:00
188 lines
5.0 KiB
Python
188 lines
5.0 KiB
Python
"""
|
|
This module contains support functions for all test.py
|
|
"""
|
|
|
|
import logging
|
|
import os
|
|
import sys
|
|
import re
|
|
|
|
from glob import glob
|
|
from e3.env import Env
|
|
from e3.os.fs import cd, mv
|
|
from e3.os.process import Run
|
|
|
|
Env().restore(os.environ["TEST_CONFIG"])
|
|
|
|
# Move to test directory
|
|
ROOT_DIR = os.getcwd()
|
|
TEST_DIR = os.path.dirname(sys.modules["__main__"].__file__)
|
|
TEST_NAME = os.path.basename(TEST_DIR)
|
|
|
|
def setup():
|
|
cd(TEST_DIR)
|
|
for prj in glob("*.gpr"):
|
|
with open(prj) as prj_orig:
|
|
lines = [line for line in prj_orig]
|
|
with open(prj + ".new", "w") as prj_new:
|
|
for line in lines:
|
|
line = line.replace("../common",
|
|
os.path.join(os.environ['REGTESTS_DIR'], "common"))
|
|
prj_new.write(line)
|
|
mv(prj + ".new", prj)
|
|
|
|
|
|
setup()
|
|
|
|
|
|
def tail(infile_name, outfile_name, nb_line):
|
|
"""Write outfile which contains infile with the top n lines removed
|
|
|
|
If outfile_name is None, print to stdout
|
|
"""
|
|
infile = open(infile_name, "r")
|
|
if outfile_name is not None:
|
|
outfile = open(outfile_name, "w")
|
|
pos = 0
|
|
for line in infile:
|
|
pos = pos + 1
|
|
if pos >= nb_line:
|
|
if outfile_name is not None:
|
|
outfile.write(line)
|
|
else:
|
|
print(line)
|
|
if outfile_name is not None:
|
|
outfile.close()
|
|
infile.close()
|
|
|
|
def grep(infile_name, outfile_name, patterns):
|
|
"""Write outfile which contains line from infile matching pattern
|
|
|
|
If outfile_name is None, print to stdout
|
|
"""
|
|
infile = open(infile_name, "r")
|
|
if outfile_name is not None:
|
|
outfile = open(outfile_name, "w")
|
|
pos = 0
|
|
for line in infile:
|
|
pos = pos + 1
|
|
for pattern in patterns:
|
|
r = re.search(pattern, line)
|
|
if r != None:
|
|
if outfile_name is not None:
|
|
outfile.write(line)
|
|
else:
|
|
print(line[:-1])
|
|
if outfile_name is not None:
|
|
outfile.close()
|
|
infile.close()
|
|
|
|
GPRBUILD_OPTIONS = []
|
|
|
|
def build(prj):
|
|
"""Compile a project with gprbuild"""
|
|
cmd = ["gprbuild", f"-XHost_OS={Env().host.os.name}"]
|
|
for O in os.environ.get('GPRBUILD_OPTIONS', "").split():
|
|
cmd += [O]
|
|
if Env().is_cross:
|
|
cmd.append("--target=" + Env().target.triplet)
|
|
if Env().target.os.name.startswith("vxworks"):
|
|
cmd.append("-XPLATFORM=vxworks")
|
|
cmd += ["-p", "-gnat2022", "-P" + prj, "-bargs", "-E"]
|
|
if Env().options.with_gprof:
|
|
cmd += ["-cargs", "-pg", "-O2", "-largs", "-pg"]
|
|
process = Run(cmd)
|
|
if process.status:
|
|
# Exit with error
|
|
logging.error(process.out)
|
|
|
|
|
|
DEFAULT_RESOURCES = [
|
|
"*.txt",
|
|
"*.gz",
|
|
"*.dat",
|
|
"*.tmplt",
|
|
"*.thtml",
|
|
"*.html",
|
|
"*.ini",
|
|
"*.types",
|
|
"*.mime",
|
|
"*.gif",
|
|
"*.png",
|
|
]
|
|
|
|
|
|
def run(bin, options=None, output_file=None, resources=None):
|
|
"""Run a test.
|
|
|
|
:param resources: list of files that the executable will need to
|
|
read, relative to the testcase directory. This is used on
|
|
cross configurations to send the files to the target platform
|
|
before running BIN.
|
|
|
|
Each item in the list can be a glob pattern. By default,
|
|
DEFAULT_RESOURCES will be used.
|
|
"""
|
|
if options is None:
|
|
options = []
|
|
if "TIMEOUT" in os.environ:
|
|
timeout = int(os.environ["TIMEOUT"])
|
|
else:
|
|
timeout = 300
|
|
if resources is None:
|
|
resources = DEFAULT_RESOURCES
|
|
|
|
if Env().is_cross:
|
|
# Import gnatpython excross module only when needed
|
|
from pycross.runcross.main import run_cross
|
|
|
|
run_cross(
|
|
[bin + Env().target.os.exeext] + options,
|
|
output=output_file,
|
|
timeout=timeout,
|
|
copy_files_on_target=resources,
|
|
)
|
|
else:
|
|
if Env().options.with_gdb:
|
|
Run(
|
|
["gdb", "--eval-command=run", "--batch-silent", "--args", bin]
|
|
+ options,
|
|
output=output_file,
|
|
timeout=timeout,
|
|
)
|
|
elif Env().options.with_valgrind:
|
|
Run(
|
|
["valgrind", "-q", "./" + bin] + options,
|
|
output=output_file,
|
|
timeout=timeout,
|
|
)
|
|
else:
|
|
Run(["./" + bin] + options, output=output_file, timeout=timeout)
|
|
|
|
if Env().options.with_gprof:
|
|
Run(
|
|
["gprof", bin] + options,
|
|
output=os.path.join(
|
|
Env().PROFILES_DIR, f"{TEST_NAME}_{bin}_gprof.out"
|
|
),
|
|
)
|
|
|
|
|
|
def exec_cmd(bin, options=None, output_file=None, ignore_error=False):
|
|
"""Execute a binary"""
|
|
if options is None:
|
|
options = []
|
|
process = Run([bin] + options, output=output_file)
|
|
if process.status and not ignore_error:
|
|
# Exit with error
|
|
logging.error(open(output_file).read())
|
|
|
|
|
|
def build_and_run(prj, resources=None):
|
|
"""Compile and run a project and check the output.
|
|
|
|
:param resources: See :func:`run`.
|
|
"""
|
|
build(prj)
|
|
run(prj, resources=resources)
|