Ejemplo n.º 1
0
    def test_getSourceStamp_changes(self):
        d = self.insertTestData([
            fakedb.Change(changeid=16),
            fakedb.Change(changeid=19),
            fakedb.Change(changeid=20),
            fakedb.SourceStamp(id=234),
            fakedb.SourceStampChange(sourcestampid=234, changeid=16),
            fakedb.SourceStampChange(sourcestampid=234, changeid=20),
        ])
        d.addCallback(lambda _: self.db.sourcestamps.getSourceStamp(234))

        def check(ssdict):
            self.assertEqual(ssdict['changeids'], set([16, 20]))

        d.addCallback(check)
        return d
Ejemplo n.º 2
0
    def test_getChangesHugeCount(self):
        yield self.insertTestData([
            fakedb.SourceStamp(id=92),
        ] + [fakedb.Change(changeid=i) for i in range(2, 102)])
        n = yield self.db.changes.getChangesCount()

        self.assertEqual(n, 100)
Ejemplo n.º 3
0
 def test_addBuildsetForChanges_properties_with_virtual_builders(self):
     sched = self.makeScheduler(name='n',
                                builderNames=['c'],
                                properties={
                                    'virtual_builder_name':
                                    Interpolate("myproject-%(src::branch)s")
                                })
     self.db.insertTestData([
         fakedb.SourceStamp(id=234, branch='dev1', project="linux"),
         fakedb.Change(changeid=14, sourcestampid=234, branch="dev1"),
     ])
     bsid, brids = yield sched.addBuildsetForChanges(reason='downstream',
                                                     waited_for=False,
                                                     changeids=[14])
     self.assertEqual((bsid, brids), self.exp_bsid_brids)
     self.master.data.updates.addBuildset.assert_called_with(
         waited_for=False,
         builderids=[1],
         external_idstring=None,
         properties={
             'virtual_builder_name': ("myproject-dev1", "Scheduler"),
             'scheduler': ('n', 'Scheduler'),
         },
         reason='downstream',
         scheduler='n',
         sourcestamps=[234])
Ejemplo n.º 4
0
    def test_pruneChanges_lots(self):
        yield self.insertTestData([
            fakedb.SourceStamp(id=29),
        ] + [
            fakedb.Change(changeid=n, sourcestampid=29) for n in range(1, 151)
        ])

        yield self.db.changes.pruneChanges(1)

        def thd(conn):
            results = {}
            for tbl_name in ('scheduler_changes', 'change_files',
                             'change_properties', 'changes'):
                tbl = self.db.model.metadata.tables[tbl_name]
                res = conn.execute(
                    sa.select([sa.func.count()]).select_from(tbl))
                results[tbl_name] = res.fetchone()[0]
                res.close()
            self.assertEqual(
                results, {
                    'scheduler_changes': 0,
                    'change_files': 0,
                    'change_properties': 0,
                    'changes': 1,
                })

        yield self.db.pool.do(thd)
Ejemplo n.º 5
0
    def test_addBuildsetForChanges_one_change_builderNames(self):
        sched = self.makeScheduler(name='n', builderNames=['b'])
        self.db.insertTestData([
            fakedb.Change(changeid=13,
                          branch='trunk',
                          revision='9283',
                          repository='svn://...',
                          project='world-domination'),
        ])
        d = sched.addBuildsetForChanges(reason='power',
                                        changeids=[13],
                                        builderNames=['p'])

        def check((bsid, brids)):
            self.db.buildsets.assertBuildset(
                bsid,
                dict(reason='power',
                     brids=brids,
                     external_idstring=None,
                     properties=[('scheduler', ('n', 'Scheduler'))]),
                dict(branch='trunk',
                     repository='svn://...',
                     changeids=set([13]),
                     project='world-domination',
                     revision='9283'))

        d.addCallback(check)
        return d
Ejemplo n.º 6
0
    def test_addBuildsetForChanges_properties(self):
        props = properties.Properties(xxx="yyy")
        sched = self.makeScheduler(name='n', builderNames=['c'])
        self.db.insertTestData([
            fakedb.Change(changeid=14,
                          branch='default',
                          revision='123:abc',
                          repository='',
                          project=''),
        ])
        d = sched.addBuildsetForChanges(reason='downstream',
                                        changeids=[14],
                                        properties=props)

        def check((bsid, brids)):
            self.db.buildsets.assertBuildset(
                bsid,
                dict(reason='downstream',
                     brids=brids,
                     external_idstring=None,
                     properties=[
                         ('scheduler', ('n', 'Scheduler')),
                         ('xxx', ('yyy', 'TEST')),
                     ]),
                dict(branch='default',
                     revision='123:abc',
                     repository='',
                     project='',
                     changeids=set([14])))

        d.addCallback(check)
        return d
