def testDuplicateIssue(self): """Dedupe to an existing issue when one is found. Confirms that we call AppendTrackerIssueById with the same issue returned by the issue search. """ self.mox.StubOutWithMock(reporting.Reporter, 'find_issue_by_marker') self.mox.StubOutWithMock(reporting.TestBug, 'summary') issue = self.mox.CreateMock(phapi_lib.Issue) issue.id = self._FAKE_ISSUE_ID issue.labels = [] issue.state = constants.ISSUE_OPEN client = phapi_lib.ProjectHostingApiClient(mox.IgnoreArg(), mox.IgnoreArg()) client.update_issue(self._FAKE_ISSUE_ID, mox.IgnoreArg()) reporting.Reporter.find_issue_by_marker( mox.IgnoreArg()).AndReturn(issue) reporting.TestBug.summary().AndReturn('') self.mox.ReplayAll() bug_id, bug_count = reporting.Reporter().report(self._get_failure()) self.assertEqual(bug_id, self._FAKE_ISSUE_ID) self.assertEqual(bug_count, 2)
def testProjectLabelExtraction(self): """Test that the project label is correctly extracted from the title.""" TITLE_EMPTY = '' TITLE_NO_PROJ = '[stress] platformDevice Failure on release/47-75.0.0' TITLE_PROJ = '[stress] p_Device Failure on rikku-release/R44-7075.0.0' TITLE_PROJ2 = '[stress] p_Device Failure on ' \ 'rikku-freon-release/R44-7075.0.0' TITLE_PROJ_SUBBOARD = '[stress] p_Device Failure on ' \ 'veyron_rikku-release/R44-7075.0.0' client = phapi_lib.ProjectHostingApiClient(mox.IgnoreArg(), mox.IgnoreArg()) self.mox.ReplayAll() reporter = reporting.Reporter() self.assertEqual(reporter._get_project_label_from_title(TITLE_EMPTY), '') self.assertEqual(reporter._get_project_label_from_title(TITLE_NO_PROJ), '') self.assertEqual(reporter._get_project_label_from_title(TITLE_PROJ), 'Proj-rikku') self.assertEqual(reporter._get_project_label_from_title(TITLE_PROJ2), 'Proj-rikku') self.assertEqual( reporter._get_project_label_from_title(TITLE_PROJ_SUBBOARD), 'Proj-rikku')
def testReturnNoneIfMarkerIsNone(self): """Test that we do not look up an issue if the search marker is None.""" mock_host = phapi_lib.ProjectHostingApiClient(mox.IgnoreArg(), mox.IgnoreArg()) self.mox.ReplayAll() result = reporting.Reporter().find_issue_by_marker(None) self.assertTrue(result is None)
def __init__(self): if not fundamental_libs: logging.warning("Bug filing disabled due to missing imports.") return try: self._phapi_client = phapi_lib.ProjectHostingApiClient( self.get_creds_abspath(), self._project_name) except phapi_lib.ProjectHostingApiException as e: logging.error('Unable to create project hosting api client: %s', e) self._phapi_client = None
def test_summary_returned_untouched_if_no_search_maker(self): """Test that we just return the summary if we have no search marker.""" mock_host = phapi_lib.ProjectHostingApiClient(mox.IgnoreArg(), mox.IgnoreArg()) bug = reporting.Bug('title', 'summary', None) self.mox.ReplayAll() result = reporting.Reporter()._anchor_summary(bug) self.assertEqual(result, 'summary')
def test_append_anchor_to_summary_if_search_marker(self): """Test that we add an anchor to the search marker.""" mock_host = phapi_lib.ProjectHostingApiClient(mox.IgnoreArg(), mox.IgnoreArg()) bug = reporting.Bug('title', 'summary', 'marker') self.mox.ReplayAll() result = reporting.Reporter()._anchor_summary(bug) self.assertEqual( result, 'summary\n\n%smarker\n' % reporting.Reporter._SEARCH_MARKER)
def testWithSearchMarkerSetToNoneIsNotDeduped(self): """Test that we do not dedupe bugs that have no search marker.""" bug = reporting.Bug('title', 'summary', search_marker=None) mock_host = phapi_lib.ProjectHostingApiClient(mox.IgnoreArg(), mox.IgnoreArg()) mock_host.create_issue(mox.IgnoreArg()).AndReturn( {'id': self._FAKE_ISSUE_ID}) self.mox.ReplayAll() bug_id, bug_count = reporting.Reporter().report(bug) self.assertEqual(bug_id, self._FAKE_ISSUE_ID) self.assertEqual(bug_count, 1)
def testFailedBugFiling(self): """ Make sure the suite survives even if we cannot file bugs. """ test_results = self._createSuiteMockResults(self.tmpdir) self.schedule_and_expect_these_results( self.suite, [test_results[0] + test_results[1]], self.recorder) self.mox.StubOutWithMock(reporting.Reporter, '_check_tracker') self.mox.StubOutClassWithMocks(phapi_lib, 'ProjectHostingApiClient') mock_host = phapi_lib.ProjectHostingApiClient(mox.IgnoreArg(), mox.IgnoreArg()) reporting.Reporter._check_tracker().AndReturn(False) self.mox.ReplayAll() self.suite.schedule(self.recorder.record_entry, True) self.suite._jobs_to_tests[self._FAKE_JOB_ID] = self.files['seven'] self.suite.wait(self.recorder.record_entry)
def mock_bug_filing(self, test_results): """A helper function that mocks bug filing. @param test_results: A named tuple (predicates, fallout) representing a bad test report. """ def check_result(result): """ Checks to see if the status passed to the bug reporter contains all the arguments required to file bugs. @param result: The result we get when a test fails. """ test_predicates = test_results[0] test_fallout = test_results[1] expected_result = job_status.Status( test_predicates.status, test_predicates.testname, reason=test_predicates.reason, job_id=test_fallout.job_id, owner=test_fallout.username, hostname=test_fallout.hostname, begin_time_str=test_fallout.time_start) return all( getattr(result, k, None) == v for k, v in expected_result.__dict__.iteritems() if 'timestamp' not in str(k)) self.mox.StubOutWithMock(reporting, 'TestBug') reporting.TestBug(self._BUILDS[provision.CROS_VERSION_PREFIX], mox.IgnoreArg(), mox.IgnoreArg(), mox.Func(check_result)) self.mox.StubOutClassWithMocks(phapi_lib, 'ProjectHostingApiClient') mock_host = phapi_lib.ProjectHostingApiClient(mox.IgnoreArg(), mox.IgnoreArg()) self.mox.StubOutWithMock(reporting.Reporter, 'report') reporting.Reporter.report(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn( (0, 0)) self.mox.StubOutWithMock(utils, 'write_keyval') utils.write_keyval(mox.IgnoreArg(), mox.IgnoreArg())
def testGenericBugCanBeFiled(self): """Test that we can use a Bug object to file a bug report.""" self.mox.StubOutWithMock(reporting.Reporter, 'find_issue_by_marker') bug = reporting.Bug('title', 'summary', 'marker') reporting.Reporter.find_issue_by_marker( mox.IgnoreArg()).AndReturn(None) mock_host = phapi_lib.ProjectHostingApiClient(mox.IgnoreArg(), mox.IgnoreArg()) mock_host.create_issue(mox.IgnoreArg()).AndReturn( {'id': self._FAKE_ISSUE_ID}) self.mox.ReplayAll() bug_id, bug_count = reporting.Reporter().report(bug) self.assertEqual(bug_id, self._FAKE_ISSUE_ID) self.assertEqual(bug_count, 1)
def _test_count_label_update(self, labels, remove, expected_count): """Utility to test _create_autofiled_count_update(). @param labels Input list of labels. @param remove List of labels expected to be removed in the result. @param expected_count Count value expected to be returned from the call. """ client = phapi_lib.ProjectHostingApiClient(mox.IgnoreArg(), mox.IgnoreArg()) self.mox.ReplayAll() issue = self.mox.CreateMock(gdata_lib.Issue) issue.labels = labels reporter = reporting.Reporter() new_labels, count = reporter._create_autofiled_count_update(issue) expected = map(lambda l: '-' + l, remove) expected.append(self._create_count_label(expected_count)) self.assertEqual(new_labels, expected) self.assertEqual(count, expected_count)
def testNewIssue(self): """Add a new issue to the tracker when a matching issue isn't found. Confirms that we call CreateTrackerIssue when an Issue search returns None. """ self.mox.StubOutWithMock(reporting.Reporter, 'find_issue_by_marker') self.mox.StubOutWithMock(reporting.TestBug, 'summary') client = phapi_lib.ProjectHostingApiClient(mox.IgnoreArg(), mox.IgnoreArg()) client.create_issue(mox.IgnoreArg()).AndReturn( {'id': self._FAKE_ISSUE_ID}) reporting.Reporter.find_issue_by_marker( mox.IgnoreArg()).AndReturn(None) reporting.TestBug.summary().AndReturn('') self.mox.ReplayAll() bug_id, bug_count = reporting.Reporter().report(self._get_failure()) self.assertEqual(bug_id, self._FAKE_ISSUE_ID) self.assertEqual(bug_count, 1)
def testSuiteIssueConfig(self): """Test that the suite bug template values are not overridden.""" def check_suite_options(issue): """ Checks to see if the options specified in bug_template reflect in the issue we're about to file, and that the autofiled label was not lost in the process. @param issue: issue to check labels on. """ assert ('autofiled' in issue.labels) for k, v in self.bug_template.iteritems(): if (isinstance(v, list) and all(item in getattr(issue, k) for item in v)): continue if v and getattr(issue, k) is not v: return False return True self.mox.StubOutWithMock(reporting.Reporter, '_find_issue_by_marker') self.mox.StubOutWithMock(reporting.TestBug, 'summary') reporting.Reporter._find_issue_by_marker( mox.IgnoreArg()).AndReturn(None) reporting.TestBug.summary().AndReturn('Summary') mock_host = phapi_lib.ProjectHostingApiClient(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg()) mock_host.create_issue(mox.IgnoreArg()).AndReturn( {'id': self._FAKE_ISSUE_ID}) self.mox.ReplayAll() bug_id, bug_count = reporting.Reporter().report( self._get_failure(), self.bug_template) self.assertEqual(bug_id, self._FAKE_ISSUE_ID) self.assertEqual(bug_count, 1)