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 run_fake_single_build(self, gsp, buildResult):
        build = FakeBuildStatus(name="build")
        build.getProperty = self.TEST_PROPS.get

        gsp.buildFinished('dummyBuilder', build, buildResult)

        return defer.succeed(str({'name': 'dummyBuilder', 'result': buildResult}))
Beispiel #3
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))
    def run_fake_summary_build(self, gsp, buildResults, finalResult,
                               resultText):
        buildpairs = []
        i = 0
        for i in xrange(len(buildResults)):
            buildResult = buildResults[i]

            builder = Mock()
            build = FakeBuildStatus()

            builder.getBuild.return_value = build
            builder.name = "Builder-%d" % i
            builder.getName.return_value = builder.name

            build.results = buildResult
            build.finished = True
            build.reason = "testReason"
            build.getBuilder.return_value = builder
            build.getResults.return_value = build.results
            build.getText.return_value = ['buildText']
            build.getProperty = self.TEST_PROPS.get

            buildpairs.append((builder, build))

        def fakeGetBuilder(buildername):
            # e.g. Builder-5 will be buildpairs[5][0]
            return buildpairs[int(buildername.split("-")[1])][0]

        gsp.master_status.getBuilder = fakeGetBuilder
        gsp.master_status.getURLForThing = Mock()
        gsp.master_status.getURLForThing.return_value = self.THING_URL

        gsp.master.db = fakedb.FakeDBConnector(self)

        fakedata = [
            fakedb.SourceStampSet(id=127),
            fakedb.Buildset(id=99, sourcestampsetid=127, results=finalResult, reason="testReason")
        ]

        breqid = 1000
        for (builder, build) in buildpairs:
            fakedata.append(fakedb.BuildRequest(id=breqid, buildsetid=99,
                                                buildername=builder.name))
            fakedata.append(fakedb.Build(number=0, brid=breqid))
            breqid = breqid + 1

        gsp.master.db.insertTestData(fakedata)

        d = gsp._buildsetComplete(99, finalResult)

        @d.addCallback
        def check(_):
            info = []
            for i in xrange(len(buildResults)):
                info.append({'name': "Builder-%d" % i, 'result': buildResults[i],
                             'resultText': resultText[i], 'text': 'buildText',
                             'url': self.THING_URL})
            return str(info)
        return d
Beispiel #5
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))
Beispiel #6
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))
Beispiel #7
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))
    def run_fake_single_build(self, gsp, buildResult):
        build = FakeBuildStatus(name="build")
        build.getProperty = self.TEST_PROPS.get

        gsp.buildStarted(self.TEST_BUILDER_NAME, build)
        gsp.buildFinished(self.TEST_BUILDER_NAME, build, buildResult)

        return defer.succeed(str({'name': self.TEST_BUILDER_NAME,
                                  'result': buildResult}))
Beispiel #9
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))
Beispiel #10
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.BuildRequest(id=11, buildsetid=99, buildername='Builder'),
            fakedb.Build(number=0, buildrequestid=11, buildslaveid=13,
                         masterid=92),
        ])
        mn.master = self.master

        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"}

        d = mn._buildsetComplete('buildset.99.complete',
                                 dict(bsid=99, result=FAILURE))

        @d.addCallback
        def check(_):
            self.assertFalse(fakeBuildMessage.called)
        return d
    def run_fake_single_build(self, gsp, buildResult, expWarning=False):
        build = FakeBuildStatus(name="build")
        build.getProperty = self.TEST_PROPS.get

        gsp.buildFinished('dummyBuilder', build, buildResult)

        if expWarning:
            self.assertEqual([w['message'] for w in self.flushWarnings()],
                             ['The Gerrit status callback uses the old '
                              'way to communicate results.  The outcome '
                              'might be not what is expected.'])

        return defer.succeed(str({'name': 'dummyBuilder', 'result': buildResult}))
    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 run_fake_build(self, notifier, info=None):
        notifier.master = fakemaster.make_master()
        notifier.master_status = notifier.master.status

        builders = []
        builds = []

        for i in [0, 1, 2]:
            builder = Mock()
            build = FakeBuildStatus()

            builder.getBuild.return_value = build
            builder.name = "Builder%d" % i

            build.results = SUCCESS
            build.finished = True
            build.reason = "testReason"
            build.getBuilder.return_value = builder

            builders.append(builder)
            builds.append(build)

        def fakeGetBuilder(buildername):
            return {"Builder0": builders[0], "Builder1": builders[1], "Builder2": builders[2]}[buildername]

        notifier.master_status.getBuilder = fakeGetBuilder
        notifier.master.db = fakedb.FakeDBConnector(notifier.master, self)

        notifier.master.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='Builder0'),
            fakedb.Builder(id=81, name='Builder1'),
            fakedb.Builder(id=82, name='Builder2'),
            fakedb.BuildRequest(id=10, buildsetid=99, builderid=80),
            fakedb.Build(number=0, buildrequestid=10, masterid=92, buildslaveid=13),
            fakedb.BuildRequest(id=11, buildsetid=99, builderid=81),
            fakedb.Build(number=0, buildrequestid=11, masterid=92, buildslaveid=13),
            fakedb.BuildRequest(id=12, buildsetid=99, builderid=82),
            fakedb.Build(number=0, buildrequestid=12, masterid=92, buildslaveid=13)
        ])

        if info is not None:
            info['bsid'] = 99
            info['builds'] = builds

        d = notifier._buildsetComplete('buildset.99.complete',
                                       {'bsid': 99, 'result': SUCCESS})
        return d
    def run_fake_single_build(self, buildResult, verifiedScore):
        gsp = GerritStatusPush('host.example.com', 'username', reviewCB=testReviewCB)
        self.run_prepare_gsp(gsp)

        fakeSCR = Mock()
        gsp.sendCodeReview = fakeSCR

        build = FakeBuildStatus(name="build")
        build.getProperty = lambda prop: self.TEST_PROPS.get(prop)

        gsp.buildFinished('dummyBuilder', build, buildResult)

        fakeSCR.assert_called_once_with(self.TEST_PROJECT, self.TEST_REVISION,
                                        str({'name': 'dummyBuilder', 'result': buildResult}),
                                        verifiedScore, 0)
    def test_buildsetComplete_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
        build1.getResults.return_value = build1.results

        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
        build2.getResults.return_value = build2.results

        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._buildsetComplete(99, FAILURE)
        fakeBuildMessage.assert_called_with("(whole buildset)",
                                            [build1, build2], SUCCESS)