Ejemplo n.º 7
0
    def test_change_consumer_cb(self):
        status = self.makeStatus()

        # insert the change that will be announced in the database
        self.db.insertTestData([
            fakedb.Change(changeid=13),
        ])

        # patch out fromChdict
        self.patch(
            changes.Change, 'fromChdict',
            classmethod(
                lambda cls, mstr, chd: defer.succeed(dict(m=mstr, c=chd))))

        # set up a watcher
        class W(object):
            pass

        watcher = W()
        watcher.changeAdded = mock.Mock(name='changeAdded')
        status.subscribe(watcher)

        yield status.change_consumer_cb('change.13.new', dict(changeid=13))

        self.assertTrue(watcher.changeAdded.called)
        args, kwargs = watcher.changeAdded.call_args
        self.assertEqual(args[0]['m'], status.master)
        print args
        self.assertEqual(args[0]['c']['changeid'], 13)
Ejemplo n.º 8
0
    def test_mergeRequest_no_other_request(self):
        """ Test if builder test for codebases in requests """
        yield self.makeBuilder()

        # set up all of the data required for a BuildRequest object
        yield self.db.insertTestData([
                fakedb.SourceStampSet(id=234),
                fakedb.SourceStamp(id=234, sourcestampsetid=234, codebase='A'),
                fakedb.Change(changeid=14, codebase='A'),
                fakedb.SourceStampChange(sourcestampid=234, changeid=14),
                fakedb.Buildset(id=30, sourcestampsetid=234, reason='foo',
                    submitted_at=1300305712, results=-1),
                fakedb.BuildRequest(id=19, buildsetid=30, buildername='bldr',
                    priority=13, submitted_at=1300305712, results=-1),
            ])

        brdicts = yield defer.gatherResults([
                self.db.buildrequests.getBuildRequest(19)
            ])

        def mergeRequests_fn(builder, breq, other):
            # Allow all requests
            return True

        # check if the request remains the same
        res = yield self.bldr._mergeRequests(brdicts[0], brdicts,
                                            mergeRequests_fn)
        self.assertEqual(res, [ brdicts[0] ])
    def test_mergeRequest_no_other_request(self):
        """ Test if builder test for codebases in requests """
        self.bldr.config.nextSlave = nth_slave(0)
        # set up all of the data required for a BuildRequest object
        rows = [
            fakedb.SourceStamp(id=234, codebase='A'),
            fakedb.Change(changeid=14, codebase='A', sourcestampid=234),
            fakedb.Buildset(id=30,
                            reason='foo',
                            submitted_at=1300305712,
                            results=-1),
            fakedb.BuildsetSourceStamp(sourcestampid=234, buildsetid=30),
            fakedb.BuildRequest(id=19,
                                buildsetid=30,
                                buildername='A',
                                priority=13,
                                submitted_at=1300305712,
                                results=-1),
        ]

        self.addSlaves({'test-slave1': 1, 'test-slave2': 1})

        def mergeRequests_fn(builder, breq, other):
            # Allow all requests
            self.fail("Should never be called")
            return True

        self.bldr.getMergeRequestsFn = lambda: mergeRequests_fn

        # check if the request remains the same
        yield self.do_test_maybeStartBuildsOnBuilder(rows=rows,
                                                     exp_claims=[19],
                                                     exp_builds=[
                                                         ('test-slave1', [19]),
                                                     ])
Ejemplo n.º 10
0
    def test_addBuildsetForSourceStamp_list_of_renderable_builderNames(self):
        names = ['a', 'b', properties.Interpolate('%(prop:extra_builder)s')]
        sched = self.makeScheduler(name='n', builderNames=names)

        self.master.db.insertTestData([
            fakedb.Builder(id=1, name='a'),
            fakedb.Builder(id=2, name='b'),
            fakedb.Builder(id=3, name='c'),
            fakedb.SourceStamp(id=98, branch='stable'),
            fakedb.Change(changeid=25, sourcestampid=98, branch='stable'),
            fakedb.ChangeProperty(changeid=25,
                                  property_name='extra_builder',
                                  property_value='["c","Change"]'),
        ])

        bsid, brids = yield sched.addBuildsetForSourceStamps(reason='whynot',
                                                             waited_for=False,
                                                             sourcestamps=[98])
        self.assertEqual((bsid, brids), self.exp_bsid_brids)
        self.master.data.updates.addBuildset.assert_called_with(
            waited_for=False,
            builderids=[1, 2, 3],
            external_idstring=None,
            properties={
                'scheduler': ('n', 'Scheduler'),
                'extra_builder': ('c', 'Change')
            },
            reason='whynot',
            scheduler='n',
            sourcestamps=[98])
