Skip to content

Commit 26e0aa2

Browse files
golowanowfabiobaltieri
authored andcommitted
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 <[email protected]>
1 parent ea3f105 commit 26e0aa2

File tree

2 files changed

+27
-24
lines changed

2 files changed

+27
-24
lines changed

scripts/pylib/twister/twisterlib/handlers.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ def _create_env(self):
317317

318318
return env
319319

320-
def _update_instance_info(self, harness_status, handler_time):
320+
def _update_instance_info(self, harness, handler_time):
321321
self.instance.execution_time = handler_time
322322
if not self.terminated and self.returncode != 0:
323323
self.instance.status = TwisterStatus.FAIL
@@ -328,10 +328,10 @@ def _update_instance_info(self, harness_status, handler_time):
328328
# so in that case the return code itself is not meaningful
329329
self.instance.reason = f"Failed (rc={self.returncode})"
330330
self.instance.add_missing_case_status(TwisterStatus.BLOCK)
331-
elif harness_status != TwisterStatus.NONE:
332-
self.instance.status = harness_status
333-
if harness_status == TwisterStatus.FAIL:
334-
self.instance.reason = "Failed harness"
331+
elif harness.status != TwisterStatus.NONE:
332+
self.instance.status = harness.status
333+
if harness.status == TwisterStatus.FAIL:
334+
self.instance.reason = f"Failed harness:'{harness.reason}'"
335335
self.instance.add_missing_case_status(TwisterStatus.BLOCK)
336336
else:
337337
self.instance.status = TwisterStatus.FAIL
@@ -380,7 +380,7 @@ def handle(self, harness):
380380
if sys.stdout.isatty():
381381
subprocess.call(["stty", "sane"], stdin=sys.stdout)
382382

383-
self._update_instance_info(harness.status, handler_time)
383+
self._update_instance_info(harness, handler_time)
384384

385385
self._final_handle_actions(harness, handler_time)
386386

@@ -611,13 +611,13 @@ def _create_command(self, runner, hardware):
611611

612612
return command
613613

614-
def _update_instance_info(self, harness_status, handler_time, flash_error):
614+
def _update_instance_info(self, harness, handler_time, flash_error):
615615
self.instance.execution_time = handler_time
616-
if harness_status != TwisterStatus.NONE:
617-
self.instance.status = harness_status
618-
if harness_status == TwisterStatus.FAIL:
619-
self.instance.reason = "Failed"
620-
self.instance.add_missing_case_status(TwisterStatus.BLOCK, harness_status)
616+
if harness.status != TwisterStatus.NONE:
617+
self.instance.status = harness.status
618+
if harness.status == TwisterStatus.FAIL:
619+
self.instance.reason = f"Failed harness:'{harness.reason}'"
620+
self.instance.add_missing_case_status(TwisterStatus.BLOCK, harness.status)
621621
elif not flash_error:
622622
self.instance.status = TwisterStatus.FAIL
623623
self.instance.reason = "Timeout"
@@ -836,7 +836,7 @@ def handle(self, harness):
836836

837837
handler_time = time.time() - start_time
838838

839-
self._update_instance_info(harness.status, handler_time, flash_error)
839+
self._update_instance_info(harness, handler_time, flash_error)
840840

841841
self._final_handle_actions(harness, handler_time)
842842

@@ -1063,9 +1063,9 @@ def _create_command(self, sysbuild_build_dir):
10631063

10641064
return command
10651065

1066-
def _update_instance_info(self, harness_status, is_timeout):
1066+
def _update_instance_info(self, harness, is_timeout):
10671067
if (self.returncode != 0 and not self.ignore_qemu_crash) or \
1068-
harness_status == TwisterStatus.NONE:
1068+
harness.status == TwisterStatus.NONE:
10691069
self.instance.status = TwisterStatus.FAIL
10701070
if is_timeout:
10711071
self.instance.reason = "Timeout"
@@ -1143,7 +1143,7 @@ def handle(self, harness):
11431143

11441144
logger.debug(f"return code from QEMU ({qemu_pid}): {self.returncode}")
11451145

1146-
self._update_instance_info(harness.status, is_timeout)
1146+
self._update_instance_info(harness, is_timeout)
11471147

11481148
self._final_handle_actions(harness, 0)
11491149

@@ -1244,9 +1244,9 @@ def _create_command(self, sysbuild_build_dir):
12441244

