def testSpecificNightlyScheduler(self):
        createTestData(self.dbc)
        ssFunc = lastGoodFunc('b2', ['builder1', 'builder2'])
        s = SpecificNightly(ssFunc, name='s', builderNames=['nightly1'])
        s.parent = mock.Mock()
        s.parent.db = self.dbc

        d = self.dbc.addSchedulers([s])

        def startBuild(ign):
            return self.dbc.runInteractionNow(lambda t: s.start_HEAD_build(t))

        d.addCallback(startBuild)

        def check(ign):
            # Check that we have a buildrequest for revision r1
            req = self.dbc.runQueryNow("""
                SELECT * FROM buildrequests, buildsets, sourcestamps
                WHERE
                    buildrequests.buildsetid = buildsets.id AND
                    buildsets.sourcestampid = sourcestamps.id AND
                    buildername='nightly1' AND
                    revision = 'r1'
                    """)
            self.assertEquals(len(req), 1)

        return d
    def testSpecificNightlyScheduler(self):
        createTestData(self.dbc)
        ssFunc = lastGoodFunc('b2', ['builder1', 'builder2'])
        s = SpecificNightly(ssFunc, name='s', builderNames=['nightly1'])
        s.parent = mock.Mock()
        s.parent.db = self.dbc

        d = self.dbc.addSchedulers([s])

        def startBuild(ign):
            return self.dbc.runInteractionNow(lambda t: s.start_HEAD_build(t))

        d.addCallback(startBuild)

        def check(ign):
            # Check that we have a buildrequest for revision r1
            req = self.dbc.runQueryNow("""
                SELECT * FROM buildrequests, buildsets, sourcestamps
                WHERE
                    buildrequests.buildsetid = buildsets.id AND
                    buildsets.sourcestampid = sourcestamps.id AND
                    buildername='nightly1' AND
                    revision = 'r1'
                    """)
            self.assertEquals(len(req), 1)

        return d
    def test_lastGoodFunc(self):
        createTestData(self.dbc)

        with mock.patch('time.time') as t:
            # Check that ssFunc returns something for both branches
            t.return_value = 10
            ssFunc = lastGoodFunc('b1', ['builder1', 'builder2'])
            ss = self.dbc.runInteractionNow(lambda t: ssFunc(self.s, t))
            self.assertEquals(ss.revision, 'r1')

            t.return_value = 10
            ssFunc = lastGoodFunc('b2', ['builder1', 'builder2'])
            ss = self.dbc.runInteractionNow(lambda t: ssFunc(self.s, t))
            self.assertEquals(ss.revision, 'r234567890')

            # Check that ssFunc returns None if triggerBuildIfNoChanges=False
            # and there are no good builds in the past 24 hours.
            # We achieve this by faking the clock
            t.return_value = 48 * 3600
            ssFunc = lastGoodFunc('b1', ['builder1', 'builder2'],
                                  triggerBuildIfNoChanges=False)
            ss = self.dbc.runInteractionNow(lambda t: ssFunc(self.s, t))
            self.assertEquals(ss, None)

            # Check that ssFunc returns something if triggerBuildIfNoChanges=False
            # and there are no good builds in the past 24 hours, but there are
            # l10n changes.
            t.return_value = 25 * 3600
            ssFunc = lastGoodFunc('b2', ['builder1', 'builder2'],
                                  triggerBuildIfNoChanges=False,
                                  l10nBranch='b2-l10n')
            ss = self.dbc.runInteractionNow(lambda t: ssFunc(self.s, t))
            self.assertEquals(ss.revision, 'r234567890')

            # Check that ssFunc returns None if triggerBuildIfNoChanges=False
            # and there are no good builds or l10n changes in the past 24
            # hours.
            t.return_value = 72 * 3600
            ssFunc = lastGoodFunc('b2', ['builder1', 'builder2'],
                                  triggerBuildIfNoChanges=False,
                                  l10nBranch='b2-l10n')
            ss = self.dbc.runInteractionNow(lambda t: ssFunc(self.s, t))
            self.assertEquals(ss, None)
    def test_lastGoodFunc(self):
        createTestData(self.dbc)

        with mock.patch('time.time') as t:
            # Check that ssFunc returns something for both branches
            t.return_value = 10
            ssFunc = lastGoodFunc('b1', ['builder1', 'builder2'])
            ss = self.dbc.runInteractionNow(lambda t: ssFunc(self.s, t))
            self.assertEquals(ss.revision, 'r1')

            t.return_value = 10
            ssFunc = lastGoodFunc('b2', ['builder1', 'builder2'])
            ss = self.dbc.runInteractionNow(lambda t: ssFunc(self.s, t))
            self.assertEquals(ss.revision, 'r234567890')

            # Check that ssFunc returns None if triggerBuildIfNoChanges=False
            # and there are no good builds in the past 24 hours.
            # We achieve this by faking the clock
            t.return_value = 48 * 3600
            ssFunc = lastGoodFunc(
                'b1', ['builder1', 'builder2'], triggerBuildIfNoChanges=False)
            ss = self.dbc.runInteractionNow(lambda t: ssFunc(self.s, t))
            self.assertEquals(ss, None)

            # Check that ssFunc returns something if triggerBuildIfNoChanges=False
            # and there are no good builds in the past 24 hours, but there are
            # l10n changes.
            t.return_value = 25 * 3600
            ssFunc = lastGoodFunc('b2', ['builder1', 'builder2'], triggerBuildIfNoChanges=False, l10nBranch='b2-l10n')
            ss = self.dbc.runInteractionNow(lambda t: ssFunc(self.s, t))
            self.assertEquals(ss.revision, 'r234567890')

            # Check that ssFunc returns None if triggerBuildIfNoChanges=False
            # and there are no good builds or l10n changes in the past 24
            # hours.
            t.return_value = 72 * 3600
            ssFunc = lastGoodFunc('b2', ['builder1', 'builder2'], triggerBuildIfNoChanges=False, l10nBranch='b2-l10n')
            ss = self.dbc.runInteractionNow(lambda t: ssFunc(self.s, t))
            self.assertEquals(ss, None)