Ejemplo n.º 11
0
    def test_getRecentChanges_subset(self):
        d = self.insertTestData([
            fakedb.Change(changeid=8),
            fakedb.Change(changeid=9),
            fakedb.Change(changeid=10),
            fakedb.Change(changeid=11),
            fakedb.Change(changeid=12),
        ] + self.change13_rows + self.change14_rows)
        d.addCallback(lambda _: self.db.changes.getRecentChanges(5))

        def check(changes):
            changeids = [c['changeid'] for c in changes]
            self.assertEqual(changeids, [10, 11, 12, 13, 14])

        d.addCallback(check)
        return d
Ejemplo n.º 12
0
 def test_addChange(self):
     # src and codebase are default here
     kwargs = dict(author='warner',
                   branch='warnerdb',
                   category='devel',
                   comments='fix whitespace',
                   files=['master/buildbot/__init__.py'],
                   project='Buildbot',
                   repository='git://warner',
                   revision='0e92a098b',
                   revlink='http://warner/0e92a098b',
                   when_timestamp=256738404,
                   properties={'foo': 20})
     expectedRoutingKey = ('changes', '500', 'new')
     expectedMessage = self.changeEvent
     expectedRow = fakedb.Change(
         changeid=500,
         author='warner',
         comments='fix whitespace',
         branch='warnerdb',
         revision='0e92a098b',
         revlink='http://warner/0e92a098b',
         when_timestamp=256738404,
         category='devel',
         repository='git://warner',
         codebase='',
         project='Buildbot',
         sourcestampid=100,
     )
     return self.do_test_addChange(kwargs, expectedRoutingKey,
                                   expectedMessage, expectedRow)
Ejemplo n.º 13
0
    def test_startService_treeStableTimer(self):
        cf = mock.Mock()
        sched = self.makeScheduler(self.Subclass,
                                   treeStableTimer=10,
                                   change_filter=cf)

        self.db.schedulers.fakeClassifications(self.OBJECTID, {20: True})
        self.master.db.insertTestData([
            fakedb.Change(changeid=20),
            fakedb.SchedulerChange(objectid=self.OBJECTID,
                                   changeid=20,
                                   important=1)
        ])

        d = sched.startService(_returnDeferred=True)

        # check that the scheduler has started to consume changes, and no
        # classifications have been flushed.  Furthermore, the existing
        # classification should have been acted on, so the timer should be
        # running
        def check(_):
            self.assertConsumingChanges(fileIsImportant=None,
                                        change_filter=cf,
                                        onlyImportant=False)
            self.db.schedulers.assertClassifications(self.OBJECTID, {20: True})
            self.assertTrue(sched.timer_started)
            self.assertEqual(sched.getPendingBuildTimes(), [10])
            self.clock.advance(10)
            self.assertEqual(sched.getPendingBuildTimes(), [])

        d.addCallback(check)
        d.addCallback(lambda _: sched.stopService())
        return d
Ejemplo n.º 14
0
    def test_addBuildsetForSourceStamp_combine_change_properties(self):
        sched = self.makeScheduler()

        self.master.db.insertTestData([
            fakedb.SourceStamp(id=98, branch='stable'),
            fakedb.Change(changeid=25, sourcestampid=98, branch='stable'),
            fakedb.ChangeProperty(changeid=25,
                                  property_name='color',
                                  property_value='["pink","Change"]'),
        ])

        bsid, brids = yield sched.addBuildsetForSourceStamps(reason='whynot',
                                                             waited_for=False,
                                                             sourcestamps=[98])
        self.assertEqual((bsid, brids), self.exp_bsid_brids)
        self.master.data.updates.addBuildset.assert_called_with(
            waited_for=False,
            builderids=[1, 2],
            external_idstring=None,
            properties={
                'scheduler': ('testsched', 'Scheduler'),
                'color': ('pink', 'Change')
            },
            reason='whynot',
            scheduler='testsched',
            sourcestamps=[98])
Ejemplo n.º 15
0
        def addChange(codebase,
                      revision,
                      author,
                      comments,
                      branch='master',
                      category='cat',
                      project='proj',
                      repository='repo'):
            lastID["sourcestampid"] += 1
            lastID["changeid"] += 1
            parent_changeids = codebase_ss.get(codebase, None)

            codebase_ss[codebase] = lastID["sourcestampid"]

            changeRows = [
                fakedb.SourceStamp(id=lastID["sourcestampid"],
                                   codebase=codebase,
                                   revision=revision),
                fakedb.Change(changeid=lastID["changeid"],
                              author=author,
                              comments=comments,
                              revision=revision,
                              sourcestampid=lastID["sourcestampid"],
                              parent_changeids=parent_changeids,
                              when_timestamp=SOMETIME + lastID["changeid"],
                              branch=branch,
                              category=category,
                              project=project,
                              repository=repository)
            ]
            return changeRows
