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)
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)