Beispiel #16
0
    def run_fake_build(self, notifier, info=None):
        notifier.master = fakemaster.make_master()
        notifier.master_status = notifier.master.status

        builders = []
        builds = []

        for i in [0, 1, 2]:
            builder = Mock()
            build = FakeBuildStatus()

            builder.getBuild.return_value = build
            builder.name = "Builder%d" % i

            build.results = SUCCESS
            build.finished = True
            build.reason = "testReason"
            build.getBuilder.return_value = builder

            builders.append(builder)
            builds.append(build)

        def fakeGetBuilder(buildername):
            return {"Builder0": builders[0], "Builder1": builders[1], "Builder2": builders[2]}[buildername]

        notifier.master_status.getBuilder = fakeGetBuilder
        notifier.master.db = fakedb.FakeDBConnector(self)

        notifier.master.db.insertTestData([
            fakedb.SourceStampSet(id=127),
            fakedb.Buildset(id=99, sourcestampsetid=127, results=SUCCESS, reason="testReason"),
            fakedb.BuildRequest(id=10, buildsetid=99, buildername="Builder0"),
            fakedb.Build(number=0, brid=10),
            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)
        ])

        if info is not None:
            info['bsid'] = 99
            info['builds'] = builds

        d = notifier._buildsetComplete(99, SUCCESS)
        return d
Beispiel #17
0
    def do_test_createEmail_cte(self, funnyChars, expEncoding):
        builds = [FakeBuildStatus(name='build')]
        msgdict = create_msgdict(funnyChars)
        mn = MailNotifier('*****@*****.**')
        d = mn.createEmail(msgdict, u'builder-name', u'project-name', SUCCESS,
                           builds)

        @d.addCallback
        def callback(m):
            cte_lines = [
                l for l in m.as_string().split("\n")
                if l.startswith('Content-Transfer-Encoding:')
            ]
            self.assertEqual(cte_lines,
                             ['Content-Transfer-Encoding: %s' % expEncoding],
                             repr(m.as_string()))

        return d
    def testStopBuild(self):
        b = self.build

        step = Mock()
        step.return_value = step
        b.setStepFactories([FakeStepFactory(step)])

        def startStep(*args, **kw):
            # Now interrupt the build
            b.stopBuild("stop it")
            return defer.Deferred()
        step.startStep = startStep

        b.startBuild(FakeBuildStatus(), None, self.slavebuilder)

        self.assertEqual(b.result, CANCELLED)

        self.assert_(('interrupt', ('stop it',), {}) in step.method_calls)
Beispiel #19
0
    def testAddStepsAfterCurrentStep(self):
        b = self.build

        steps = self.create_fake_steps(["a", "b", "c"])

        def startStepB(*args, **kw):
            new_steps = self.create_fake_steps(["d", "e"])
            b.addStepsAfterCurrentStep([FakeStepFactory(s) for s in new_steps])
            return SUCCESS

        steps[1].startStep = startStepB
        b.setStepFactories([FakeStepFactory(s) for s in steps])

        yield b.startBuild(FakeBuildStatus(), self.workerforbuilder)
        self.assertEqual(b.results, SUCCESS)
        expected_names = ["a", "b", "d", "e", "c"]
        executed_names = [s.name for s in b.executedSteps]
        self.assertEqual(executed_names, expected_names)
Beispiel #20
0
    def testStopBuild(self):
        b = self.build

        step = FakeBuildStep()
        b.setStepFactories([FakeStepFactory(step)])

        def startStep(*args, **kw):
            # Now interrupt the build
            b.stopBuild("stop it")
            return defer.Deferred()

        step.startStep = startStep

        b.startBuild(FakeBuildStatus(), self.workerforbuilder)

        self.assertEqual(b.results, CANCELLED)

        self.assertIn('stop it', step.interrupted)
Beispiel #21
0
 def setUp(self):
     self.setUpTestReactor()
     self.props = {}
     r = FakeRequest()
     r.sources = []
     r.sources.append(FakeSource())
     r.sources[0].changes = [FakeChange()]
     r.sources[0].repository = "http://svn-repo-A"
     r.sources[0].codebase = "A"
     r.sources[0].branch = "develop"
     r.sources[0].revision = "12345"
     self.build = Build([r])
     self.build.setStepFactories([])
     self.builder = FakeBuilder(fakemaster.make_master(self, wantData=True))
     self.build.setBuilder(self.builder)
     self.build.build_status = FakeBuildStatus()
     # record properties that will be set
     self.build.properties.setProperty = self.setProperty
Beispiel #22
0
 def test_createEmail_message_with_patch_and_log_containing_unicode(self):
     builds = [ FakeBuildStatus(name="build") ]
     msgdict = create_msgdict()
     patches = [ ['', u'\u00E5\u00E4\u00F6', ''] ]
     msg = u'Unicode log with non-ascii (\u00E5\u00E4\u00F6).'
     # add msg twice: as unicode and already encoded
     logs = [ FakeLog(msg), FakeLog(msg.encode('utf-8')) ]
     mn = MailNotifier('*****@*****.**', addLogs=True)
     d = mn.createEmail(msgdict, u'builder-n\u00E5me',
                        u'project-n\u00E5me', SUCCESS,
                        builds, patches, logs)
     @d.addCallback
     def callback(m):
         try:
             m.as_string()
         except UnicodeEncodeError:
             self.fail('Failed to call as_string() on email message.')
     return d
Beispiel #23
0
    def testAlwaysRunStepStopBuild(self):
        """Test that steps marked with alwaysRun=True still get run even if
        the build is stopped."""

        # Create a build with 2 steps, the first one will get interrupted, and
        # the second one is marked with alwaysRun=True
        b = self.build

        step1 = Mock()
        step1.return_value = step1
        step1.alwaysRun = False
        step1.results = None
        step2 = Mock()
        step2.return_value = step2
        step2.alwaysRun = True
        step2.results = None
        b.setStepFactories([
            FakeStepFactory(step1),
            FakeStepFactory(step2),
        ])

        def startStep1(*args, **kw):
            # Now interrupt the build
            b.stopBuild("stop it")
            return defer.succeed(SUCCESS)
        step1.startStep = startStep1
        step1.stepDone.return_value = False

        step2Started = [False]

        def startStep2(*args, **kw):
            step2Started[0] = True
            return defer.succeed(SUCCESS)
        step2.startStep = startStep2
        step1.stepDone.return_value = False

        d = b.startBuild(FakeBuildStatus(), self.workerforbuilder)

        def check(ign):
            self.assertEqual(b.results, CANCELLED)
            self.assertIn(('interrupt', ('stop it',), {}), step1.method_calls)
            self.assertTrue(step2Started[0])
        d.addCallback(check)
        return d
 def setUp(self):
     class FakeBuildStatus(Mock):
         implements(interfaces.IProperties)
     r = FakeRequest()
     r.sources = [FakeSource()]
     r.sources[0].changes = [FakeChange()]
     r.sources[0].revision = "12345"
     self.master = fakemaster.make_master(wantData=True, testcase=self)
     self.slave = slave.FakeSlave(self.master)
     self.slave.attached(None)
     self.slavebuilder = Mock(name='slavebuilder')
     self.slavebuilder.slave = self.slave
     self.build = Build([r])
     self.build.setStepFactories([])
     self.builder = FakeBuilder(
         fakemaster.make_master(wantData=True, testcase=self))
     self.build.setBuilder(self.builder)
     self.build_status = FakeBuildStatus()
     self.build.startBuild(self.build_status, None, self.slavebuilder)