Ejemplo n.º 16
0
    def test_pruneChanges_lots(self):
        d = self.insertTestData([
            fakedb.SourceStamp(id=29),
        ] + [
            fakedb.Change(changeid=n, sourcestampid=29) for n in range(1, 151)
        ])

        d.addCallback(lambda _: self.db.changes.pruneChanges(1))

        def check(_):
            def thd(conn):
                results = {}
                for tbl_name in ('scheduler_changes', 'change_files',
                                 'change_properties', 'changes'):
                    tbl = self.db.model.metadata.tables[tbl_name]
                    res = conn.execute(sa.select([tbl.c.changeid]))
                    results[tbl_name] = len([row for row in res.fetchall()])
                self.assertEqual(
                    results, {
                        'scheduler_changes': 0,
                        'change_files': 0,
                        'change_properties': 0,
                        'changes': 1,
                    })

            return self.db.pool.do(thd)

        d.addCallback(check)
        return d
    def test_activate_treeStableTimer(self):
        cf = mock.Mock()
        sched = self.makeScheduler(
            self.Subclass, treeStableTimer=10, change_filter=cf)

        self.db.schedulers.fakeClassifications(self.SCHEDULERID, {20: True})
        self.master.db.insertTestData([
            fakedb.Change(changeid=20),
            fakedb.SchedulerChange(schedulerid=self.SCHEDULERID,
                                   changeid=20, important=1)
        ])

        yield sched.activate()

        # check that the scheduler has started to consume changes, and no
        # classifications have been flushed.  Furthermore, the existing
        # classification should have been acted on, so the timer should be
        # running
        self.assertConsumingChanges(fileIsImportant=None, change_filter=cf,
                                    onlyImportant=False)
        self.db.schedulers.assertClassifications(
                self.SCHEDULERID, {20: True})
        self.assertTrue(sched.timer_started)
        self.clock.advance(10)
        yield sched.deactivate()
Ejemplo n.º 18
0
    def test_addBuildsetForSourceStamp_renderable_builderNames(self):
        @properties.renderer
        def names(props):
            if props.changes[0]['branch'] == 'stable':
                return ['c']
            elif props.changes[0]['branch'] == 'unstable':
                return ['a', 'b']

        sched = self.makeScheduler(name='n', builderNames=names)

        self.master.db.insertTestData([
            fakedb.Builder(id=1, name='a'),
            fakedb.Builder(id=2, name='b'),
            fakedb.Builder(id=3, name='c'),
            fakedb.SourceStamp(id=98, branch='stable'),
            fakedb.SourceStamp(id=99, branch='unstable'),
            fakedb.Change(changeid=25, sourcestampid=98, branch='stable'),
            fakedb.Change(changeid=26, sourcestampid=99, branch='unstable'),
        ])

        bsid, brids = yield sched.addBuildsetForSourceStamps(reason=u'whynot',
                                                             waited_for=False,
                                                             sourcestamps=[98])
        self.assertEqual((bsid, brids), self.exp_bsid_brids)
        self.master.data.updates.addBuildset.assert_called_with(
            waited_for=False,
            builderids=[3],
            external_idstring=None,
            properties={
                u'scheduler': (u'n', u'Scheduler')},
            reason=u'whynot',
            scheduler=u'n',
            sourcestamps=[98])

        bsid, brids = yield sched.addBuildsetForSourceStamps(reason=u'because',
                                                             waited_for=False,
                                                             sourcestamps=[99])
        self.assertEqual((bsid, brids), self.exp_bsid_brids)
        self.master.data.updates.addBuildset.assert_called_with(
            waited_for=False,
            builderids=[1, 2],
            external_idstring=None,
            properties={
                u'scheduler': (u'n', u'Scheduler')},
            reason=u'because',
            scheduler=u'n',
            sourcestamps=[99])
