def get_mail_notifier_statuses(self, mail_notifiers): statuses = [] for mail_notifier in mail_notifiers: notifying_builders = mail_notifier['builders'] extra_recipients = mail_notifier['extraRecipients'] send_to_interested_useres = mail_notifier.get( 'sendToInterestedUsers', False) subject = mail_notifier.get('subject') if subject: statuses.append( MailNotifier( fromaddr=self._active_master.from_address, mode='problem', subject=subject, sendToInterestedUsers=send_to_interested_useres, extraRecipients=extra_recipients, lookup=master_utils.UsersAreEmails(), builders=notifying_builders)) else: statuses.append( MailNotifier( fromaddr=self._active_master.from_address, mode='problem', sendToInterestedUsers=send_to_interested_useres, extraRecipients=extra_recipients, lookup=master_utils.UsersAreEmails(), builders=notifying_builders)) return statuses
def test_buildFinished_mode_problem_ignores_successful_build(self): mn = MailNotifier('*****@*****.**', mode="problem") build = Mock() self.assertEqual(None, mn.buildFinished('dummyBuilder', build, SUCCESS))
def test_buildFinished_mode_passing_ignores_failed_build(self): mn = MailNotifier('*****@*****.**', mode=("passing", )) build = FakeBuildStatus(name="build") self.assertEqual(None, mn.buildFinished('dummyBuilder', build, FAILURE))
def test_buildFinished_mode_problem_ignores_successful_build(self): mn = MailNotifier('*****@*****.**', mode=("problem", )) build = FakeBuildStatus(name="build") self.assertEqual(None, mn.buildFinished('dummyBuilder', build, SUCCESS))
def test_buildFinished_ignores_unspecified_builders(self): mn = MailNotifier('*****@*****.**', builders=['a','b']) build = FakeBuildStatus() build.builder = Mock() self.assertEqual(None, mn.buildFinished('dummyBuilder', build, SUCCESS))
def test_buildMessage_addLogs(self): mn = MailNotifier('*****@*****.**', mode="change", addLogs=True) mn.buildMessageDict = Mock() mn.buildMessageDict.return_value = {"body":"body", "type":"text", "subject":"subject"} mn.createEmail = Mock("createEmail") mn._gotRecipients = Mock("_gotReceipients") mn._gotRecipients.return_value = None mn.master_status = Mock() mn.master_status.getTitle.return_value = 'TITLE' bldr = Mock(name="builder") builds = [ FakeBuildStatus(name='build1'), FakeBuildStatus(name='build2') ] logs = [ FakeLog('log1'), FakeLog('log2') ] for b, l in zip(builds, logs): b.builder = bldr b.results = 0 b.getSourceStamp.return_value = ss = Mock(name='ss') ss.patch = None ss.changes = [] b.getLogs.return_value = [ l ] d = mn.buildMessage("mybldr", builds, 0) def check(_): mn.createEmail.assert_called_with( dict(body='body\n\nbody\n\n', type='text', subject='subject'), 'mybldr', 'TITLE', 0, builds, [], logs) d.addCallback(check) return d
def setup(c, config): c["status"] = [] authz_cfg = authz.Authz(forceBuild=True, forceAllBuilds=True, stopBuild=True, stopAllBuilds=True, cancelPendingBuild=True, stopChange=True) c["status"].append(html.WebStatus(http_port=config["web_port"], authz=authz_cfg, change_hook_dialects={"base": True})) c["status"].append(words.IRC(host="irc.freenode.net", nick="sbbot", channels=["#sugar"], categories=["upstream"], notify_events={"successToFailure": 1, "failureToSuccess": 1})) c["status"].append(MailNotifier(fromaddr="*****@*****.**", mode=["problem"], lookup="sugarlabs.org", categories=["upstream"], extraRecipients=["*****@*****.**"])) c["status"].append(HttpStatusPush(serverUrl=str(config["status_url"])))
def test_buildFinished_mode_passing_ignores_failed_build(self): mn = MailNotifier('*****@*****.**', mode="passing") build = Mock() self.assertEqual(None, mn.buildFinished('dummyBuilder', build, FAILURE))
def test_buildsetFinished_sends_email(self): fakeBuildMessage = Mock() mn = MailNotifier('*****@*****.**', buildSetSummary=True, mode=("failing", "passing", "warnings"), builders=["Builder1", "Builder2"]) mn.buildMessage = fakeBuildMessage builder1 = Mock() builder1.getBuild = lambda number: build1 builder1.name = "Builder1" build1 = FakeBuildStatus() build1.results = FAILURE build1.finished = True build1.reason = "testReason" build1.getBuilder.return_value = builder1 builder2 = Mock() builder2.getBuild = lambda number: build2 builder2.name = "Builder2" build2 = FakeBuildStatus() build2.results = FAILURE build2.finished = True build2.reason = "testReason" build2.getBuilder.return_value = builder1 def fakeGetBuilder(buildername): return {"Builder1": builder1, "Builder2": builder2}[buildername] self.db = fakedb.FakeDBConnector(self) self.db.insertTestData([ fakedb.SourceStampSet(id=127), fakedb.Buildset(id=99, sourcestampsetid=127, results=SUCCESS, reason="testReason"), fakedb.BuildRequest(id=11, buildsetid=99, buildername='Builder1'), fakedb.Build(number=0, brid=11), fakedb.BuildRequest(id=12, buildsetid=99, buildername='Builder2'), fakedb.Build(number=0, brid=12), ]) mn.master = self # FIXME: Should be FakeMaster self.status = Mock() mn.master_status = Mock() mn.master_status.getBuilder = fakeGetBuilder mn.buildMessageDict = Mock() mn.buildMessageDict.return_value = { "body": "body", "type": "text", "subject": "subject" } mn.buildsetFinished(99, FAILURE) fakeBuildMessage.assert_called_with("(whole buildset)", [build1, build2], SUCCESS)
def test_builderAdded_ignores_unspecified_categories(self): mn = MailNotifier('*****@*****.**', categories=['fast']) builder = Mock() builder.category = 'slow' self.assertEqual(None, mn.builderAdded('dummyBuilder', builder)) self.assert_(builder not in mn.watched)
def test_buildFinished_ignores_unspecified_categories(self): mn = MailNotifier('*****@*****.**', categories=['fast']) build = FakeBuildStatus(name="build") build.builder = Mock() build.builder.category = 'slow' self.assertEqual(None, mn.buildFinished('dummyBuilder', build, SUCCESS))
def test_buildFinished_mode_change_ignores_first_build(self): mn = MailNotifier('*****@*****.**', mode="change") build = FakeBuildStatus(name="build") build.getPreviousBuild.return_value = None self.assertEqual(None, mn.buildFinished('dummyBuilder', build, FAILURE)) self.assertEqual(None, mn.buildFinished('dummyBuilder', build, SUCCESS))
def test_builderAdded_ignores_unspecified_tags(self): mn = MailNotifier('*****@*****.**', tags=['fast']) builder = fakemaster.FakeBuilderStatus(self.master) builder.setTags(['slow']) self.assertEqual(None, mn.builderAdded('dummyBuilder', builder)) self.assert_(builder not in mn.watched)
def notify(self, *recipients): BuildmasterConfig['status'].append(MailNotifier( builders=[self.name], extraRecipients=recipients, fromaddr=BrainConfig['emailFrom'], messageFormatter=html_message_formatter, mode=['change', 'failing'], sendToInterestedUsers=False))
def test_buildFinished_mode_all_always_sends_email(self): mock_method = Mock() self.patch(MailNotifier, "buildMessage", mock_method) mn = MailNotifier('*****@*****.**', mode="all") build = FakeBuildStatus(name="build") mn.buildFinished('dummyBuilder', build, FAILURE) mock_method.assert_called_with('dummyBuilder', [build], FAILURE)
def run_simple_test_ignores_email_for_mode(self, mode, result): mock_method = Mock() self.patch(MailNotifier, "buildMessage", mock_method) mn = MailNotifier('*****@*****.**', mode=mode) build = FakeBuildStatus(name="build") mn.buildFinished('dummyBuilder', build, result) self.assertFalse(mock_method.called)
def test_builderAdded_ignores_unspecified_categories(self): # categories are deprecated, but leave a test for it until we remove it mn = MailNotifier('*****@*****.**', categories=['fast']) builder = fakemaster.FakeBuilderStatus(self.master) builder.setTags(['slow']) self.assertEqual(None, mn.builderAdded('dummyBuilder', builder)) self.assert_(builder not in mn.watched)
def test_buildFinished_mode_problem_ignores_two_failed_builds_in_sequence(self): mn = MailNotifier('*****@*****.**', mode="problem") build = FakeBuildStatus(name="build") old_build = FakeBuildStatus(name="old_build") build.getPreviousBuild.return_value = old_build old_build.getResults.return_value = FAILURE self.assertEqual(None, mn.buildFinished('dummyBuilder', build, FAILURE))
def test_createEmail_extraHeaders_one_build(self): builds = [FakeBuildStatus(name="build")] msgdict = create_msgdict() mn = MailNotifier('*****@*****.**', extraHeaders=dict(hhh='vvv')) # add some Unicode to detect encoding problems m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, builds) txt = m.as_string() self.assertIn('rndr(hhh): rndr(vvv)', txt)
def test_buildFinished_ignores_unspecified_tags(self): mn = MailNotifier('*****@*****.**', tags=['fast']) build = FakeBuildStatus(name="build") build.builder = fakemaster.FakeBuilderStatus(self.master) build.builder.setTags(['slow']) build.getBuilder = lambda: build.builder self.assertEqual( None, mn.buildFinished('dummyBuilder', build, SUCCESS))
def test_buildFinished_ignores_unspecified_categories(self): mn = MailNotifier('*****@*****.**', categories=['fast']) build = Mock() builder = Mock() build.getBuilder.return_value = builder builder.category = 'slow' self.assertEqual(None, mn.buildFinished('dummyBuilder', build, SUCCESS))
def test_createEmail_message_with_nonascii_patch(self): builds = [ FakeBuildStatus(name="build") ] msgdict = create_msgdict() patches = [ ['', '\x99\xaa', ''] ] logs = [ FakeLog('simple log') ] mn = MailNotifier('*****@*****.**', addLogs=True) m = mn.createEmail(msgdict, u'builder', u'pr', SUCCESS, builds, patches, logs) txt = m.as_string() self.assertIn('application/octet-stream', txt)
def test_createEmail_message_without_patch_and_log_contains_unicode(self): builds = [ FakeBuildStatus(name="build") ] msgdict = create_msgdict() mn = MailNotifier('*****@*****.**') m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, builds) try: m.as_string() except UnicodeEncodeError: self.fail('Failed to call as_string() on email message.')
def test_createEmail_extraHeaders_two_builds(self): builds = [ FakeBuildStatus(name="build1"), FakeBuildStatus(name="build2") ] msgdict = create_msgdict() mn = MailNotifier('*****@*****.**', extraHeaders=dict(hhh='vvv')) m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS, builds) txt = m.as_string() # note that the headers are *not* rendered self.assertIn('hhh: vvv', txt)
def test_buildsetFinished_sends_email(self): fakeBuildMessage = Mock() mn = MailNotifier('*****@*****.**', buildSetSummary=True, mode=("failing", "passing", "warnings"), builders=["Builder"]) mn.buildMessage = fakeBuildMessage def fakeGetBuild(number): return build def fakeGetBuilder(buildername): if buildername == builder.name: return builder return None def fakeGetBuildRequests(self, bsid): return defer.succeed([{"buildername": "Builder", "brid": 1}]) builder = Mock() builder.getBuild = fakeGetBuild builder.name = "Builder" build = FakeBuildStatus() build.results = FAILURE build.finished = True build.reason = "testReason" build.getBuilder.return_value = builder self.db = fakedb.FakeDBConnector(self) self.db.insertTestData([ fakedb.SourceStampSet(id=127), fakedb.Buildset(id=99, sourcestampsetid=127, results=SUCCESS, reason="testReason"), fakedb.BuildRequest(id=11, buildsetid=99, buildername='Builder'), fakedb.Build(number=0, brid=11), ]) mn.master = self # FIXME: Should be FakeMaster self.status = Mock() mn.master_status = Mock() mn.master_status.getBuilder = fakeGetBuilder mn.buildMessageDict = Mock() mn.buildMessageDict.return_value = { "body": "body", "type": "text", "subject": "subject" } mn.buildsetFinished(99, FAILURE) fakeBuildMessage.assert_called_with("Buildset Complete: testReason", [build], SUCCESS)
def test_buildFinished_ignores_unspecified_categories(self): # categories are deprecated, but test them until they're removed mn = MailNotifier('*****@*****.**', categories=['fast']) build = FakeBuildStatus(name="build") build.builder = fakemaster.FakeBuilderStatus(self.master) build.builder.setTags(['slow']) build.getBuilder = lambda: build.builder self.assertEqual( None, mn.buildFinished('dummyBuilder', build, SUCCESS))
def test_createEmail_message_without_patch_and_log_contains_unicode(self): msgdict = dict( body=u'Unicode body with non-ascii (\u00E5\u00E4\u00F6).', type='plain') mn = MailNotifier('*****@*****.**') m = mn.createEmail(msgdict, u'builder-n\u00E5me', u'project-n\u00E5me', SUCCESS) try: m.as_string() except UnicodeEncodeError: self.fail('Failed to call as_string() on email message.')
def test_buildsetComplete_doesnt_send_email(self): fakeBuildMessage = Mock() mn = MailNotifier('*****@*****.**', buildSetSummary=True, mode=("failing", "warnings"), builders=["Builder"]) mn.buildMessage = fakeBuildMessage def fakeGetBuild(number): return build def fakeGetBuilder(buildername): if buildername == builder.name: return builder return None def fakeGetBuildRequests(self, bsid): return defer.succeed([{"buildername": "Builder", "brid": 1}]) builder = Mock() builder.getBuild = fakeGetBuild builder.name = "Builder" build = FakeBuildStatus() build.results = SUCCESS build.finished = True build.reason = "testReason" build.getBuilder.return_value = builder build.getResults.return_value = build.results self.db = self.master.db self.db.insertTestData([ fakedb.Master(id=92), fakedb.Buildslave(id=13, name='sl'), fakedb.Buildset(id=99, results=SUCCESS, reason="testReason"), fakedb.Builder(id=80, name='Builder'), fakedb.BuildRequest(id=11, buildsetid=99, builderid=80), fakedb.Build(number=0, buildrequestid=11, buildslaveid=13, masterid=92), ]) self.setupMailNotifier(mn) mn.master_status.getBuilder = fakeGetBuilder mn.buildMessageDict = Mock() mn.buildMessageDict.return_value = {"body": "body", "type": "text", "subject": "subject"} d = mn._buildsetComplete('buildset.99.complete', dict(bsid=99, result=FAILURE)) @d.addCallback def check(_): self.assertFalse(fakeBuildMessage.called) return d
def test_valid_emails(self): valid_emails = [ '*****@*****.**', # + comment in local part '[email protected].', # root dot 'My Name <*****@*****.**>', # With full name '<*****@*****.**>', # With <> 'My Name <[email protected].>', # With full name (root dot) '[email protected]'] # IDN TLD (.misr, Egypt) # If any of these email addresses fail, the test fails by # MailNotifier raising a ConfigErrors exception. MailNotifier('*****@*****.**', extraRecipients=valid_emails)
def test_builderAdded_subscribes_to_all_builders_by_default(self): mn = MailNotifier('*****@*****.**') builder = Mock() builder.category = 'slow' builder2 = Mock() builder2.category = None self.assertEqual(mn, mn.builderAdded('dummyBuilder', builder)) self.assertEqual(mn, mn.builderAdded('dummyBuilder2', builder2)) self.assertTrue(builder in mn.watched) self.assertTrue(builder2 in mn.watched)