Beispiel #25
0
    def testAlwaysRunStepStopBuild(self):
        """Test that steps marked with alwaysRun=True still get run even if
        the build is stopped."""

        # Create a build with 2 steps, the first one will get interrupted, and
        # the second one is marked with alwaysRun=True
        b = self.build

        step1 = FakeBuildStep()
        step1.alwaysRun = False
        step1.results = None
        step2 = FakeBuildStep()
        step2.alwaysRun = True
        step2.results = None
        b.setStepFactories([
            FakeStepFactory(step1),
            FakeStepFactory(step2),
        ])

        def startStep1(*args, **kw):
            # Now interrupt the build
            b.stopBuild("stop it")
            return defer.succeed(SUCCESS)

        step1.startStep = startStep1
        step1.stepDone = lambda: False

        step2Started = [False]

        def startStep2(*args, **kw):
            step2Started[0] = True
            return defer.succeed(SUCCESS)

        step2.startStep = startStep2
        step1.stepDone = lambda: False

        yield b.startBuild(FakeBuildStatus(), self.workerforbuilder)

        self.assertEqual(b.results, CANCELLED)
        self.assertIn('stop it', step1.interrupted)
        self.assertTrue(step2Started[0])
Beispiel #26
0
    def testflushProperties(self):
        b = self.build

        class FakeBuildStatus(Mock):
            implements(interfaces.IProperties)

        b.build_status = FakeBuildStatus()

        class Properties(Mock):
            def asList(self):
                return [(u'p', 5, u'fake'), (u'p2', ['abc', 9], u'mock')]

        b.master.data.updates.setBuildProperty = Mock()
        b.build_status.getProperties.return_value = Properties()
        b.buildid = 42
        result = 'SUCCESS'
        res = yield b._flushProperties(result)
        self.assertEquals(res, result)
        b.master.data.updates.setBuildProperty.assert_has_calls(
            [call(42, u'p', 5, u'fake'),
             call(42, u'p2', ['abc', 9], u'mock')])
    def test_active_builds_metric_failure(self):
        """
        The number of active builds is increased when a build starts
        and decreased when it finishes..
        """
        b = self.build

        b.setStepFactories([FailingStepFactory()])

        observer = MetricLogObserver()
        observer.enable()
        self.addCleanup(observer.disable)

        def get_active_builds():
            return observer.asDict()['counters'].get('active_builds', 0)
        self.assertEqual(get_active_builds(), 0)

        b.startBuild(FakeBuildStatus(), self.workerforbuilder)

        self.flushLoggedErrors(TestException)

        self.assertEqual(get_active_builds(), 0)
    def setUp(self):
        class FakeProperties(Mock):
            implements(interfaces.IProperties)

        class FakeBuildStatus(Mock):
            pass
        r = FakeRequest()
        r.sources = [FakeSource()]
        r.sources[0].changes = [FakeChange()]
        r.sources[0].revision = "12345"
        self.master = fakemaster.make_master(wantData=True, testcase=self)
        self.worker = worker.FakeWorker(self.master)
        self.worker.attached(None)
        self.workerforbuilder = Mock(name='workerforbuilder')
        self.workerforbuilder.worker = self.worker
        self.build = Build([r])
        self.build.setStepFactories([])
        self.builder = FakeBuilder(
            fakemaster.make_master(wantData=True, testcase=self))
        self.build.setBuilder(self.builder)
        self.properties = self.build.properties = FakeProperties()
        self.build_status = FakeBuildStatus()
        self.build._flushProperties = Mock()
        self.build.startBuild(self.build_status, self.workerforbuilder)
Beispiel #29
0
    def testStopBuildWaitingForLocks_lostRemote(self):
        b = self.build

        l = WorkerLock('lock')
        lock_access = l.access('counting')
        l.access = lambda mode: lock_access
        real_lock = b.builder.botmaster.getLockByID(l) \
            .getLock(self.workerforbuilder.worker)
        b.setLocks([lock_access])

        step = Mock()
        step.return_value = step
        step.startStep.return_value = SUCCESS
        step.alwaysRun = False
        b.setStepFactories([FakeStepFactory(step)])

        real_lock.claim(Mock(), l.access('counting'))

        def acquireLocks(res=None):
            retval = Build.acquireLocks(b, res)
            b.lostRemote()
            return retval

        b.acquireLocks = acquireLocks

        b.startBuild(FakeBuildStatus(), self.workerforbuilder)

        self.assertNotIn(
            ('startStep', (self.workerforbuilder.worker.conn, ), {}),
            step.method_calls)
        self.assertTrue(b.currentStep is None)
        self.assertEqual(b.results, RETRY)
        self.assertNotIn(('interrupt', ('stop it', ), {}), step.method_calls)
        self.build.build_status.setText.assert_called_with(
            ["retry", "lost", "connection"])
        self.build.build_status.setResults.assert_called_with(RETRY)
    def testBuildLocksAcquired(self):
        b = self.build

        lock = WorkerLock('lock')
        claimCount = [0]
        lock_access = lock.access('counting')
        lock.access = lambda mode: lock_access
        real_lock = b.builder.botmaster.getLockByID(lock) \
            .getLockForWorker(self.workerforbuilder.worker.workername)

        def claim(owner, access):
            claimCount[0] += 1
            return real_lock.old_claim(owner, access)
        real_lock.old_claim = real_lock.claim
        real_lock.claim = claim
        b.setLocks([lock_access])

        step = FakeBuildStep()
        b.setStepFactories([FakeStepFactory(step)])

        b.startBuild(FakeBuildStatus(), self.workerforbuilder)

        self.assertEqual(b.results, SUCCESS)
        self.assertEqual(claimCount[0], 1)