Ejemplo n.º 19
0
    def test_canBeCollapsed_different_codebases_raises_error(self):
        """ This testcase has two buildrequests
            Request Change Codebase   Revision Comment
            ----------------------------------------------------------------------
            288     17     C          1800     request 1 has repo not in request 2
            289     18     D          2100     request 2 has repo not in request 1
            --------------------------------
            Merge cannot be performed and raises error:
              Merging requests requires both requests to have the same codebases
        """
        brDicts = []  # list of buildrequests dictionary
        master = fakemaster.make_master(self, wantData=True, wantDb=True)
        master.db.insertTestData([
            fakedb.Builder(id=77, name='bldr'),
            fakedb.SourceStamp(id=238, branch='trunk',
                               revision='1800', repository='svn://c..',
                               codebase='C', project='world-domination'),
            fakedb.Change(changeid=17, branch='trunk', revision='1800',
                          repository='svn://c..', codebase='C',
                          project='world-domination', sourcestampid=238),

            fakedb.SourceStamp(id=239, branch='trunk',
                               revision='2100', repository='svn://d..',
                               codebase='D', project='world-domination'),
            fakedb.Change(changeid=18, branch='trunk', revision='2100',
                          repository='svn://d..', codebase='D',
                          project='world-domination', sourcestampid=239),

            fakedb.Buildset(id=539, reason='triggered'),
            fakedb.BuildsetSourceStamp(buildsetid=539, sourcestampid=238),
            fakedb.BuildRequest(id=288, buildsetid=539, builderid=77),

            fakedb.Buildset(id=540, reason='triggered'),
            fakedb.BuildsetSourceStamp(buildsetid=540, sourcestampid=239),
            fakedb.BuildRequest(id=289, buildsetid=540, builderid=77),
        ])
        # use getBuildRequest to minimize the risk from changes to the format
        # of the brdict
        req = yield master.db.buildrequests.getBuildRequest(288)
        brDicts.append(req)
        req = yield master.db.buildrequests.getBuildRequest(289)
        brDicts.append(req)
        can_collapse = \
            yield buildrequest.BuildRequest.canBeCollapsed(master, brDicts[0],
                                                           brDicts[1])

        self.assertEqual(can_collapse, False)
Ejemplo n.º 20
0
    def test_addBuildsetForChanges_multiple_changes_single_codebase(self):
        sched = self.makeScheduler(name='n', builderNames=['b', 'c'])
        self.db.insertTestData([
            fakedb.Change(changeid=13,
                          branch='trunk',
                          revision='9283',
                          repository='svn://...',
                          project='knitting',
                          codebase=''),
            fakedb.Change(changeid=14,
                          branch='devel',
                          revision='9284',
                          repository='svn://...',
                          project='making-tea',
                          codebase=''),
            fakedb.Change(changeid=15,
                          branch='trunk',
                          revision='9285',
                          repository='svn://...',
                          project='world-domination',
                          codebase=''),
        ])

        # note that the changeids are given out of order here; it should still
        # use the most recent
        d = sched.addBuildsetForChanges(reason='power', changeids=[14, 15, 13])

        def check((bsid, brids)):
            self.db.buildsets.assertBuildset(
                bsid,
                dict(reason='power',
                     brids=brids,
                     external_idstring=None,
                     properties=[('scheduler', ('n', 'Scheduler'))],
                     sourcestampsetid=100), {
                         '':
                         dict(branch='trunk',
                              repository='svn://...',
                              codebase='',
                              changeids=set([13, 14, 15]),
                              project='world-domination',
                              revision='9285',
                              sourcestampsetid=100)
                     })

        d.addCallback(check)
        return d
