tesh -- testing shell
========================
-Copyright (c) 2012-2022. The SimGrid Team. All rights reserved.
+Copyright (c) 2012-2023. The SimGrid Team. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of the license (GNU LGPL) which comes with this package.
#
#
-def is_windows():
- """ Check if running on Windows """
- return sys.platform.startswith('win')
-
# Singleton metaclass that works in Python 2 & 3
# http://stackoverflow.com/questions/6760685/creating-a-singleton-in-python
def kill_process_group(pid):
""" This function send TERM signal + KILL signal after 0.2s to the group of the specified process """
if pid is None:
- # Nobody to kill. We don't know who to kill on windows, or we don't have anyone to kill on signal handler
+ # Nobody to kill. We don't have anyone to kill on signal handler
return
try:
self.args_suffix = ""
self.ignore_regexps_common = []
self.jenkins = False # not a Jenkins run by default
+ self.auto_valgrind = True
self.timeout = 10 # default value: 10 sec
self.wrapper = None
self.keep = False
self.output_display = False
self.sort = -1
+ self.rerun_with_valgrind = False
self.ignore_regexps = TeshState().ignore_regexps_common
_thread.start_new_thread(Cmd._run, (self, lock))
else:
self._run()
+ if self.rerun_with_valgrind and TeshState().auto_valgrind:
+ print('\n\n\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
+ print( 'XXXXXXXXX Rerunning this test with valgrind to help debugging it XXXXXXXXX')
+ print( 'XXXXXXXX (this will fail if valgrind is not installed, of course) XXXXXXXX')
+ print( 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n\n\n')
+
+ self.args = "valgrind " + self.args
+ self._run()
return True
def _run(self, lock=None):
local_pid = None
try:
- preexec_function = None
- if not is_windows():
- preexec_function = lambda: os.setpgid(0, 0)
+ preexec_function = lambda: os.setpgid(0, 0)
proc = subprocess.Popen( # pylint: disable=subprocess-popen-preexec-fn
args,
bufsize=1,
stderr=subprocess.STDOUT,
universal_newlines=True,
preexec_fn=preexec_function)
- if not is_windows():
- local_pid = proc.pid
- TeshState().running_pids.append(local_pid)
+ local_pid = proc.pid
+ TeshState().running_pids.append(local_pid)
except PermissionError:
logs.append("[{file}:{number}] Cannot start '{cmd}': The binary is not executable.".format(
file=FileReader().filename, number=self.linenumber, cmd=args[0]))
print('\n'.join(logs))
return
- if self.output_display:
- logs.append(str(stdout_data))
-
# remove text colors
ansi_escape = re.compile(r'\x1b[^m]*m')
stdout_data = ansi_escape.sub('', stdout_data)
+ if self.output_display:
+ logs.append(str(stdout_data))
+
+ if self.rerun_with_valgrind:
+ print(str(stdout_data), file=sys.stderr)
+ return
+
if self.ignore_output:
logs.append("(ignoring the output of <{cmd}> as requested)".format(cmd=cmd_name))
else:
logs.append("Test suite `{file}': NOK (<{cmd}> output mismatch)".format(
file=FileReader().filename, cmd=cmd_name))
+
+ # Also report any failed return code and/or signal we got in case of output mismatch
+ if not proc.returncode in self.expect_return:
+ if proc.returncode >= 0:
+ logs.append("In addition, <{cmd}> returned code {code}.".format(
+ cmd=cmd_name, code=proc.returncode))
+ else:
+ logs.append("In addition, <{cmd}> got signal {sig}.".format(cmd=cmd_name,
+ sig=SIGNALS_TO_NAMES_DICT[-proc.returncode]))
+ if proc.returncode == -signal.SIGSEGV:
+ self.rerun_with_valgrind = True
+
if lock is not None:
lock.release()
if TeshState().keep:
logs.append("Test suite `{file}': NOK (<{cmd}> got signal {sig})".format(
file=FileReader().filename, cmd=cmd_name,
sig=SIGNALS_TO_NAMES_DICT[-proc.returncode]))
+
+ if proc.returncode == -signal.SIGSEGV:
+ self.rerun_with_valgrind = True
+
if lock is not None:
lock.release()
TeshState().set_return_code(max(-proc.returncode, 1))
'--ignore-jenkins',
action='store_true',
help='ignore all cruft generated on SimGrid continuous integration servers')
+ group1.add_argument(
+ '--no-auto-valgrind',
+ action='store_true',
+ help='do not automaticall launch segfaulting commands in valgrind')
group1.add_argument('--wrapper', metavar='arg', help='Run each command in the provided wrapper (eg valgrind)')
group1.add_argument(
'--keep',
re.compile(r"profiling:"),
re.compile(r"Unable to clean temporary file C:"),
re.compile(r".*Configuration change: Set 'contexts/"),
- re.compile(r"Picked up JAVA_TOOL_OPTIONS: "),
- re.compile(r"Picked up _JAVA_OPTIONS: "),
re.compile(r"==[0-9]+== ?WARNING: ASan doesn't fully support"),
re.compile(r"==[0-9]+== ?WARNING: ASan is ignoring requested __asan_handle_no_return: stack "),
re.compile(r"False positive error reports may follow"),
]
TeshState().jenkins = True # This is a Jenkins build
+ if options.no_auto_valgrind:
+ TeshState().auto_valgrind = False
+
if options.teshfile is None:
file = FileReader(None)
print("Test suite from stdin")
cmd.add_ignore(line[len("! ignore "):])
else:
- fatal_error("UNRECOGNIZED OPTION")
+ fatal_error(f"UNRECOGNIZED OPTION LINE: {line}")
line = file.readfullline()