Beispiel #31
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))
    def run_fake_summary_build(self, buildResults, finalResult, resultText, verifiedScore):
        gsp = GerritStatusPush('host.example.com', 'username', summaryCB=testSummaryCB)

        buildpairs = []
        i = 0
        for i in xrange(len(buildResults)):
            buildResult = buildResults[i]

            builder = Mock()
            build = FakeBuildStatus()

            builder.getBuild.return_value = build
            builder.name = "Builder-%d" % i
            builder.getName.return_value = builder.name

            build.results = buildResult
            build.finished = True
            build.reason = "testReason"
            build.getBuilder.return_value = builder
            build.getResults.return_value = build.results
            build.getText.return_value = ['buildText']
            build.getProperty = lambda prop: self.TEST_PROPS.get(prop)

            buildpairs.append((builder, build))

        def fakeGetBuilder(buildername):
            # e.g. Builder-5 will be buildpairs[5][0]
            return buildpairs[int(buildername.split("-")[1])][0]

        self.run_prepare_gsp(gsp)
        gsp.master_status.getBuilder = fakeGetBuilder
        gsp.master_status.getURLForThing = Mock()
        gsp.master_status.getURLForThing.return_value = self.THING_URL

        gsp.master.db = fakedb.FakeDBConnector(gsp.master, self)

        fakedata = [
            fakedb.Master(id=92),
            fakedb.Buildslave(id=13, name='sl'),
            fakedb.Buildset(id=99, results=finalResult, reason="testReason"),
        ]

        breqid = 1000
        for (builder, build) in buildpairs:
            fakedata.append(fakedb.BuildRequest(id=breqid, buildsetid=99,
                                                buildername=builder.name))
            fakedata.append(fakedb.Build(number=0, buildrequestid=breqid,
                                         masterid=92, buildslaveid=13))
            breqid = breqid + 1

        gsp.master.db.insertTestData(fakedata)

        fakeSCR = Mock()
        gsp.sendCodeReview = fakeSCR

        d = gsp._buildsetComplete('buildset.99.complete',
                                  dict(bsid=99, result=SUCCESS))

        @d.addCallback
        def check(_):
            info = []
            for i in xrange(len(buildResults)):
                info.append({'name': "Builder-%d" % i, 'result': buildResults[i],
                             'resultText': resultText[i], 'text': 'buildText',
                             'url': self.THING_URL})
            fakeSCR.assert_called_once_with(self.TEST_PROJECT, self.TEST_REVISION, str(info), verifiedScore, 0)

        return d
Beispiel #33
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.BuildRequest(id=11, buildsetid=99, buildername='Builder'),
            fakedb.Build(number=0,
                         buildrequestid=11,
                         buildslaveid=13,
                         masterid=92),
        ])
        mn.master = self.master

        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"
        }

        d = mn._buildsetComplete('buildset.99.complete',
                                 dict(bsid=99, result=FAILURE))

        @d.addCallback
        def check(_):
            self.assertFalse(fakeBuildMessage.called)

        return d
Beispiel #34
0
    def run_fake_summary_build(self, gsp, buildResults, finalResult,
                               resultText):
        buildpairs = []
        i = 0
        for i in xrange(len(buildResults)):
            buildResult = buildResults[i]

            builder = Mock()
            build = FakeBuildStatus()

            builder.getBuild.return_value = build
            builder.name = "Builder-%d" % i
            builder.getName.return_value = builder.name

            build.results = buildResult
            build.finished = True
            build.reason = "testReason"
            build.getBuilder.return_value = builder
            build.getResults.return_value = build.results
            build.getText.return_value = ['buildText']
            build.getProperty = self.TEST_PROPS.get

            buildpairs.append((builder, build))

        def fakeGetBuilder(buildername):
            # e.g. Builder-5 will be buildpairs[5][0]
            return buildpairs[int(buildername.split("-")[1])][0]

        gsp.master_status.getBuilder = fakeGetBuilder
        gsp.master_status.getURLForThing = Mock()
        gsp.master_status.getURLForThing.return_value = self.THING_URL

        gsp.master.db = fakedb.FakeDBConnector(gsp.master, self)

        fakedata = [
            fakedb.Master(id=92),
            fakedb.Buildslave(id=13, name='sl'),
            fakedb.Buildset(id=99, results=finalResult, reason="testReason"),
        ]

        breqid = 1000
        for (builder, build) in buildpairs:
            fakedata.append(
                fakedb.BuildRequest(id=breqid,
                                    buildsetid=99,
                                    buildername=builder.name))
            fakedata.append(
                fakedb.Build(number=0,
                             buildrequestid=breqid,
                             masterid=92,
                             buildslaveid=13))
            breqid = breqid + 1

        gsp.master.db.insertTestData(fakedata)

        d = gsp._buildsetComplete('buildset.99.complete',
                                  dict(bsid=99, result=SUCCESS))

        @d.addCallback
        def check(_):
            info = []
            for i in xrange(len(buildResults)):
                info.append({
                    'name': "Builder-%d" % i,
                    'result': buildResults[i],
                    'resultText': resultText[i],
                    'text': 'buildText',
                    'url': self.THING_URL
                })
            return str(info)

        return d