Ejemplo n.º 21
0
 def test_addChange_repository_revision(self):
     self.master.config = mock.Mock(name='master.config')
     self.master.config.revlink = lambda rev, repo: 'foo%sbar%sbaz' % (repo, rev)
     # revlink is default here
     kwargs = dict(author='warner', committer='david', branch='warnerdb',
                   category='devel', comments='fix whitespace',
                   files=['master/buildbot/__init__.py'],
                   project='Buildbot', repository='git://warner',
                   codebase='', revision='0e92a098b', when_timestamp=256738404,
                   properties={'foo': 20})
     expectedRoutingKey = ('changes', '500', 'new')
     # When no revlink is passed to addChange, but a repository and revision is
     # passed, the revlink should be constructed by calling the revlink callable
     # in the config. We thus expect a revlink of 'foogit://warnerbar0e92a098bbaz'
     expectedMessage = {
         'author': 'warner',
         'committer': 'david',
         'branch': 'warnerdb',
         'category': 'devel',
         'codebase': '',
         'comments': 'fix whitespace',
         'changeid': 500,
         'files': ['master/buildbot/__init__.py'],
         'parent_changeids': [],
         'project': 'Buildbot',
         'properties': {'foo': (20, 'Change')},
         'repository': 'git://warner',
         'revision': '0e92a098b',
         'revlink': 'foogit://warnerbar0e92a098bbaz',
         'when_timestamp': 256738404,
         'sourcestamp': {
             'branch': 'warnerdb',
             'codebase': '',
             'patch': None,
             'project': 'Buildbot',
             'repository': 'git://warner',
             'revision': '0e92a098b',
             'created_at': epoch2datetime(10000000),
             'ssid': 100,
         },
         # uid
     }
     expectedRow = fakedb.Change(
         changeid=500,
         author='warner',
         committer='david',
         comments='fix whitespace',
         branch='warnerdb',
         revision='0e92a098b',
         revlink='foogit://warnerbar0e92a098bbaz',
         when_timestamp=256738404,
         category='devel',
         repository='git://warner',
         codebase='',
         project='Buildbot',
         sourcestampid=100,
     )
     return self.do_test_addChange(kwargs,
                                   expectedRoutingKey, expectedMessage, expectedRow)
    def test_fromBrdict_multiple_sourcestamps(self):
        master = fakemaster.make_master(testcase=self,
                                        wantData=True, wantDb=True)
        master.db.insertTestData([
            fakedb.Builder(id=77, name='bldr'),
            fakedb.SourceStamp(id=234, branch='trunk',
                               revision='9283', repository='svn://a..',
                               codebase='A', project='world-domination'),
            fakedb.Change(changeid=13, branch='trunk', revision='9283',
                          repository='svn://a..', codebase='A',
                          project='world-domination', sourcestampid=234),

            fakedb.SourceStamp(id=235, branch='trunk',
                               revision='9284', repository='svn://b..',
                               codebase='B', project='world-domination'),
            fakedb.Change(changeid=14, branch='trunk', revision='9284',
                          repository='svn://b..', codebase='B',
                          project='world-domination', sourcestampid=235),

            fakedb.Buildset(id=539, reason='triggered'),
            fakedb.BuildsetSourceStamp(buildsetid=539, sourcestampid=234),
            fakedb.BuildsetProperty(buildsetid=539, property_name='x',
                                    property_value='[1, "X"]'),
            fakedb.BuildsetProperty(buildsetid=539, property_name='y',
                                    property_value='[2, "Y"]'),
            fakedb.BuildRequest(id=288, buildsetid=539, builderid=77,
                                priority=13, submitted_at=1200000000),
        ])
        # use getBuildRequest to minimize the risk from changes to the format
        # of the brdict
        d = master.db.buildrequests.getBuildRequest(288)
        d.addCallback(lambda brdict:
                      buildrequest.BuildRequest.fromBrdict(master, brdict))

        def check(br):
            self.assertEqual(br.reason, 'triggered')

            self.assertEqual(br.properties.getProperty('x'), 1)
            self.assertEqual(br.properties.getProperty('y'), 2)
            self.assertEqual(br.submittedAt, 1200000000)
            self.assertEqual(br.buildername, 'bldr')
            self.assertEqual(br.priority, 13)
            self.assertEqual(br.id, 288)
            self.assertEqual(br.bsid, 539)
        d.addCallback(check)
        return d
Ejemplo n.º 23
0
 def test_pollDatabaseChanges_catchup(self):
     # with no existing state, it should catch up to the most recent change,
     # but not process anything
     self.db.insertTestData([
         fakedb.Object(id=22, name=self.master_name,
                       class_name='buildbot.master.BuildMaster'),
         fakedb.Change(changeid=10),
         fakedb.Change(changeid=11),
     ])
     d = self.master.pollDatabaseChanges()
     def check(_):
         self.assertEqual(self.gotten_changes, [])
         self.assertEqual(self.gotten_buildset_additions, [])
         self.assertEqual(self.gotten_buildset_completions, [])
         self.db.state.assertState(22, last_processed_change=11)
     d.addCallback(check)
     return d
Ejemplo n.º 24
0
 def setUp(self):
     self.setUpEndpoint()
     self.db.insertTestData([
         fakedb.SourceStamp(id=234),
         fakedb.Change(changeid=13, branch=u'trunk', revision=u'9283',
                       repository=u'svn://...', codebase=u'cbsvn',
                       project=u'world-domination', sourcestampid=234),
     ])
Ejemplo n.º 25
0
    def test_pruneChanges(self):
        d = self.insertTestData([
            fakedb.Scheduler(schedulerid=29),
            fakedb.SourceStamp(id=234),

            fakedb.Change(changeid=11),

            fakedb.Change(changeid=12),
            fakedb.SchedulerChange(schedulerid=29, changeid=12),
            fakedb.SourceStampChange(sourcestampid=234, changeid=12),
            ] +

            self.change13_rows + [
            fakedb.SchedulerChange(schedulerid=29, changeid=13),
            ] +

            self.change14_rows + [
            fakedb.SchedulerChange(schedulerid=29, changeid=14),

            fakedb.Change(changeid=15),
            fakedb.SourceStampChange(sourcestampid=234, changeid=15),
            ]
        )

        # pruning with a horizon of 2 should delete changes 11, 12 and 13
        d.addCallback(lambda _ : self.db.changes.pruneChanges(2))
        def check(_):
            def thd(conn):
                results = {}
                for tbl_name in ('scheduler_changes', 'sourcestamp_changes',
                                 'change_files', 'change_links',
                                 'change_properties', 'changes'):
                    tbl = self.db.model.metadata.tables[tbl_name]
                    r = conn.execute(sa.select([tbl.c.changeid]))
                    results[tbl_name] = sorted([ r[0] for r in r.fetchall() ])
                self.assertEqual(results, {
                    'scheduler_changes': [14],
                    'sourcestamp_changes': [15],
                    'change_files': [14],
                    'change_links': [],
                    'change_properties': [],
                    'changes': [14, 15],
                })
            return self.db.pool.do(thd)
        d.addCallback(check)
        return d
