Commit 26e0aa26 authored by Dmitrii Golovanov's avatar Dmitrii Golovanov Committed by Fabio Baltieri
Browse files

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: default avatarDmitrii Golovanov <dmitrii.golovanov@intel.com>
parent ea3f105f
Loading
Loading
Loading
Loading
+19 −19
Changes for scripts/pylib/twister/twisterlib/handlers.py: 19 added lines, 19 removed lines.
Original line number Diff line number Diff line
@@ -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)

+8 −5
Changes for scripts/tests/twister/test_handlers.py: 8 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -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