Beispiel #35
0
    def test_buildsetComplete_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
        build1.getResults.return_value = build1.results

        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
        build2.getResults.return_value = build2.results

        def fakeGetBuilder(buildername):
            return {"Builder1": builder1, "Builder2": builder2}[buildername]

        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='Builder1'),
            fakedb.Builder(id=81, name='Builder2'),
            fakedb.BuildRequest(id=11, buildsetid=99, builderid=80),
            fakedb.Build(number=0, buildrequestid=11, buildslaveid=13,
                         masterid=92),
            fakedb.BuildRequest(id=12, buildsetid=99, builderid=81),
            fakedb.Build(number=0, buildrequestid=12, 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(_):
            fakeBuildMessage.assert_called_with(
                "(whole buildset)",
                [build1, build2], SUCCESS)
        return d
Beispiel #36
0
    def test_getCustomMesgData_single_sourcestamp(self):
        self.passedAttrs = {}

        def fakeCustomMessage(attrs):
            self.passedAttrs = attrs
            return ("", "")

        mn = MailNotifier('*****@*****.**',
                          buildSetSummary=True,
                          mode=("failing", "passing", "warnings"),
                          builders=["Builder"])

        def fakeBuildMessage(name, builds, results):
            for build in builds:
                mn.buildMessageDict(name=build.getBuilder().name,
                                    build=build, results=build.results)

        mn.buildMessage = fakeBuildMessage
        mn.customMesg = fakeCustomMessage

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

        self.db = self.master.db
        self.db.insertTestData([
            fakedb.Master(id=22),
            fakedb.Buildslave(id=13, name='sl'),
            fakedb.Builder(id=80, name='Builder'),
            fakedb.Buildset(id=99, results=SUCCESS, reason="testReason"),
            fakedb.BuildRequest(id=11, buildsetid=99, builderid=80),
            fakedb.Build(number=0, buildrequestid=11, buildslaveid=13,
                         masterid=22),
        ])
        self.setupMailNotifier(mn)

        builder = Mock()
        builder.getBuild = fakeGetBuild
        builder.name = "Builder"

        build = FakeBuildStatus()
        build.results = FAILURE
        build.finished = True
        build.reason = "testReason"
        build.getLogs.return_value = []
        build.getBuilder.return_value = builder
        build.getResults.return_value = build.results

        mn.master_status.getBuilder = fakeGetBuilder

        ss1 = FakeSource(revision='111222', codebase='testlib1')
        build.getSourceStamps.return_value = [ss1]

        d = mn._buildsetComplete('buildset.99.complete',
                                 dict(bsid=99, result=FAILURE))

        @d.addCallback
        def check(_):
            self.assertTrue('builderName' in self.passedAttrs,
                            "No builderName entry found in attrs")
            self.assertEqual(self.passedAttrs['builderName'], 'Builder')
            self.assertTrue('revision' in self.passedAttrs,
                            "No revision entry found in attrs")
            self.assertTrue(isinstance(self.passedAttrs['revision'], str))
            self.assertEqual(self.passedAttrs['revision'], '111222')
        return d
Beispiel #37
0
    def run_fake_build(self, notifier, info=None):
        notifier.master = fakemaster.make_master()
        notifier.master_status = notifier.master.status

        builders = []
        builds = []

        for i in [0, 1, 2]:
            builder = Mock()
            build = FakeBuildStatus()

            builder.getBuild.return_value = build
            builder.name = "Builder%d" % i

            build.results = SUCCESS
            build.finished = True
            build.reason = "testReason"
            build.getBuilder.return_value = builder

            builders.append(builder)
            builds.append(build)

        def fakeGetBuilder(buildername):
            return {
                "Builder0": builders[0],
                "Builder1": builders[1],
                "Builder2": builders[2]
            }[buildername]

        notifier.master_status.getBuilder = fakeGetBuilder
        notifier.master.db = fakedb.FakeDBConnector(notifier.master, self)

        notifier.master.db.insertTestData([
            fakedb.Master(id=92),
            fakedb.Buildslave(id=13, name='sl'),
            fakedb.Buildset(id=99, results=SUCCESS, reason="testReason"),
            fakedb.BuildRequest(id=10, buildsetid=99, buildername="Builder0"),
            fakedb.Build(number=0,
                         buildrequestid=10,
                         masterid=92,
                         buildslaveid=13),
            fakedb.BuildRequest(id=11, buildsetid=99, buildername="Builder1"),
            fakedb.Build(number=0,
                         buildrequestid=11,
                         masterid=92,
                         buildslaveid=13),
            fakedb.BuildRequest(id=12, buildsetid=99, buildername="Builder2"),
            fakedb.Build(number=0,
                         buildrequestid=12,
                         masterid=92,
                         buildslaveid=13)
        ])

        if info is not None:
            info['bsid'] = 99
            info['builds'] = builds

        d = notifier._buildsetComplete('buildset.99.complete', {
            'bsid': 99,
            'result': SUCCESS
        })
        return d
Beispiel #38
0
    def test_getCustomMesgData_single_sourcestamp(self):
        self.passedAttrs = {}

        def fakeCustomMessage(attrs):
            self.passedAttrs = attrs
            return ("", "")

        mn = MailNotifier(
            "*****@*****.**", buildSetSummary=True, mode=("failing", "passing", "warnings"), builders=["Builder"]
        )

        def fakeBuildMessage(name, builds, results):
            for build in builds:
                mn.buildMessageDict(name=build.getBuilder().name, build=build, results=build.results)

        mn.buildMessage = fakeBuildMessage
        mn.customMesg = fakeCustomMessage

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

        self.db = self.master.db
        self.db.insertTestData(
            [
                fakedb.Master(id=22),
                fakedb.Buildslave(id=13, name="sl"),
                fakedb.Builder(id=80, name="Builder"),
                fakedb.Buildset(id=99, results=SUCCESS, reason="testReason"),
                fakedb.BuildRequest(id=11, buildsetid=99, builderid=80),
                fakedb.Build(number=0, buildrequestid=11, buildslaveid=13, masterid=22),
            ]
        )
        mn.master = self.master

        builder = Mock()
        builder.getBuild = fakeGetBuild
        builder.name = "Builder"

        build = FakeBuildStatus()
        build.results = FAILURE
        build.finished = True
        build.reason = "testReason"
        build.getLogs.return_value = []
        build.getBuilder.return_value = builder
        build.getResults.return_value = build.results

        self.status = Mock()
        mn.master_status = Mock()
        mn.master_status.getBuilder = fakeGetBuilder

        ss1 = FakeSource(revision="111222", codebase="testlib1")
        build.getSourceStamps.return_value = [ss1]

        d = mn._buildsetComplete("buildset.99.complete", dict(bsid=99, result=FAILURE))

        @d.addCallback
        def check(_):
            self.assertTrue("builderName" in self.passedAttrs, "No builderName entry found in attrs")
            self.assertEqual(self.passedAttrs["builderName"], "Builder")
            self.assertTrue("revision" in self.passedAttrs, "No revision entry found in attrs")
            self.assertTrue(isinstance(self.passedAttrs["revision"], str))
            self.assertEqual(self.passedAttrs["revision"], "111222")

        return d
Beispiel #39
0
    def run_fake_summary_build(self, gsp, buildResults, finalResult,
                               resultText, expWarning=False):
        buildpairs = []
        i = 0
        for i in xrange(len(buildResults)):
            buildResult = buildResults[i]

            builder = Mock()
            build = FakeBuildStatus()

            builder.getBuild.return_value = build
            builder.name = "Builder-%d" % i
            builder.getName.return_value = builder.name
            builder._builderid = i
            build.results = buildResult
            build.finished = True
            build.reason = "testReason"
            build.getBuilder.return_value = builder
            build.getResults.return_value = build.results
            build.getText.return_value = ['buildText']
            build.getProperty = self.TEST_PROPS.get

            buildpairs.append((builder, build))

        def fakeGetBuilder(buildername):
            # e.g. Builder-5 will be buildpairs[5][0]
            return buildpairs[int(buildername.split("-")[1])][0]

        gsp.master_status.getBuilder = fakeGetBuilder
        gsp.master_status.getURLForThing = Mock()
        gsp.master_status.getURLForThing.return_value = self.THING_URL

        gsp.master.db = fakedb.FakeDBConnector(gsp.master, self)

        fakedata = [
            fakedb.Master(id=92),
            fakedb.Buildslave(id=13, name='sl'),
            fakedb.Buildset(id=99, results=finalResult, reason="testReason"),
        ]

        breqid = 1000
        for (builder, build) in buildpairs:
            fakedata.append(fakedb.Builder(id=builder._builderid, name=builder.name))
            fakedata.append(fakedb.BuildRequest(id=breqid, buildsetid=99,
                                                builderid=builder._builderid))
            fakedata.append(fakedb.Build(number=0, buildrequestid=breqid,
                                         masterid=92, buildslaveid=13))
            breqid = breqid + 1

        gsp.master.db.insertTestData(fakedata)

        d = gsp._buildsetComplete('buildset.99.complete',
                                  dict(bsid=99, result=SUCCESS))

        @d.addCallback
        def check(_):
            info = []
            for i in xrange(len(buildResults)):
                info.append({'name': "Builder-%d" % i, 'result': buildResults[i],
                             'resultText': resultText[i], 'text': 'buildText',
                             'url': self.THING_URL})
            if expWarning:
                self.assertEqual([w['message'] for w in self.flushWarnings()],
                                 ['The Gerrit status callback uses the old '
                                  'way to communicate results.  The outcome '
                                  'might be not what is expected.'])
            return str(info)
        return d
    def do_test_sendToInterestedUsers(self, lookup=None, extraRecipients=[],
                                      sendToInterestedUsers=True,
                                      exp_called_with=None, exp_TO=None,
                                      exp_CC=None):
        from email.Message import Message
        m = Message()

        mn = MailNotifier(fromaddr='*****@*****.**',
                          lookup=lookup,
                          sendToInterestedUsers=sendToInterestedUsers,
                          extraRecipients=extraRecipients)
        mn.sendMessage = Mock()

        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(name="build")
        build.result = FAILURE
        build.finished = True
        build.reason = "testReason"
        build.builder = builder

        def fakeCreateEmail(msgdict, builderName, title, results, builds=None,
                            patches=None, logs=None):
            # only concerned with m['To'] and m['CC'], which are added in
            # _got_recipients later
            return m
        mn.createEmail = fakeCreateEmail

        self.db = fakedb.FakeDBConnector(self)
        self.db.insertTestData([fakedb.SourceStampSet(id=1099),
                                fakedb.Buildset(id=99, sourcestampsetid=1099,
                                                results=SUCCESS,
                                                reason="testReason"),
                                fakedb.BuildRequest(id=11, buildsetid=99,
                                                    buildername='Builder'),
                                fakedb.Build(number=0, brid=11),
                                fakedb.Change(changeid=9123),
                                fakedb.ChangeUser(changeid=9123, uid=1),
                                fakedb.User(uid=1, identifier="tdurden"),
                                fakedb.UserInfo(uid=1, attr_type='svn',
                                            attr_data="tdurden"),
                                fakedb.UserInfo(uid=1, attr_type='email',
                                            attr_data="*****@*****.**")
                                ])

        # fake sourcestamp with relevant user bits
        ss = Mock(name="sourcestamp")
        fake_change = Mock(name="change")
        fake_change.number = 9123
        ss.changes = [fake_change]
        ss.patch, ss.addPatch = None, None

        def fakeGetSS():
            return ss
        build.getSourceStamp = fakeGetSS

        def _getInterestedUsers():
            # 'narrator' in this case is the owner, which tests the lookup
            return ["Big Bob <*****@*****.**>", "narrator"]
        build.getInterestedUsers = _getInterestedUsers

        def _getResponsibleUsers():
            return ["Big Bob <*****@*****.**>"]
        build.getResponsibleUsers = _getResponsibleUsers

        mn.master = self # FIXME: Should be FakeMaster
        self.status = mn.master_status = mn.buildMessageDict = Mock()
        mn.master_status.getBuilder = fakeGetBuilder
        mn.buildMessageDict.return_value = {"body": "body", "type": "text"}

        mn.buildMessage(builder.name, [build], build.result)
        mn.sendMessage.assert_called_with(m, exp_called_with)
        self.assertEqual(m['To'], exp_TO)
        self.assertEqual(m['CC'], exp_CC)
Beispiel #41
0
    def run_fake_summary_build(self, buildResults, finalResult, resultText, verifiedScore):
        gsp = GerritStatusPush('host.example.com', 'username', summaryCB=testSummaryCB)

        buildpairs = []
        i = 0
        for i in xrange(len(buildResults)):
            buildResult = buildResults[i]

            builder = Mock()
            build = FakeBuildStatus()

            builder.getBuild.return_value = build
            builder.name = "Builder-%d" % i
            builder.getName.return_value = builder.name

            build.results = buildResult
            build.finished = True
            build.reason = "testReason"
            build.getBuilder.return_value = builder
            build.getResults.return_value = build.results
            build.getText.return_value = ['buildText']
            build.getProperty = lambda prop: self.TEST_PROPS.get(prop)

            buildpairs.append((builder, build))

        def fakeGetBuilder(buildername):
            # e.g. Builder-5 will be buildpairs[5][0]
            return buildpairs[int(buildername.split("-")[1])][0]

        self.run_prepare_gsp(gsp)
        gsp.master_status.getBuilder = fakeGetBuilder
        gsp.master_status.getURLForThing = Mock()
        gsp.master_status.getURLForThing.return_value = self.THING_URL

        gsp.master.db = fakedb.FakeDBConnector(self)

        fakedata = [fakedb.SourceStampSet(id=127), fakedb.Buildset(id=99, sourcestampsetid=127, results=finalResult, reason="testReason")]

        breqid = 1000
        for (builder, build) in buildpairs:
            fakedata.append(fakedb.BuildRequest(id=breqid, buildsetid=99,
                                                buildername=builder.name))
            fakedata.append(fakedb.Build(number=0, brid=breqid))
            breqid = breqid + 1

        gsp.master.db.insertTestData(fakedata)

        fakeSCR = Mock()
        gsp.sendCodeReview = fakeSCR

        d = gsp._buildsetComplete(99, finalResult)

        @d.addCallback
        def check(_):
            info = []
            for i in xrange(len(buildResults)):
                info.append({'name': "Builder-%d" % i, 'result': buildResults[i],
                             'resultText': resultText[i], 'text': 'buildText',
                             'url': self.THING_URL})
            fakeSCR.assert_called_once_with(self.TEST_PROJECT, self.TEST_REVISION, str(info), verifiedScore, 0)

        return d
Beispiel #42
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))
Beispiel #43
0
    def test_buildsetComplete_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
        build1.getResults.return_value = build1.results

        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
        build2.getResults.return_value = build2.results

        def fakeGetBuilder(buildername):
            return {"Builder1": builder1, "Builder2": builder2}[buildername]

        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="Builder1"),
                fakedb.Builder(id=81, name="Builder2"),
                fakedb.BuildRequest(id=11, buildsetid=99, builderid=80),
                fakedb.Build(number=0, buildrequestid=11, buildslaveid=13, masterid=92),
                fakedb.BuildRequest(id=12, buildsetid=99, builderid=81),
                fakedb.Build(number=0, buildrequestid=12, buildslaveid=13, masterid=92),
            ]
        )
        mn.master = self.master

        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"}

        d = mn._buildsetComplete("buildset.99.complete", dict(bsid=99, result=FAILURE))

        @d.addCallback
        def check(_):
            fakeBuildMessage.assert_called_with("(whole buildset)", [build1, build2], SUCCESS)

        return d