Ejemplo n.º 26
0
    def test_addChange_src_codebase(self):
        createUserObject = mock.Mock(spec=users.createUserObject)
        createUserObject.return_value = defer.succeed(123)
        self.patch(users, 'createUserObject', createUserObject)
        kwargs = dict(author='warner', branch='warnerdb',
                      category='devel', comments='fix whitespace',
                      files=['master/buildbot/__init__.py'],
                      project='Buildbot', repository='git://warner',
                      revision='0e92a098b', revlink='http://warner/0e92a098b',
                      when_timestamp=256738404,
                      properties={'foo': 20}, src='git', codebase='cb')
        expectedRoutingKey = ('changes', '500', 'new')
        expectedMessage = {
            'author': 'warner',
            'branch': 'warnerdb',
            'category': 'devel',
            'codebase': 'cb',
            'comments': 'fix whitespace',
            'changeid': 500,
            'files': ['master/buildbot/__init__.py'],
            'parent_changeids': [],
            'project': 'Buildbot',
            'properties': {'foo': (20, 'Change')},
            'repository': 'git://warner',
            'revision': '0e92a098b',
            'revlink': 'http://warner/0e92a098b',
            'when_timestamp': 256738404,
            'sourcestamp': {
                'branch': 'warnerdb',
                'codebase': 'cb',
                'patch': None,
                'project': 'Buildbot',
                'repository': 'git://warner',
                'revision': '0e92a098b',
                'created_at': epoch2datetime(10000000),
                'ssid': 100,
            },
            # uid
        }
        expectedRow = fakedb.Change(
            changeid=500,
            author='warner',
            comments='fix whitespace',
            branch='warnerdb',
            revision='0e92a098b',
            revlink='http://warner/0e92a098b',
            when_timestamp=256738404,
            category='devel',
            repository='git://warner',
            codebase='cb',
            project='Buildbot',
            sourcestampid=100,
        )
        yield self.do_test_addChange(kwargs,
                                   expectedRoutingKey, expectedMessage, expectedRow,
                                   expectedChangeUsers=[123])

        createUserObject.assert_called_once_with(self.master, 'warner', 'git')
Ejemplo n.º 27
0
 def test_addChange_src_codebaseGenerator(self):
     def preChangeGenerator(**kwargs):
         return kwargs
     self.master.config = mock.Mock(name='master.config')
     self.master.config.preChangeGenerator = preChangeGenerator
     self.master.config.codebaseGenerator = \
         lambda change: 'cb-%s' % change['category']
     kwargs = dict(author=u'warner', branch=u'warnerdb',
                   category=u'devel', comments=u'fix whitespace',
                   files=[u'master/buildbot/__init__.py'],
                   project=u'Buildbot', repository=u'git://warner',
                   revision=u'0e92a098b', revlink=u'http://warner/0e92a098b',
                   when_timestamp=256738404,
                   properties={u'foo': 20})
     expectedRoutingKey = ('changes', '500', 'new')
     expectedMessage = {
         'author': u'warner',
         'branch': u'warnerdb',
         'category': u'devel',
         'codebase': u'cb-devel',
         'comments': u'fix whitespace',
         'changeid': 500,
         'files': [u'master/buildbot/__init__.py'],
         'parent_changeids': [],
         'project': u'Buildbot',
         'properties': {u'foo': (20, u'Change')},
         'repository': u'git://warner',
         'revision': u'0e92a098b',
         'revlink': u'http://warner/0e92a098b',
         'when_timestamp': 256738404,
         'sourcestamp': {
             'branch': u'warnerdb',
             'codebase': u'cb-devel',
             'patch': None,
             'project': u'Buildbot',
             'repository': u'git://warner',
             'revision': u'0e92a098b',
             'created_at': epoch2datetime(10000000),
             'ssid': 100,
         },
         # uid
     }
     expectedRow = fakedb.Change(
         changeid=500,
         author='warner',
         comments='fix whitespace',
         branch='warnerdb',
         revision='0e92a098b',
         revlink='http://warner/0e92a098b',
         when_timestamp=256738404,
         category='devel',
         repository='git://warner',
         codebase='cb-devel',
         project='Buildbot',
         sourcestampid=100,
     )
     return self.do_test_addChange(kwargs,
                                   expectedRoutingKey, expectedMessage, expectedRow)
