Ejemplo n.º 1
0
    def PerformStage(self):
        # These directories are used later to archive test artifacts.
        if not self._run.options.vmtests:
            return

        test_results_root = commands.CreateTestRoot(self._build_root)
        test_basename = _VM_TEST_RESULTS % dict(attempt=self._attempt)
        if self._test_basename:
            test_basename = self._test_basename
        try:
            if not self._vm_tests:
                self._vm_tests = self._run.config.vm_tests

            failed_tests = []
            for vm_test in self._vm_tests:
                logging.info('Running VM test %s.', vm_test.test_type)
                if vm_test.test_type == constants.VM_SUITE_TEST_TYPE:
                    per_test_results_dir = os.path.join(
                        test_results_root, vm_test.test_suite)
                else:
                    per_test_results_dir = os.path.join(
                        test_results_root, vm_test.test_type)
                try:
                    with cgroups.SimpleContainChildren('VMTest'):
                        r = ' Reached VMTestStage test run timeout.'
                        with timeout_util.Timeout(vm_test.timeout,
                                                  reason_message=r):
                            self._RunTest(vm_test, per_test_results_dir)
                except Exception:
                    failed_tests.append(vm_test)
                    if vm_test.warn_only:
                        logging.warning(
                            'Optional test failed. Forgiving the failure.')
                    else:
                        raise

            if failed_tests:
                # If any of the tests failed but not raise an exception, mark
                # the stage as warning.
                self._stage_exception_handler = self._HandleExceptionAsWarning
                raise failures_lib.TestWarning(
                    'VMTestStage succeeded, but some optional tests failed.')
        except Exception as e:
            if not isinstance(e, failures_lib.TestWarning):
                # pylint: disable=logging-not-lazy
                logging.error(
                    _ERROR_MSG %
                    dict(test_name='VMTests', test_results=test_basename))
            self._ArchiveVMFiles(test_results_root)
            raise
        finally:
            if self._run.config.vm_test_report_to_dashboards:
                self._ReportResultsToDashboards(test_results_root)
            self._ArchiveTestResults(test_results_root, test_basename)
Ejemplo n.º 2
0
    def _RunHWTestSuite(self,
                        debug=False,
                        fails=False,
                        warns=False,
                        cmd_fail_mode=None):
        """Verify the stage behavior in various circumstances.

    Args:
      debug: Whether the HWTest suite should be run in debug mode.
      fails: Whether the stage should fail.
      warns: Whether the stage should warn.
      cmd_fail_mode: How commands.RunHWTestSuite() should fail.
        If None, don't fail.
    """
        # We choose to define these mocks in setUp() because they are
        # useful for tests that do not call this method. However, this
        # means we have to reset the mocks before each run.
        self.run_suite_mock.reset_mock()
        self.warning_mock.reset_mock()
        self.failure_mock.reset_mock()

        to_raise = None

        if cmd_fail_mode == None:
            to_raise = None
        elif cmd_fail_mode == 'timeout':
            to_raise = timeout_util.TimeoutError('Timed out')
        elif cmd_fail_mode == 'suite_timeout':
            to_raise = failures_lib.SuiteTimedOut('Suite timed out')
        elif cmd_fail_mode == 'board_not_available':
            to_raise = failures_lib.BoardNotAvailable('Board not available')
        elif cmd_fail_mode == 'lab_fail':
            to_raise = failures_lib.TestLabFailure('Test lab failure')
        elif cmd_fail_mode == 'test_warn':
            to_raise = failures_lib.TestWarning('Suite passed with warnings')
        elif cmd_fail_mode == 'test_fail':
            to_raise = failures_lib.TestFailure('HWTest failed.')
        else:
            raise ValueError('cmd_fail_mode %s not supported' % cmd_fail_mode)

        if cmd_fail_mode == 'timeout':
            self.run_suite_mock.side_effect = to_raise
        else:
            self.run_suite_mock.return_value = commands.HWTestSuiteResult(
                to_raise, None)

        if fails:
            self.assertRaises(failures_lib.StepFailure, self.RunStage)
        else:
            self.RunStage()

        self.run_suite_mock.assert_called_once()
        self.assertEqual(self.run_suite_mock.call_args[1].get('debug'), debug)

        # Make sure we print the buildbot failure/warning messages correctly.
        if fails:
            self.failure_mock.assert_called_once()
        else:
            self.assertFalse(self.failure_mock.called)

        if warns:
            self.warning_mock.assert_called_once()
        else:
            self.assertFalse(self.warning_mock.called)