Beispiel #44
0
    def test_getCustomMesgData_single_sourcestamp(self):
        self.passedAttrs = {}

        def fakeCustomMessage(attrs):
            self.passedAttrs = attrs
            return ("", "")

        mn = MailNotifier('*****@*****.**',
                          buildSetSummary=True,
                          mode=("failing", "passing", "warnings"),
                          builders=["Builder"])

        def fakeBuildMessage(name, builds, results):
            for build in builds:
                mn.buildMessageDict(name=build.getBuilder().name,
                                    build=build, results=build.results)

        mn.buildMessage = fakeBuildMessage
        mn.customMesg = fakeCustomMessage

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

        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

        builder = Mock()
        builder.getBuild = fakeGetBuild
        builder.name = "Builder"

        build = FakeBuildStatus()
        build.results = FAILURE
        build.finished = True
        build.reason = "testReason"
        build.getLogs.return_value = []
        build.getBuilder.return_value = builder

        self.status = Mock()
        mn.master_status = Mock()
        mn.master_status.getBuilder = fakeGetBuilder

        ss1 = FakeSource(revision='111222', codebase='testlib1')
        build.getSourceStamps.return_value = [ss1]

        mn.buildsetFinished(99, FAILURE)

        self.assertTrue('builderName' in self.passedAttrs, "No builderName entry found in attrs")
        self.assertEqual(self.passedAttrs['builderName'], 'Builder')
        self.assertTrue('revision' in self.passedAttrs, "No revision entry found in attrs")
        self.assertTrue(isinstance(self.passedAttrs['revision'], str))
        self.assertEqual(self.passedAttrs['revision'], '111222')