12451245
return command
12461246

1247-
def _update_instance_info(self, harness_status, is_timeout):
1247+
def _update_instance_info(self, harness, is_timeout):
12481248
if (self.returncode != 0 and not self.ignore_qemu_crash) or \
1249-
harness_status == TwisterStatus.NONE:
1249+
harness.status == TwisterStatus.NONE:
12501250
self.instance.status = TwisterStatus.FAIL
12511251
if is_timeout:
12521252
self.instance.reason = "Timeout"
@@ -1428,7 +1428,7 @@ def handle(self, harness):
14281428
os.close(self.pipe_handle)
14291429
self.pipe_handle = None
14301430

1431-
self._update_instance_info(harness.status, is_timeout)
1431+
self._update_instance_info(harness, is_timeout)
14321432

14331433
self._final_handle_actions(harness, 0)
14341434

scripts/tests/twister/test_handlers.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ def test_binaryhandler_create_env(
511511
TESTDATA_6 = [
512512
(TwisterStatus.NONE, False, 2, True, TwisterStatus.FAIL, 'Valgrind error', False),
513513
(TwisterStatus.NONE, False, 1, False, TwisterStatus.FAIL, 'Failed (rc=1)', False),
514-
(TwisterStatus.FAIL, False, 0, False, TwisterStatus.FAIL, 'Failed harness', False),
514+
(TwisterStatus.FAIL, False, 0, False, TwisterStatus.FAIL, "Failed harness:'foobar'", False),
515515
('success', False, 0, False, 'success', 'Unknown', False),
516516
(TwisterStatus.NONE, True, 1, True, TwisterStatus.FAIL, 'Timeout', True),
517517
]
@@ -540,8 +540,9 @@ def test_binaryhandler_update_instance_info(
540540
handler.returncode = returncode
541541
missing_mock = mock.Mock()
542542
handler.instance.add_missing_case_status = missing_mock
543+
mocked_harness = mock.Mock(status=harness_status, reason="foobar")
543544

544-
handler._update_instance_info(harness_status, handler_time)
545+
handler._update_instance_info(mocked_harness, handler_time)
545546

546547
assert handler.instance.execution_time == handler_time
547548

@@ -1189,7 +1190,7 @@ def test_devicehandler_create_command(
11891190

11901191
TESTDATA_14 = [
11911192
('success', False, 'success', 'Unknown', False),
1192-
(TwisterStatus.FAIL, False, TwisterStatus.FAIL, 'Failed', True),
1193+
(TwisterStatus.FAIL, False, TwisterStatus.FAIL, "Failed harness:'foobar'", True),
11931194
(TwisterStatus.ERROR, False, TwisterStatus.ERROR, 'Unknown', True),
11941195
(TwisterStatus.NONE, True, TwisterStatus.NONE, 'Unknown', False),
11951196
(TwisterStatus.NONE, False, TwisterStatus.FAIL, 'Timeout', True),
@@ -1213,8 +1214,9 @@ def test_devicehandler_update_instance_info(
12131214
handler_time = 59
12141215
missing_mock = mock.Mock()
12151216
handler.instance.add_missing_case_status = missing_mock
1217+
mocked_harness = mock.Mock(status=harness_status, reason="foobar")
12161218

1217-
handler._update_instance_info(harness_status, handler_time, flash_error)
1219+
handler._update_instance_info(mocked_harness, handler_time, flash_error)
12181220

12191221
assert handler.instance.execution_time == handler_time
12201222

@@ -1716,12 +1718,13 @@ def test_qemuhandler_update_instance_info(
17161718
):
17171719
mocked_instance.add_missing_case_status = mock.Mock()
17181720
mocked_instance.reason = self_instance_reason
1721+
mocked_harness = mock.Mock(status=harness_status, reason="foobar")
17191722

17201723
handler = QEMUHandler(mocked_instance, 'build', mock.Mock())
17211724
handler.returncode = self_returncode
17221725
handler.ignore_qemu_crash = self_ignore_qemu_crash
17231726

1724-
handler._update_instance_info(harness_status, is_timeout)
1727+
handler._update_instance_info(mocked_harness, is_timeout)
17251728

17261729
assert handler.instance.status == expected_status
17271730
assert handler.instance.reason == expected_reason

0 commit comments

Comments
 (0)