twister: handlers: Pass harness reason to instance

Pass a test failure reason text from harness to the instance
to convey more details on the failure.

Signed-off-by: Dmitrii Golovanov <dmitrii.golovanov@intel.com>
This commit is contained in:
Dmitrii Golovanov 2024-12-13 00:35:47 +01:00 committed by Fabio Baltieri
commit 26e0aa268f
2 changed files with 27 additions and 24 deletions

View file

@ -317,7 +317,7 @@ class BinaryHandler(Handler):
return env
def _update_instance_info(self, harness_status, handler_time):
def _update_instance_info(self, harness, handler_time):
self.instance.execution_time = handler_time
if not self.terminated and self.returncode != 0:
self.instance.status = TwisterStatus.FAIL
@ -328,10 +328,10 @@ class BinaryHandler(Handler):
# so in that case the return code itself is not meaningful
self.instance.reason = f"Failed (rc={self.returncode})"
self.instance.add_missing_case_status(TwisterStatus.BLOCK)
elif harness_status != TwisterStatus.NONE:
self.instance.status = harness_status
if harness_status == TwisterStatus.FAIL:
self.instance.reason = "Failed harness"
elif harness.status != TwisterStatus.NONE:
self.instance.status = harness.status
if harness.status == TwisterStatus.FAIL:
self.instance.reason = f"Failed harness:'{harness.reason}'"
self.instance.add_missing_case_status(TwisterStatus.BLOCK)
else:
self.instance.status = TwisterStatus.FAIL
@ -380,7 +380,7 @@ class BinaryHandler(Handler):
if sys.stdout.isatty():
subprocess.call(["stty", "sane"], stdin=sys.stdout)
self._update_instance_info(harness.status, handler_time)
self._update_instance_info(harness, handler_time)
self._final_handle_actions(harness, handler_time)
@ -611,13 +611,13 @@ class DeviceHandler(Handler):
return command
def _update_instance_info(self, harness_status, handler_time, flash_error):
def _update_instance_info(self, harness, handler_time, flash_error):
self.instance.execution_time = handler_time
if harness_status != TwisterStatus.NONE:
self.instance.status = harness_status
if harness_status == TwisterStatus.FAIL:
self.instance.reason = "Failed"
self.instance.add_missing_case_status(TwisterStatus.BLOCK, harness_status)
if harness.status != TwisterStatus.NONE:
self.instance.status = harness.status
if harness.status == TwisterStatus.FAIL:
self.instance.reason = f"Failed harness:'{harness.reason}'"
self.instance.add_missing_case_status(TwisterStatus.BLOCK, harness.status)
elif not flash_error:
self.instance.status = TwisterStatus.FAIL
self.instance.reason = "Timeout"
@ -836,7 +836,7 @@ class DeviceHandler(Handler):
handler_time = time.time() - start_time
self._update_instance_info(harness.status, handler_time, flash_error)
self._update_instance_info(harness, handler_time, flash_error)
self._final_handle_actions(harness, handler_time)
@ -1063,9 +1063,9 @@ class QEMUHandler(Handler):
return command
def _update_instance_info(self, harness_status, is_timeout):
def _update_instance_info(self, harness, is_timeout):
if (self.returncode != 0 and not self.ignore_qemu_crash) or \
harness_status == TwisterStatus.NONE:
harness.status == TwisterStatus.NONE:
self.instance.status = TwisterStatus.FAIL
if is_timeout:
self.instance.reason = "Timeout"
@ -1143,7 +1143,7 @@ class QEMUHandler(Handler):
logger.debug(f"return code from QEMU ({qemu_pid}): {self.returncode}")
self._update_instance_info(harness.status, is_timeout)
self._update_instance_info(harness, is_timeout)
self._final_handle_actions(harness, 0)
@ -1244,9 +1244,9 @@ class QEMUWinHandler(Handler):
return command
def _update_instance_info(self, harness_status, is_timeout):
def _update_instance_info(self, harness, is_timeout):
if (self.returncode != 0 and not self.ignore_qemu_crash) or \
harness_status == TwisterStatus.NONE:
harness.status == TwisterStatus.NONE:
self.instance.status = TwisterStatus.FAIL
if is_timeout:
self.instance.reason = "Timeout"
@ -1428,7 +1428,7 @@ class QEMUWinHandler(Handler):
os.close(self.pipe_handle)
self.pipe_handle = None
self._update_instance_info(harness.status, is_timeout)
self._update_instance_info(harness, is_timeout)
self._final_handle_actions(harness, 0)

View file

@ -511,7 +511,7 @@ def test_binaryhandler_create_env(
TESTDATA_6 = [
(TwisterStatus.NONE, False, 2, True, TwisterStatus.FAIL, 'Valgrind error', False),
(TwisterStatus.NONE, False, 1, False, TwisterStatus.FAIL, 'Failed (rc=1)', False),
(TwisterStatus.FAIL, False, 0, False, TwisterStatus.FAIL, 'Failed harness', False),
(TwisterStatus.FAIL, False, 0, False, TwisterStatus.FAIL, "Failed harness:'foobar'", False),
('success', False, 0, False, 'success', 'Unknown', False),
(TwisterStatus.NONE, True, 1, True, TwisterStatus.FAIL, 'Timeout', True),
]
@ -540,8 +540,9 @@ def test_binaryhandler_update_instance_info(
handler.returncode = returncode
missing_mock = mock.Mock()
handler.instance.add_missing_case_status = missing_mock
mocked_harness = mock.Mock(status=harness_status, reason="foobar")
handler._update_instance_info(harness_status, handler_time)
handler._update_instance_info(mocked_harness, handler_time)
assert handler.instance.execution_time == handler_time
@ -1189,7 +1190,7 @@ def test_devicehandler_create_command(
TESTDATA_14 = [
('success', False, 'success', 'Unknown', False),
(TwisterStatus.FAIL, False, TwisterStatus.FAIL, 'Failed', True),
(TwisterStatus.FAIL, False, TwisterStatus.FAIL, "Failed harness:'foobar'", True),
(TwisterStatus.ERROR, False, TwisterStatus.ERROR, 'Unknown', True),
(TwisterStatus.NONE, True, TwisterStatus.NONE, 'Unknown', False),
(TwisterStatus.NONE, False, TwisterStatus.FAIL, 'Timeout', True),
@ -1213,8 +1214,9 @@ def test_devicehandler_update_instance_info(
handler_time = 59
missing_mock = mock.Mock()
handler.instance.add_missing_case_status = missing_mock
mocked_harness = mock.Mock(status=harness_status, reason="foobar")
handler._update_instance_info(harness_status, handler_time, flash_error)
handler._update_instance_info(mocked_harness, handler_time, flash_error)
assert handler.instance.execution_time == handler_time
@ -1716,12 +1718,13 @@ def test_qemuhandler_update_instance_info(
):
mocked_instance.add_missing_case_status = mock.Mock()
mocked_instance.reason = self_instance_reason
mocked_harness = mock.Mock(status=harness_status, reason="foobar")
handler = QEMUHandler(mocked_instance, 'build', mock.Mock())
handler.returncode = self_returncode
handler.ignore_qemu_crash = self_ignore_qemu_crash
handler._update_instance_info(harness_status, is_timeout)
handler._update_instance_info(mocked_harness, is_timeout)
assert handler.instance.status == expected_status
assert handler.instance.reason == expected_reason