Beispiel #45
0
    def do_test_sendToInterestedUsers(self, lookup=None, extraRecipients=[],
                                      sendToInterestedUsers=True,
                                      exp_called_with=None, exp_TO=None,
                                      exp_CC=None):
        from email.Message import Message
        m = Message()

        mn = MailNotifier(fromaddr='*****@*****.**',
                          lookup=lookup,
                          sendToInterestedUsers=sendToInterestedUsers,
                          extraRecipients=extraRecipients)
        mn.sendMessage = Mock()

        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(name="build")
        build.result = FAILURE
        build.finished = True
        build.reason = "testReason"
        build.builder = builder

        def fakeCreateEmail(msgdict, builderName, title, results, builds=None,
                            patches=None, logs=None):
            # only concerned with m['To'] and m['CC'], which are added in
            # _got_recipients later
            return m
        mn.createEmail = fakeCreateEmail

        self.db = fakedb.FakeDBConnector(self)
        self.db.insertTestData([fakedb.SourceStampSet(id=1099),
                                fakedb.Buildset(id=99, sourcestampsetid=1099,
                                                results=SUCCESS,
                                                reason="testReason"),
                                fakedb.BuildRequest(id=11, buildsetid=99,
                                                    buildername='Builder'),
                                fakedb.Build(number=0, brid=11),
                                fakedb.Change(changeid=9123),
                                fakedb.ChangeUser(changeid=9123, uid=1),
                                fakedb.User(uid=1, identifier="tdurden"),
                                fakedb.UserInfo(uid=1, attr_type='svn',
                                            attr_data="tdurden"),
                                fakedb.UserInfo(uid=1, attr_type='email',
                                            attr_data="*****@*****.**")
                                ])

        # fake sourcestamp with relevant user bits
        ss = Mock(name="sourcestamp")
        fake_change = Mock(name="change")
        fake_change.number = 9123
        ss.changes = [fake_change]
        ss.patch, ss.addPatch = None, None

        def fakeGetSS():
            return ss
        build.getSourceStamp = fakeGetSS

        def _getInterestedUsers():
            # 'narrator' in this case is the owner, which tests the lookup
            return ["Big Bob <*****@*****.**>", "narrator"]
        build.getInterestedUsers = _getInterestedUsers

        def _getResponsibleUsers():
            return ["Big Bob <*****@*****.**>"]
        build.getResponsibleUsers = _getResponsibleUsers

        mn.parent = self
        self.status = mn.master_status = mn.buildMessageDict = Mock()
        mn.master_status.getBuilder = fakeGetBuilder
        mn.buildMessageDict.return_value = {"body": "body", "type": "text"}

        mn.buildMessage(builder.name, [build], build.result)
        mn.sendMessage.assert_called_with(m, exp_called_with)
        self.assertEqual(m['To'], exp_TO)
        self.assertEqual(m['CC'], exp_CC)
