Пример #1
0
 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
Пример #2
0
    def test_buildFinished_mode_problem_ignores_successful_build(self):
        mn = MailNotifier('*****@*****.**', mode="problem")

        build = Mock()

        self.assertEqual(None, mn.buildFinished('dummyBuilder', build,
                                                SUCCESS))
Пример #3
0
    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))
Пример #4
0
    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))
Пример #5
0
    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))
Пример #6
0
    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
Пример #7
0
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"])))
Пример #8
0
    def test_buildFinished_mode_passing_ignores_failed_build(self):
        mn = MailNotifier('*****@*****.**', mode="passing")

        build = Mock()

        self.assertEqual(None, mn.buildFinished('dummyBuilder', build,
                                                FAILURE))
Пример #9
0
    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)
Пример #10
0
    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)
Пример #11
0
    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))
Пример #12
0
    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))
Пример #13
0
    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)
Пример #14
0
 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))
Пример #15
0
    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)
Пример #16
0
    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)
Пример #17
0
    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)
Пример #18
0
    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))
Пример #19
0
 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)
Пример #20
0
    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))
Пример #21
0
    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))
Пример #22
0
 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)
Пример #23
0
 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.')
Пример #24
0
 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)
Пример #25
0
    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)
Пример #26
0
    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.')
Пример #28
0
    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
Пример #29
0
    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)
Пример #30
0
    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)