Ejemplo n.º 28
0
 def insertTestData(self, buildResults, finalResult):
     self.db = self.master.db
     self.db.insertTestData([
         fakedb.Master(id=92),
         fakedb.Worker(id=13, name='sl'),
         fakedb.Builder(id=79, name='Builder0'),
         fakedb.Builder(id=80, name='Builder1'),
         fakedb.Buildset(id=98, results=finalResult, reason="testReason1"),
         fakedb.BuildsetSourceStamp(buildsetid=98, sourcestampid=234),
         fakedb.SourceStamp(id=234,
                            project=self.TEST_PROJECT,
                            revision=self.TEST_REVISION,
                            repository=self.TEST_REPO),
         fakedb.Change(changeid=13,
                       branch=u'master',
                       revision=u'9283',
                       author='me@foo',
                       repository=self.TEST_REPO,
                       codebase=u'cbgerrit',
                       project=u'world-domination',
                       sourcestampid=234),
     ])
     for i, results in enumerate(buildResults):
         self.db.insertTestData([
             fakedb.BuildRequest(id=11 + i, buildsetid=98,
                                 builderid=79 + i),
             fakedb.Build(id=20 + i,
                          number=i,
                          builderid=79 + i,
                          buildrequestid=11 + i,
                          workerid=13,
                          masterid=92,
                          results=results,
                          state_string=u"buildText"),
             fakedb.Step(id=50 + i, buildid=20 + i, number=5, name='make'),
             fakedb.Log(id=60 + i,
                        stepid=50 + i,
                        name='stdio',
                        slug='stdio',
                        type='s',
                        num_lines=7),
             fakedb.LogChunk(
                 logid=60 + i,
                 first_line=0,
                 last_line=1,
                 compressed=0,
                 content=u'Unicode log with non-ascii (\u00E5\u00E4\u00F6).'
             ),
             fakedb.BuildProperty(buildid=20 + i,
                                  name="workername",
                                  value="sl"),
             fakedb.BuildProperty(buildid=20 + i,
                                  name="reason",
                                  value="because"),
         ])
         for k, v in iteritems(self.TEST_PROPS):
             self.db.insertTestData(
                 [fakedb.BuildProperty(buildid=20 + i, name=k, value=v)])
Ejemplo n.º 29
0
    def test_fromSsdict_changes(self):
        master = mock.Mock()
        master.db = fakedb.FakeDBConnector(self)
        master.db.insertTestData([
            fakedb.Change(changeid=13,
                          branch='trunk',
                          revision='9283',
                          repository='svn://...',
                          project='world-domination'),
            fakedb.Change(changeid=14,
                          branch='trunk',
                          revision='9284',
                          repository='svn://...',
                          project='world-domination'),
            fakedb.Change(changeid=15,
                          branch='trunk',
                          revision='9284',
                          repository='svn://...',
                          project='world-domination'),
            fakedb.SourceStamp(id=234,
                               branch='trunk',
                               revision='9284',
                               repository='svn://...',
                               project='world-domination'),
            fakedb.SourceStampChange(sourcestampid=234, changeid=14),
            fakedb.SourceStampChange(sourcestampid=234, changeid=13),
            fakedb.SourceStampChange(sourcestampid=234, changeid=15),
        ])
        # use getSourceStamp to minimize the risk from changes to the format of
        # the ssdict
        d = master.db.sourcestamps.getSourceStamp(234)
        d.addCallback(
            lambda ssdict: sourcestamp.SourceStamp.fromSsdict(master, ssdict))

        def check(ss):
            self.assertEqual(ss.ssid, 234)
            self.assertEqual(ss.branch, 'trunk')
            self.assertEqual(ss.revision, '9284')
            self.assertEqual(ss.patch, None)
            self.assertEqual([ch.number for ch in ss.changes], [13, 14, 15])
            self.assertEqual(ss.project, 'world-domination')
            self.assertEqual(ss.repository, 'svn://...')

        d.addCallback(check)
        return d
Ejemplo n.º 30
0
 def mkch(self, **kwargs):
     # create changeset and insert in database.
     chd = dict(branch='master', project='', repository='')
     chd.update(kwargs)
     ch = self.makeFakeChange(**chd)
     # fakedb.Change requires changeid instead of number
     chd['changeid'] = chd['number']
     del chd['number']
     self.db.insertTestData([fakedb.Change(**chd)])
     return ch