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
parent ea3f105f82
commit 26e0aa268f
2 changed files with 27 additions and 24 deletions

View file

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

View file

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