TimedWaitPID.install()
#TODO Tear out duplicate logic from the sandbox IOManager
-def log_call(logger, command, *popenargs, **kwargs):
+def log_call(logger, command, time, *popenargs, **kwargs):
'''
Calls the given process and automatically logs the command and output.
retval = p.wait()
stdout_thread.join()
stderr_thread.join()
+
+ if time is not None and TimedWaitPID.has_time_for_pid(p.pid):
+ resource_usage = TimedWaitPID.get_time_for_pid(p.pid)
+ time['user_time'] = resource_usage.user_time
+ time['system_time'] = resource_usage.system_time
+
# Return the return exit code of the process.
if retval != 0:
raise subprocess.CalledProcessError(retval, cmdstr)
(_, tfname) = tempfile.mkstemp(dir=os.path.dirname(out_file), text=True)
with open(tfname, 'r+') as tempfile_:
try:
- log_call(logger, ['diff', out_file, ref_file], stdout=tempfile_)
+ log_call(logger, ['diff', out_file, ref_file],
+ time=None, stdout=tempfile_)
except OSError:
# Likely signals that diff does not exist on this system. fallback
# to difflib
+# Copyright (c) 2020 ARM Limited
+# All rights reserved
+#
+# The license below extends only to copyright in the software and shall
+# not be construed as granting a license to any other intellectual
+# property including but not limited to intellectual property relating
+# to a hardware implementation of the functionality of the software
+# licensed hereunder. You may use the software subject to the license
+# terms below provided that you ensure that this notice is replicated
+# unmodified and in its entirety in all distributions of the software,
+# modified or unmodified, in source code or in binary form.
+#
# Copyright (c) 2017 Mark D. Hill and David A. Wood
# All rights reserved.
#
def unsuccessful(self):
return self._metadata.result.value != state.Result.Passed
+ @property
+ def time(self):
+ return self._metadata.time
+
class InternalTestResult(_CommonMetadataMixin):
def __init__(self, obj, suite, directory):
# TODO JUnit expects class of test.. add as test metadata.
XMLAttribute('classname', str(test_result.uid)),
XMLAttribute('status', str(test_result.result)),
+ XMLAttribute('time', str(test_result.time["user_time"])),
]
# TODO JUnit expects a message for the reason a test was
self.suite = suite
self.log = log.test_log
self.log.test = test
+ self.time = {
+ "user_time" : 0, "system_time" : 0}
@helper.cacheresult
def _fixtures(self):
else:
self.testable.result = Result(Result.Passed)
+ self.testable.time = test_params.time
+
class SuiteRunner(RunnerPattern):
def test(self):
-# Copyright (c) 2019 ARM Limited
+# Copyright (c) 2019-2020 ARM Limited
# All rights reserved
#
# The license below extends only to copyright in the software and shall
def runner(self):
return self.obj.runner
+ @property
+ def time(self):
+ return self.metadata.time
+
+ @time.setter
+ def time(self, value):
+ self.metadata.time = value
+
# TODO Change log to provide status_update, result_update for all types.
def log_status(self, status):
import testlib.log as log
command.extend(self.targets)
if self.options:
command.extend(self.options)
- log_call(log.test_log, command, stderr=sys.stderr)
+ log_call(log.test_log, command, time=None, stderr=sys.stderr)
class Gem5Fixture(SConsFixture):
def __new__(cls, isa, variant, protocol=None):
targets = set(self.required_by)
command = ['make', '-C', self.directory]
command.extend([target.target for target in targets])
- log_call(log.test_log, command, stderr=sys.stderr)
+ log_call(log.test_log, command, time=None, stderr=sys.stderr)
class MakeTarget(Fixture):
command.append(config)
# Config_args should set up the program args.
command.extend(config_args)
- log_call(params.log, command, stdout=sys.stdout, stderr=sys.stderr)
+ log_call(params.log, command, time=params.time,
+ stdout=sys.stdout, stderr=sys.stderr)
return test_run_gem5