Beispiel #46
0
    def test_sendToInterestedUsers_two_builds(self):
        from email.Message import Message
        m = Message()

        mn = MailNotifier(fromaddr="*****@*****.**", lookup=None)
        mn.sendMessage = Mock()

        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.name = "Builder"

        build1 = FakeBuildStatus(name="build")
        build1.result = FAILURE
        build1.finished = True
        build1.reason = "testReason"
        build1.builder = builder

        build2 = FakeBuildStatus(name="build")
        build2.result = FAILURE
        build2.finished = True
        build2.reason = "testReason"
        build2.builder = builder

        def fakeCreateEmail(msgdict, builderName, title, results, builds=None,
                            patches=None, logs=None):
            # only concerned with m['To'] and m['CC'], which are added in
            # _got_recipients later
            return m
        mn.createEmail = fakeCreateEmail

        self.db = fakedb.FakeDBConnector(self)
        self.db.insertTestData([fakedb.SourceStampSet(id=1099),
                                fakedb.Buildset(id=99, sourcestampsetid=1099,
                                                results=SUCCESS,
                                                reason="testReason"),
                                fakedb.BuildRequest(id=11, buildsetid=99,
                                                    buildername='Builder'),
                                fakedb.Build(number=0, brid=11),
                                fakedb.Build(number=1, brid=11),
                                fakedb.Change(changeid=9123),
                                fakedb.Change(changeid=9124),
                                fakedb.ChangeUser(changeid=9123, uid=1),
                                fakedb.ChangeUser(changeid=9124, uid=2),
                                fakedb.User(uid=1, identifier="tdurden"),
                                fakedb.User(uid=2, identifier="user2"),
                                fakedb.UserInfo(uid=1, attr_type='email',
                                            attr_data="*****@*****.**"),
                                fakedb.UserInfo(uid=2, attr_type='email',
                                            attr_data="*****@*****.**")
                                ])

        def _getInterestedUsers():
            # 'narrator' in this case is the owner, which tests the lookup
            return ["Big Bob <*****@*****.**>", "narrator"]
        build1.getInterestedUsers = _getInterestedUsers
        build2.getInterestedUsers = _getInterestedUsers

        def _getResponsibleUsers():
            return ["Big Bob <*****@*****.**>"]
        build1.getResponsibleUsers = _getResponsibleUsers
        build2.getResponsibleUsers = _getResponsibleUsers

        # fake sourcestamp with relevant user bits
        ss1 = Mock(name="sourcestamp")
        fake_change1 = Mock(name="change")
        fake_change1.number = 9123
        ss1.changes = [fake_change1]
        ss1.patch, ss1.addPatch = None, None

        ss2 = Mock(name="sourcestamp")
        fake_change2 = Mock(name="change")
        fake_change2.number = 9124
        ss2.changes = [fake_change2]
        ss2.patch, ss1.addPatch = None, None

        def fakeGetSS(ss):
            return lambda: ss
        build1.getSourceStamp = fakeGetSS(ss1)
        build2.getSourceStamp = fakeGetSS(ss2)

        mn.parent = self
        self.status = mn.master_status = mn.buildMessageDict = Mock()
        mn.master_status.getBuilder = fakeGetBuilder
        mn.buildMessageDict.return_value = {"body": "body", "type": "text"}

        mn.buildMessage(builder.name, [build1, build2], build1.result)
        self.assertEqual(m['To'], "[email protected], [email protected]")
    def test_sendToInterestedUsers_two_builds(self):
        from email.Message import Message
        m = Message()

        mn = MailNotifier(fromaddr="*****@*****.**", lookup=None)
        mn.sendMessage = Mock()

        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.name = "Builder"

        build1 = FakeBuildStatus(name="build")
        build1.result = FAILURE
        build1.finished = True
        build1.reason = "testReason"
        build1.builder = builder

        build2 = FakeBuildStatus(name="build")
        build2.result = FAILURE
        build2.finished = True
        build2.reason = "testReason"
        build2.builder = builder

        def fakeCreateEmail(msgdict, builderName, title, results, builds=None,
                            patches=None, logs=None):
            # only concerned with m['To'] and m['CC'], which are added in
            # _got_recipients later
            return m
        mn.createEmail = fakeCreateEmail

        self.db = fakedb.FakeDBConnector(self)
        self.db.insertTestData([fakedb.SourceStampSet(id=1099),
                                fakedb.Buildset(id=99, sourcestampsetid=1099,
                                                results=SUCCESS,
                                                reason="testReason"),
                                fakedb.BuildRequest(id=11, buildsetid=99,
                                                    buildername='Builder'),
                                fakedb.Build(number=0, brid=11),
                                fakedb.Build(number=1, brid=11),
                                fakedb.Change(changeid=9123),
                                fakedb.Change(changeid=9124),
                                fakedb.ChangeUser(changeid=9123, uid=1),
                                fakedb.ChangeUser(changeid=9124, uid=2),
                                fakedb.User(uid=1, identifier="tdurden"),
                                fakedb.User(uid=2, identifier="user2"),
                                fakedb.UserInfo(uid=1, attr_type='email',
                                            attr_data="*****@*****.**"),
                                fakedb.UserInfo(uid=2, attr_type='email',
                                            attr_data="*****@*****.**")
                                ])

        def _getInterestedUsers():
            # 'narrator' in this case is the owner, which tests the lookup
            return ["Big Bob <*****@*****.**>", "narrator"]
        build1.getInterestedUsers = _getInterestedUsers
        build2.getInterestedUsers = _getInterestedUsers

        def _getResponsibleUsers():
            return ["Big Bob <*****@*****.**>"]
        build1.getResponsibleUsers = _getResponsibleUsers
        build2.getResponsibleUsers = _getResponsibleUsers

        # fake sourcestamp with relevant user bits
        ss1 = Mock(name="sourcestamp")
        fake_change1 = Mock(name="change")
        fake_change1.number = 9123
        ss1.changes = [fake_change1]
        ss1.patch, ss1.addPatch = None, None

        ss2 = Mock(name="sourcestamp")
        fake_change2 = Mock(name="change")
        fake_change2.number = 9124
        ss2.changes = [fake_change2]
        ss2.patch, ss1.addPatch = None, None

        def fakeGetSS(ss):
            return lambda: ss
        build1.getSourceStamp = fakeGetSS(ss1)
        build2.getSourceStamp = fakeGetSS(ss2)

        mn.master = self # FIXME: Should be FakeMaster
        self.status = mn.master_status = mn.buildMessageDict = Mock()
        mn.master_status.getBuilder = fakeGetBuilder
        mn.buildMessageDict.return_value = {"body": "body", "type": "text"}

        mn.buildMessage(builder.name, [build1, build2], build1.result)
        self.assertEqual(m['To'], "[email protected], [email protected]")
Beispiel #48
0
    def test_getCustomMesgData_single_sourcestamp(self):
        self.passedAttrs = {}

        def fakeCustomMessage(attrs):
            self.passedAttrs = attrs
            return ("", "")

        mn = MailNotifier('*****@*****.**',
                          buildSetSummary=True,
                          mode=("failing", "passing", "warnings"),
                          builders=["Builder"])

        def fakeBuildMessage(name, builds, results):
            for build in builds:
                mn.buildMessageDict(name=build.getBuilder().name,
                                    build=build,
                                    results=build.results)

        mn.buildMessage = fakeBuildMessage
        mn.customMesg = fakeCustomMessage

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

        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

        builder = Mock()
        builder.getBuild = fakeGetBuild
        builder.name = "Builder"

        build = FakeBuildStatus()
        build.results = FAILURE
        build.finished = True
        build.reason = "testReason"
        build.getLogs.return_value = []
        build.getBuilder.return_value = builder

        self.status = Mock()
        mn.master_status = Mock()
        mn.master_status.getBuilder = fakeGetBuilder

        ss1 = FakeSource(revision='111222', codebase='testlib1')
        build.getSourceStamps.return_value = [ss1]

        mn.buildsetFinished(99, FAILURE)

        self.assertTrue('builderName' in self.passedAttrs,
                        "No builderName entry found in attrs")
        self.assertEqual(self.passedAttrs['builderName'], 'Builder')
        self.assertTrue('revision' in self.passedAttrs,
                        "No revision entry found in attrs")
        self.assertTrue(isinstance(self.passedAttrs['revision'], str))
        self.assertEqual(self.passedAttrs['revision'], '111222')