blob: c35668be53a68a713f1497441760c3ef45ab60ba [file] [log] [blame]
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Module containing unit tests for failure_message_lib."""
from __future__ import print_function
import mock
from chromite.lib import constants
from chromite.lib import cros_test_lib
from chromite.lib import failure_message_lib
from chromite.lib import hwtest_results
from chromite.lib import patch_unittest
from chromite.lib import portage_util
from chromite.lib import triage_lib
DEFAULT_BUILD_SCRIPT_FAILURE_EXTRA_INFO = (
'{\"shortname\": \"./security_test_image\"}')
DEFAULT_PACKAGE_BUILD_FAILURE_EXTRA_INFO = (
'{\"shortname\": \"./build_image\", \"failed_packages\":'
'[\"chromeos-base/chromeos-chrome\", \"chromeos-base/chromeos-init\"]}')
class StageFailureHelper(object):
"""Helper method to create StageFailure instances for test."""
@classmethod
def CreateStageFailure(
cls, failure_id=1, build_stage_id=1, outer_failure_id=None,
exception_type='StepFailure', exception_message='exception message',
exception_category=constants.EXCEPTION_CATEGORY_UNKNOWN,
extra_info=None, timestamp=None, stage_name='stage_1', board='board_1',
stage_status=constants.BUILDER_STATUS_PASSED, build_id=1,
master_build_id=None, builder_name='builder_name_1',
waterfall='waterfall', build_number='build_number_1',
build_config='config_1', build_status=constants.BUILDER_STATUS_PASSED,
important=True, buildbucket_id='bb_id'):
return failure_message_lib.StageFailure(
failure_id, build_stage_id, outer_failure_id, exception_type,
exception_message, exception_category, extra_info, timestamp,
stage_name, board, stage_status, build_id, master_build_id,
builder_name, waterfall, build_number, build_config, build_status,
important, buildbucket_id)
@classmethod
def GetStageFailure(
cls,
failure_id=1,
build_stage_id=1,
outer_failure_id=None,
exception_type='StepFailure',
exception_message='exception msg',
exception_category=constants.EXCEPTION_CATEGORY_UNKNOWN,
extra_info=None,
stage_name='Paygen',
build_config=None):
return cls.CreateStageFailure(
failure_id, build_stage_id, outer_failure_id, exception_type,
exception_message, exception_category, extra_info, None, stage_name,
None, None, None, None, None, None, None, build_config, None, None,
None)
class StageFailureTests(cros_test_lib.TestCase):
"""Tests for StageFailure."""
def testGetStageFailureFromMessage(self):
"""Test GetStageFailureFromMessage."""
failure_message = FailureMessageHelper.GetStageFailureMessage()
stage_failure = failure_message_lib.StageFailure.GetStageFailureFromMessage(
failure_message)
self.assertEqual(stage_failure.id, 1)
self.assertEqual(stage_failure.exception_type, 'StepFailure')
self.assertEqual(stage_failure.exception_category,
constants.EXCEPTION_CATEGORY_UNKNOWN)
class FailureMessageHelper(object):
"""Helper class to help create stage failure message instances for test."""
@classmethod
def GetStageFailureMessage(
cls,
failure_id=1,
build_stage_id=1,
outer_failure_id=None,
exception_type='StepFailure',
exception_message='exception msg',
exception_category=constants.EXCEPTION_CATEGORY_UNKNOWN,
extra_info=None,
stage_name='Paygen'):
stage_failure = StageFailureHelper.GetStageFailure(
failure_id, build_stage_id, outer_failure_id, exception_type,
exception_message, exception_category, extra_info, stage_name)
return failure_message_lib.StageFailureMessage(stage_failure)
@classmethod
def GetBuildScriptFailureMessage(
cls,
failure_id=2,
build_stage_id=0,
outer_failure_id=None,
exception_type='BuildScriptFailure',
exception_message='exception msg',
exception_category=constants.EXCEPTION_CATEGORY_BUILD,
extra_info=DEFAULT_BUILD_SCRIPT_FAILURE_EXTRA_INFO,
stage_name='InitSDK',):
stage_failure = StageFailureHelper.GetStageFailure(
failure_id, build_stage_id, outer_failure_id, exception_type,
exception_message, exception_category, extra_info, stage_name)
return failure_message_lib.BuildScriptFailureMessage(stage_failure)
@classmethod
def GetPackageBuildFailureMessage(
cls,
failure_id=3,
build_stage_id=0,
outer_failure_id=None,
exception_type='PackageBuildFailure',
exception_message='exception msg',
exception_category=constants.EXCEPTION_CATEGORY_BUILD,
extra_info=DEFAULT_PACKAGE_BUILD_FAILURE_EXTRA_INFO,
stage_name='BuildImage',):
stage_failure = StageFailureHelper.GetStageFailure(
failure_id, build_stage_id, outer_failure_id, exception_type,
exception_message, exception_category, extra_info, stage_name)
return failure_message_lib.PackageBuildFailureMessage(stage_failure)
@classmethod
def GetCompoundFailureMessage(
cls,
failure_id=4,
build_stage_id=0,
outer_failure_id=None,
exception_type='BackgroundFailure',
exception_message='exception msg',
exception_category=constants.EXCEPTION_CATEGORY_UNKNOWN,
extra_info=None,
stage_name='Archive',
stage_prefix_name='Archive'):
stage_failure = StageFailureHelper.GetStageFailure(
failure_id, build_stage_id, outer_failure_id, exception_type,
exception_message, exception_category, extra_info, stage_name)
return failure_message_lib.CompoundFailureMessage(
stage_failure, extra_info=extra_info,
stage_prefix_name=stage_prefix_name)
@classmethod
def GetTestFailureMessage(
cls,
failure_id=5,
build_stage_id=0,
outer_failure_id=None,
exception_type='TestFailure',
exception_message='** HWTest failed (code 1) **',
exception_category=constants.EXCEPTION_CATEGORY_TEST,
extra_info=None,
stage_name='HWTest'):
stage_failure = StageFailureHelper.GetStageFailure(
failure_id, build_stage_id, outer_failure_id, exception_type,
exception_message, exception_category, extra_info, stage_name)
return failure_message_lib.StageFailureMessage(stage_failure)
@classmethod
def GetBuildFailureMessageWithMixedMsgs(cls):
f_1 = cls.GetStageFailureMessage(failure_id=1, outer_failure_id=4)
f_2 = cls.GetBuildScriptFailureMessage(failure_id=2, outer_failure_id=4)
f_3 = cls.GetPackageBuildFailureMessage(failure_id=3, outer_failure_id=4)
f_4 = cls.GetStageFailureMessage(failure_id=4)
f_5 = cls.GetStageFailureMessage(failure_id=5)
f_6 = cls.GetBuildScriptFailureMessage(failure_id=6)
f_7 = cls.GetPackageBuildFailureMessage(failure_id=7)
return (failure_message_lib.FailureMessageManager.ReconstructMessages(
[f_1, f_2, f_3, f_4, f_5, f_6, f_7]))
class StageFailureMessageTests(cros_test_lib.TestCase):
"""Tests for StageFailureMessage."""
def testDecodeExtraInfoWithNoneExtraInfo(self):
"""Test _DecodeExtraInfo with None extra_info."""
failure_message = FailureMessageHelper.GetStageFailureMessage()
self.assertEqual(failure_message.extra_info, {})
def testDecodeExtraInfoWithNoneValidExtraInfo(self):
"""Test _DecodeExtraInfo with valid extra_info."""
failure_message = FailureMessageHelper.GetStageFailureMessage(
extra_info=DEFAULT_BUILD_SCRIPT_FAILURE_EXTRA_INFO)
self.assertEqual(failure_message.extra_info['shortname'],
"./security_test_image")
def testDecodeExtraInfoWithNoneInvalidExtraInfo(self):
"""Test _DecodeExtraInfo with invalid extra_info."""
failure_message = FailureMessageHelper.GetStageFailureMessage(
extra_info='{\"shortname\": \"./security_test_image\"')
self.assertEqual(failure_message.extra_info, {})
def testExtractStagePrefixName(self):
"""Test _ExtractStagePrefixName."""
prefix_name_map = {
'HWTest [arc-bvt-cq]': 'HWTest',
'HWTest': 'HWTest',
'ImageTest': 'ImageTest',
'ImageTest [amd64-generic]': 'ImageTest',
'VMTest (attempt 1)': 'VMTest',
'VMTest [amd64-generic] (attempt 1)': 'VMTest'
}
for k, v in prefix_name_map.iteritems():
failure_message = FailureMessageHelper.GetStageFailureMessage(
stage_name=k)
self.assertEqual(failure_message.stage_prefix_name, v)
class BuildScriptFailureMessageTests(cros_test_lib.TestCase):
"""Tests for BuildScriptFailureMessage."""
def testGetShortname(self):
"""Test GetShortname."""
failure_message = FailureMessageHelper.GetBuildScriptFailureMessage()
self.assertEqual(failure_message.GetShortname(), "./security_test_image")
class PackageBuildFailureMessageTests(cros_test_lib.TestCase):
"""Tests for PackageBuildFailureMessage."""
def testGetShortname(self):
"""Test GetShortname."""
failure_message = FailureMessageHelper.GetPackageBuildFailureMessage()
self.assertEqual(failure_message.GetShortname(),
"./build_image")
def testGetFailedPackages(self):
"""Test GetFailedPackages."""
failure_message = FailureMessageHelper.GetPackageBuildFailureMessage()
self.assertItemsEqual(
['chromeos-base/chromeos-chrome', 'chromeos-base/chromeos-init'],
failure_message.GetFailedPackages())
class CompoundFailureMessageTests(cros_test_lib.TestCase):
"""Tests for CompoundFailureMessage."""
def testGetCompoundFailureMessage(self):
"""Test GetCompoundFailureMessage."""
failure_message = FailureMessageHelper.GetPackageBuildFailureMessage()
new_failure_message = (
failure_message_lib.CompoundFailureMessage.GetFailureMessage(
failure_message))
self.assertEqual(new_failure_message.inner_failures, [])
def testHasEmptyList(self):
"""Test HasEmptyList."""
failure_message = FailureMessageHelper.GetCompoundFailureMessage()
self.assertTrue(failure_message.HasEmptyList())
failure_message.inner_failures.append(
FailureMessageHelper.GetPackageBuildFailureMessage())
self.assertFalse(failure_message.HasEmptyList())
def testHasExceptionCategory(self):
"""Test HasExceptionCategory."""
failure_message = FailureMessageHelper.GetCompoundFailureMessage()
self.assertFalse(failure_message.HasExceptionCategory(
constants.EXCEPTION_CATEGORY_BUILD))
failure_message.inner_failures.append(
FailureMessageHelper.GetPackageBuildFailureMessage())
self.assertTrue(failure_message.HasExceptionCategory(
constants.EXCEPTION_CATEGORY_BUILD))
self.assertFalse(failure_message.HasExceptionCategory(
constants.EXCEPTION_CATEGORY_LAB))
def testMatchesExceptionCategory(self):
"""Test MatchesExceptionCategory."""
failure_message = FailureMessageHelper.GetCompoundFailureMessage()
self.assertFalse(failure_message.MatchesExceptionCategory(
constants.EXCEPTION_CATEGORY_BUILD))
failure_message.inner_failures.append(
FailureMessageHelper.GetPackageBuildFailureMessage())
self.assertTrue(failure_message.MatchesExceptionCategory(
constants.EXCEPTION_CATEGORY_BUILD))
self.assertFalse(failure_message.MatchesExceptionCategory(
constants.EXCEPTION_CATEGORY_LAB))
failure_message.inner_failures.append(
FailureMessageHelper.GetStageFailureMessage())
self.assertFalse(failure_message.MatchesExceptionCategory(
constants.EXCEPTION_CATEGORY_BUILD))
self.assertFalse(failure_message.MatchesExceptionCategory(
constants.EXCEPTION_CATEGORY_LAB))
class FailureMessageManagerTests(cros_test_lib.TestCase):
"""Tests for FailureMessageManager."""
def testCreateMessageForBuildScriptFailureMessage(self):
"""Test CreateMessage for BuildScriptFailureMessage."""
stage_failure = StageFailureHelper.GetStageFailure(
1, 1, 0, 'BuildScriptFailure', 'exception msg', 'build',
'{\"shortname\": \"./security_test_image\"', 'InitSDK')
failure_message = failure_message_lib.FailureMessageManager.CreateMessage(
stage_failure)
self.assertTrue(isinstance(failure_message,
failure_message_lib.BuildScriptFailureMessage))
def testCreateMessageForPackageBuildFailureMessage(self):
"""Test CreateMessage for PackageBuildFailureMessage."""
stage_failure = StageFailureHelper.GetStageFailure(
1, 1, 0, 'PackageBuildFailure', 'exception msg', 'build',
DEFAULT_PACKAGE_BUILD_FAILURE_EXTRA_INFO, 'BuildImage')
failure_message = failure_message_lib.FailureMessageManager.CreateMessage(
stage_failure)
self.assertTrue(isinstance(failure_message,
failure_message_lib.PackageBuildFailureMessage))
def testCreateMessageForStageFailureMessage(self):
"""Test CreateMessage for StageFailureMessage."""
stage_failure = StageFailureHelper.GetStageFailure(
1, 1, None, 'TestFailure', 'exception msg', 'build', None, 'VMTest')
failure_message = failure_message_lib.FailureMessageManager.CreateMessage(
stage_failure)
self.assertTrue(isinstance(failure_message,
failure_message_lib.StageFailureMessage))
def testReconstructMessagesOnMixedMsgs(self):
"""Test ReconstructMessages on mixed messages."""
failures = FailureMessageHelper.GetBuildFailureMessageWithMixedMsgs()
self.assertEqual(len(failures), 4)
failure_ids = [f.failure_id for f in failures]
self.assertItemsEqual(failure_ids, [4, 5, 6, 7])
for f in failures:
if f.failure_id == 4:
self.assertTrue(isinstance(
f, failure_message_lib.CompoundFailureMessage))
inner_failures = f.inner_failures
inner_failure_ids = [n_f.failure_id for n_f in inner_failures]
self.assertItemsEqual([1, 2, 3], inner_failure_ids)
def testReconstructMessagesOnEmptyMsgs(self):
"""Test ReconstructMessages on empty messages."""
failures = failure_message_lib.FailureMessageManager.ReconstructMessages([])
self.assertEqual(failures, [])
def testConstructStageFailureMessagesOnNonCompoundFailures(self):
"""Test ConstructStageFailureMessages on non-compound failures."""
entry_1 = StageFailureHelper.GetStageFailure(failure_id=1)
entry_2 = StageFailureHelper.GetStageFailure(failure_id=2)
entry_3 = StageFailureHelper.GetStageFailure(failure_id=3)
failure_entries = [entry_1, entry_2, entry_3]
failures = (
failure_message_lib.FailureMessageManager.ConstructStageFailureMessages(
failure_entries))
self.assertEqual(len(failures), 3)
failure_ids = [f.failure_id for f in failures]
self.assertItemsEqual(failure_ids, [1, 2, 3])
def testConstructStageFailureMessagesOnCompoundFailures(self):
"""Test ConstructStageFailureMessages on compound failures."""
entry_1 = StageFailureHelper.GetStageFailure(failure_id=1)
entry_2 = StageFailureHelper.GetStageFailure(
failure_id=2, outer_failure_id=1)
entry_3 = StageFailureHelper.GetStageFailure(
failure_id=3, outer_failure_id=1)
failure_entries = [entry_1, entry_2, entry_3]
failures = (
failure_message_lib.FailureMessageManager.ConstructStageFailureMessages(
failure_entries))
self.assertEqual(len(failures), 1)
f = failures[0]
self.assertEqual(f.failure_id, 1)
self.assertTrue(isinstance(f, failure_message_lib.CompoundFailureMessage))
inner_failure_ids = [n_f.failure_id for n_f in f.inner_failures]
self.assertItemsEqual([2, 3], inner_failure_ids)
class BuildFailureMessageTests(patch_unittest.MockPatchBase):
"""Tests for BuildFailureMessage."""
def ConstructBuildFailureMessage(self, message_summary="message_summary",
failure_messages=None, internal=True,
reason='reason', builder='builder'):
return failure_message_lib.BuildFailureMessage(
message_summary, failure_messages, internal, reason, builder)
def _GetBuildFailureMessageWithMixedMsgs(self):
failure_messages = (
FailureMessageHelper.GetBuildFailureMessageWithMixedMsgs())
build_failure = self.ConstructBuildFailureMessage(
failure_messages=failure_messages)
return build_failure
def testBuildFailureMessageToStr(self):
"""Test BuildFailureMessageToStr."""
build_failure = self._GetBuildFailureMessageWithMixedMsgs()
self.assertIsNotNone(build_failure.BuildFailureMessageToStr())
def testGetFailingStages(self):
"""Test GetFailingStages."""
build_failure = self._GetBuildFailureMessageWithMixedMsgs()
failing_stages = build_failure.GetFailingStages()
self.assertItemsEqual(failing_stages, ['Paygen', 'InitSDK', 'BuildImage'])
def testMatchesExceptionCategoryOnMixedFailuresReturnsFalse(self):
"""Test MatchesExceptionCategory on mixed failures returns False."""
build_failure = self._GetBuildFailureMessageWithMixedMsgs()
self.assertFalse(build_failure.MatchesExceptionCategory(
constants.EXCEPTION_CATEGORY_BUILD))
def testMatchesExceptionCategoryOnBuildFailuresReturnsTrue(self):
"""Test MatchesExceptionCategory on build failures returns True."""
failure_messages = [FailureMessageHelper.GetBuildScriptFailureMessage(),
FailureMessageHelper.GetPackageBuildFailureMessage()]
build_failure = self.ConstructBuildFailureMessage(
failure_messages=failure_messages)
self.assertTrue(build_failure.MatchesExceptionCategory(
constants.EXCEPTION_CATEGORY_BUILD))
def testMatchesExceptionCategoryOnCompoundFailuresReturnsTrue(self):
"""Test MatchesExceptionCategory on CompoundFailures returns True."""
f_1 = FailureMessageHelper.GetBuildScriptFailureMessage(
failure_id=1, outer_failure_id=3)
f_2 = FailureMessageHelper.GetPackageBuildFailureMessage(
failure_id=2, outer_failure_id=3)
f_3 = FailureMessageHelper.GetStageFailureMessage(failure_id=3)
f_4 = FailureMessageHelper.GetBuildScriptFailureMessage(failure_id=4)
failures = (failure_message_lib.FailureMessageManager.ReconstructMessages(
[f_1, f_2, f_3, f_4]))
build_failure = self.ConstructBuildFailureMessage(
failure_messages=failures)
self.assertTrue(build_failure.MatchesExceptionCategory(
constants.EXCEPTION_CATEGORY_BUILD))
def testMatchesExceptionCategoryOnCompoundFailuresReturnsFalse(self):
"""Test MatchesExceptionCategory on CompoundFailures returns False."""
f_1 = FailureMessageHelper.GetStageFailureMessage(
failure_id=1, outer_failure_id=3)
f_2 = FailureMessageHelper.GetPackageBuildFailureMessage(
failure_id=2, outer_failure_id=3)
f_3 = FailureMessageHelper.GetStageFailureMessage(failure_id=3)
f_4 = FailureMessageHelper.GetBuildScriptFailureMessage(failure_id=4)
failures = (failure_message_lib.FailureMessageManager.ReconstructMessages(
[f_1, f_2, f_3, f_4]))
build_failure = self.ConstructBuildFailureMessage(
failure_messages=failures)
self.assertFalse(build_failure.MatchesExceptionCategory(
constants.EXCEPTION_CATEGORY_BUILD))
def testHasExceptionCategoryOnMixedFailures(self):
"""Test HasExceptionCategory on mixed failures."""
build_failure = self._GetBuildFailureMessageWithMixedMsgs()
self.assertTrue(build_failure.HasExceptionCategory(
constants.EXCEPTION_CATEGORY_BUILD))
self.assertTrue(build_failure.HasExceptionCategory(
constants.EXCEPTION_CATEGORY_UNKNOWN))
self.assertFalse(build_failure.HasExceptionCategory(
constants.EXCEPTION_CATEGORY_INFRA))
self.assertFalse(build_failure.HasExceptionCategory(
constants.EXCEPTION_CATEGORY_LAB))
def testHasExceptionCategoryOnCompoundFailures(self):
"""Test HasExceptionCategory on CompoundFailures."""
f_1 = FailureMessageHelper.GetBuildScriptFailureMessage(
failure_id=1, outer_failure_id=3)
f_2 = FailureMessageHelper.GetPackageBuildFailureMessage(
failure_id=2, outer_failure_id=3)
f_3 = FailureMessageHelper.GetStageFailureMessage(failure_id=3)
failures = (failure_message_lib.FailureMessageManager.ReconstructMessages(
[f_1, f_2, f_3]))
build_failure = self.ConstructBuildFailureMessage(
failure_messages=failures)
self.assertTrue(build_failure.HasExceptionCategory(
constants.EXCEPTION_CATEGORY_BUILD))
self.assertTrue(build_failure.HasExceptionCategory(
constants.EXCEPTION_CATEGORY_UNKNOWN))
self.assertFalse(build_failure.HasExceptionCategory(
constants.EXCEPTION_CATEGORY_INFRA))
self.assertFalse(build_failure.HasExceptionCategory(
constants.EXCEPTION_CATEGORY_LAB))
def testMatchesFailureTypeOnMixedMsgs(self):
"""Test MatchesFailureType on mixed messages."""
build_failure = self._GetBuildFailureMessageWithMixedMsgs()
self.assertFalse(build_failure.MatchesFailureType(
'BuildScriptFailure'))
self.assertFalse(build_failure.MatchesFailureType(
'PackageBuildFailure'))
def testMatchesFailureTypeOnSingleTypeMsgs(self):
"""Test MatchesFailureType on single type messages."""
f_1 = FailureMessageHelper.GetBuildScriptFailureMessage(
failure_id=1, outer_failure_id=3)
f_2 = FailureMessageHelper.GetBuildScriptFailureMessage(
failure_id=2, outer_failure_id=3)
f_3 = FailureMessageHelper.GetStageFailureMessage(failure_id=3)
failures = (failure_message_lib.FailureMessageManager.ReconstructMessages(
[f_1, f_2, f_3]))
build_failure = self.ConstructBuildFailureMessage(
failure_messages=failures)
self.assertTrue(build_failure.MatchesFailureType(
'BuildScriptFailure'))
self.assertFalse(build_failure.MatchesFailureType(
'PackageBuildFailure'))
self.assertTrue(build_failure.HasFailureType(
'StepFailure'))
self.assertFalse(build_failure.HasFailureType(
'BackgroundFailure'))
def testHasFailureTypeOnMixedMsgs(self):
"""Test HasFailureType on mixed messages."""
build_failure = self._GetBuildFailureMessageWithMixedMsgs()
self.assertTrue(build_failure.HasFailureType(
'BuildScriptFailure'))
self.assertTrue(build_failure.HasFailureType(
'PackageBuildFailure'))
self.assertTrue(build_failure.HasFailureType(
'StepFailure'))
self.assertFalse(build_failure.HasFailureType(
'BackgroundFailure'))
def testIsPackageBuildFailureOnMixedMsgs(self):
"""Test IsPackageBuildFailure on mixed messages."""
build_failure = self._GetBuildFailureMessageWithMixedMsgs()
self.assertFalse(build_failure.IsPackageBuildFailure())
def testIsPackageBuildFailureOnPackageBuildFailures(self):
"""Test IsPackageBuildFailure on PackageBuildFailures."""
f_1 = FailureMessageHelper.GetPackageBuildFailureMessage(failure_id=1)
f_2 = FailureMessageHelper.GetPackageBuildFailureMessage(failure_id=2)
f_3 = FailureMessageHelper.GetPackageBuildFailureMessage(failure_id=3)
failures = (failure_message_lib.FailureMessageManager.ReconstructMessages(
[f_1, f_2, f_3]))
build_failure = self.ConstructBuildFailureMessage(
failure_messages=failures)
self.assertTrue(build_failure.IsPackageBuildFailure())
def _GetMockChanges(self):
mock_change_1 = self.MockPatch(
project='chromiumos/overlays/chromiumos-overlay')
mock_change_2 = self.MockPatch(
project='chromiumos/overlays/chromiumos-overlay')
mock_change_3 = self.MockPatch(project='chromiumos/chromite')
mock_change_4 = self.MockPatch(project='chromeos/chromeos-admin')
return [mock_change_1, mock_change_2, mock_change_3, mock_change_4]
def _CreateBuildFailure(self):
f_1 = FailureMessageHelper.GetPackageBuildFailureMessage(failure_id=1)
f_2 = FailureMessageHelper.GetPackageBuildFailureMessage(failure_id=2)
f_3 = FailureMessageHelper.GetPackageBuildFailureMessage(failure_id=3)
failures = (failure_message_lib.FailureMessageManager.ReconstructMessages(
[f_1, f_2, f_3]))
return self.ConstructBuildFailureMessage(
failure_messages=failures)
def testFindPackageBuildFailureSuspectsReturnsSuspects(self):
"""Test FindPackageBuildFailureSuspects which returns suspects."""
changes = self._GetMockChanges()
f_1 = FailureMessageHelper.GetPackageBuildFailureMessage(failure_id=1)
build_failure = self.ConstructBuildFailureMessage(failure_messages=[f_1])
self.PatchObject(portage_util, 'FindWorkonProjects',
return_value='chromiumos/overlays/chromiumos-overlay')
suspects, no_assignee_packages = (
build_failure.FindPackageBuildFailureSuspects(changes, f_1))
self.assertItemsEqual([changes[0], changes[1]], suspects)
self.assertFalse(no_assignee_packages)
self.PatchObject(portage_util, 'FindWorkonProjects',
return_value='chromiumos/chromite')
suspects, no_assignee_packages = (
build_failure.FindPackageBuildFailureSuspects(changes, f_1))
self.assertItemsEqual([changes[2]], suspects)
self.assertFalse(no_assignee_packages)
def testFindPackageBuildFailureSuspectsNoSuspects(self):
"""Test FindPackageBuildFailureSuspects which returns empty suspects."""
changes = self._GetMockChanges()
f_1 = FailureMessageHelper.GetPackageBuildFailureMessage(failure_id=1)
build_failure = self.ConstructBuildFailureMessage(failure_messages=[f_1])
self.PatchObject(portage_util, 'FindWorkonProjects',
return_value='chromiumos/third_party/kernel')
suspects, no_assignee_packages = (
build_failure.FindPackageBuildFailureSuspects(changes, f_1))
self.assertEqual(suspects, set())
self.assertTrue(no_assignee_packages)
def testFindPackageBuildFailureSuspectsNoFailedPackages(self):
"""Test FindPackageBuildFailureSuspects without FailedPackages."""
changes = self._GetMockChanges()
f_1 = FailureMessageHelper.GetPackageBuildFailureMessage(
failure_id=1, extra_info=None)
build_failure = self.ConstructBuildFailureMessage(failure_messages=[f_1])
self.PatchObject(portage_util, 'FindWorkonProjects',
return_value='chromiumos/overlays/chromiumos-overlay')
suspects, no_assignee_packages = (
build_failure.FindPackageBuildFailureSuspects(changes, f_1))
self.assertEqual(suspects, set())
self.assertFalse(no_assignee_packages)
def testFindSuspectedChangesOnPackageBuildFailuresNotBlameEverything(self):
"""Test FindSuspectedChanges on PackageBuildFailures not BlameEverything."""
changes = self._GetMockChanges()
f_1 = FailureMessageHelper.GetPackageBuildFailureMessage(failure_id=1)
build_failure = self.ConstructBuildFailureMessage(failure_messages=[f_1])
mock_find = self.PatchObject(failure_message_lib.BuildFailureMessage,
'FindPackageBuildFailureSuspects',
return_value=({changes[2]}, False))
suspects = build_failure.FindSuspectedChanges(
changes, mock.Mock(), mock.Mock(), True)
expected = triage_lib.SuspectChanges({
changes[0]: constants.SUSPECT_REASON_OVERLAY_CHANGE,
changes[1]: constants.SUSPECT_REASON_OVERLAY_CHANGE,
changes[2]: constants.SUSPECT_REASON_BUILD_FAIL})
self.assertEqual(suspects, expected)
mock_find.assert_called_once_with(changes, f_1)
mock_find.reset_mock()
suspects = build_failure.FindSuspectedChanges(
changes, mock.Mock(), mock.Mock(), False)
expected = expected = triage_lib.SuspectChanges({
changes[2]: constants.SUSPECT_REASON_BUILD_FAIL})
self.assertEqual(suspects, expected)
mock_find.assert_called_once_with(changes, f_1)
def testFindSuspectedChangesOnPackageBuildFailuresBlameEverything(self):
"""Test FindSuspectedChanges on PackageBuildFailures and BlameEverything."""
changes = self._GetMockChanges()
f_1 = FailureMessageHelper.GetPackageBuildFailureMessage(failure_id=1)
build_failure = self.ConstructBuildFailureMessage(failure_messages=[f_1])
mock_find = self.PatchObject(failure_message_lib.BuildFailureMessage,
'FindPackageBuildFailureSuspects',
return_value=({changes[2]}, True))
suspects = build_failure.FindSuspectedChanges(
changes, mock.Mock(), mock.Mock(), True)
expected = triage_lib.SuspectChanges({
changes[0]: constants.SUSPECT_REASON_UNKNOWN,
changes[1]: constants.SUSPECT_REASON_UNKNOWN,
changes[2]: constants.SUSPECT_REASON_BUILD_FAIL,
changes[3]: constants.SUSPECT_REASON_UNKNOWN})
self.assertEqual(suspects, expected)
mock_find.assert_called_once_with(changes, f_1)
mock_find.reset_mock()
suspects = build_failure.FindSuspectedChanges(
changes, mock.Mock(), mock.Mock(), False)
expected = triage_lib.SuspectChanges({
changes[2]: constants.SUSPECT_REASON_BUILD_FAIL})
self.assertEqual(suspects, expected)
mock_find.assert_called_once_with(changes, f_1)
def testFindSuspectedChangesOnHWTestFailuresNotBlameEverything(self):
"""Test FindSuspectedChanges on HWTestFailures do not blame everything."""
changes = self._GetMockChanges()
f_1 = FailureMessageHelper.GetTestFailureMessage(failure_id=1)
build_failure = self.ConstructBuildFailureMessage(failure_messages=[f_1])
mock_find = self.PatchObject(hwtest_results.HWTestResultManager,
'FindHWTestFailureSuspects',
return_value=({changes[2]}, False))
build_root = mock.Mock()
failed_hwtests = mock.Mock()
suspects = build_failure.FindSuspectedChanges(
changes, build_root, failed_hwtests, True)
expected = triage_lib.SuspectChanges({
changes[0]: constants.SUSPECT_REASON_OVERLAY_CHANGE,
changes[1]: constants.SUSPECT_REASON_OVERLAY_CHANGE,
changes[2]: constants.SUSPECT_REASON_TEST_FAIL})
self.assertEqual(suspects, expected)
mock_find.assert_called_once_with(changes, build_root, failed_hwtests)
mock_find.reset_mock()
suspects = build_failure.FindSuspectedChanges(
changes, build_root, failed_hwtests, False)
expected = expected = triage_lib.SuspectChanges({
changes[2]: constants.SUSPECT_REASON_TEST_FAIL})
self.assertEqual(suspects, expected)
mock_find.assert_called_once_with(changes, build_root, failed_hwtests)
def testFindSuspectedChangesOnHWTestFailuresBlameEverything(self):
"""Test FindSuspectedChanges on HWTestFailures and blame everything."""
changes = self._GetMockChanges()
f_1 = FailureMessageHelper.GetTestFailureMessage(failure_id=1)
build_failure = self.ConstructBuildFailureMessage(failure_messages=[f_1])
mock_find = self.PatchObject(hwtest_results.HWTestResultManager,
'FindHWTestFailureSuspects',
return_value=({changes[2]}, True))
build_root = mock.Mock()
failed_hwtests = mock.Mock()
suspects = build_failure.FindSuspectedChanges(
changes, build_root, failed_hwtests, True)
expected = triage_lib.SuspectChanges({
changes[0]: constants.SUSPECT_REASON_UNKNOWN,
changes[1]: constants.SUSPECT_REASON_UNKNOWN,
changes[2]: constants.SUSPECT_REASON_TEST_FAIL,
changes[3]: constants.SUSPECT_REASON_UNKNOWN})
self.assertEqual(suspects, expected)
mock_find.assert_called_once_with(changes, build_root, failed_hwtests)
mock_find.reset_mock()
suspects = build_failure.FindSuspectedChanges(
changes, build_root, failed_hwtests, False)
expected = triage_lib.SuspectChanges({
changes[2]: constants.SUSPECT_REASON_TEST_FAIL})
self.assertEqual(suspects, expected)
mock_find.assert_called_once_with(changes, build_root, failed_hwtests)
def testFindSuspectedChangesOnUnknownFailures(self):
"""Test FindSuspectedChanges on unknown failures."""
changes = self._GetMockChanges()
f_1 = FailureMessageHelper.GetStageFailureMessage(failure_id=1)
build_failure = self.ConstructBuildFailureMessage(failure_messages=[f_1])
mock_find_build_failure = self.PatchObject(
failure_message_lib.BuildFailureMessage,
'FindPackageBuildFailureSuspects',
return_value=({changes[2]}, True))
mock_find_hwtest_failure = self.PatchObject(
hwtest_results.HWTestResultManager,
'FindHWTestFailureSuspects',
return_value=({changes[2]}, False))
build_root = mock.Mock()
failed_hwtests = mock.Mock()
suspects = build_failure.FindSuspectedChanges(
changes, build_root, failed_hwtests, True)
expected = triage_lib.SuspectChanges({
changes[0]: constants.SUSPECT_REASON_UNKNOWN,
changes[1]: constants.SUSPECT_REASON_UNKNOWN,
changes[2]: constants.SUSPECT_REASON_UNKNOWN,
changes[3]: constants.SUSPECT_REASON_UNKNOWN})
self.assertEqual(suspects, expected)
mock_find_build_failure.assert_not_called()
mock_find_hwtest_failure.assert_not_called()
suspects = build_failure.FindSuspectedChanges(
changes, build_root, failed_hwtests, False)
expected = triage_lib.SuspectChanges()
self.assertEqual(suspects, expected)
mock_find_build_failure.assert_not_called()
mock_find_hwtest_failure.assert_not_called()