def setUp(self): self.setUpBuilderMixin() # a collection of rows that would otherwise clutter up every test master_id = fakedb.FakeBuildRequestsComponent.MASTER_ID self.base_rows = [ fakedb.SourceStamp(id=21), fakedb.Buildset(id=11, reason='because'), fakedb.BuildsetSourceStamp(buildsetid=11, sourcestampid=21), fakedb.Builder(id=77, name='bldr1'), fakedb.Builder(id=78, name='bldr2'), fakedb.Builder(id=182, name='foo@bar'), fakedb.BuildRequest(id=111, submitted_at=1000, builderid=77, buildsetid=11), fakedb.BuildRequest(id=222, submitted_at=2000, builderid=77, buildsetid=11), fakedb.BuildRequestClaim(brid=222, masterid=master_id, claimed_at=2001), fakedb.BuildRequest(id=333, submitted_at=3000, builderid=77, buildsetid=11), fakedb.BuildRequest(id=444, submitted_at=2500, builderid=78, buildsetid=11), fakedb.BuildRequestClaim(brid=444, masterid=master_id, claimed_at=2501), fakedb.BuildRequest(id=555, submitted_at=2800, builderid=182, buildsetid=11), ] yield self.db.insertTestData(self.base_rows)
def setUp(self): # a collection of rows that would otherwise clutter up every test master_id = fakedb.FakeBuildRequestsComponent.MASTER_ID self.base_rows = [ fakedb.SourceStampSet(id=21), fakedb.SourceStamp(id=21, sourcestampsetid=21), fakedb.Buildset(id=11, reason='because', sourcestampsetid=21), fakedb.BuildRequest(id=111, submitted_at=1000, buildername='bldr1', buildsetid=11), fakedb.BuildRequest(id=222, submitted_at=2000, buildername='bldr1', buildsetid=11), fakedb.BuildRequestClaim(brid=222, objectid=master_id, claimed_at=2001), fakedb.BuildRequest(id=333, submitted_at=3000, buildername='bldr1', buildsetid=11), fakedb.BuildRequest(id=444, submitted_at=2500, buildername='bldr2', buildsetid=11), fakedb.BuildRequestClaim(brid=444, objectid=master_id, claimed_at=2501), ]
def test_reclaimBuildRequests_fail(self): d = self.do_test_reclaimBuildRequests( [ fakedb.BuildRequest(id=44, buildsetid=self.BSID), fakedb.BuildRequestClaim( brid=44, objectid=self.MASTER_ID, claimed_at=1300103810), fakedb.BuildRequest(id=45, buildsetid=self.BSID), fakedb.BuildRequestClaim(brid=45, objectid=self.OTHER_MASTER_ID, claimed_at=1300103810), ], 1300305712, [44, 45], expfailure=buildrequests.AlreadyClaimedError) def check(_): # check that the time wasn't updated on 44, noting that MySQL does # not support this. if self.db_engine.dialect.name == 'mysql': return def thd(conn): tbl = self.db.model.buildrequest_claims q = tbl.select(order_by=tbl.c.brid) results = conn.execute(q).fetchall() self.assertEqual([(r.brid, r.claimed_at, r.objectid) for r in results], [ (44, 1300103810, self.MASTER_ID), (45, 1300103810, self.OTHER_MASTER_ID), ]) return self.db.pool.do(thd) d.addCallback(check) return d
def do_test_getBuildRequests_claim_args(self, **kwargs): expected = kwargs.pop('expected') d = self.insertTestData([ # 50: claimed by this master fakedb.BuildRequest(id=50, buildsetid=self.BSID), fakedb.BuildRequestClaim(brid=50, objectid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 51: claimed by another master fakedb.BuildRequest(id=51, buildsetid=self.BSID), fakedb.BuildRequestClaim(brid=51, objectid=self.OTHER_MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 52: unclaimed fakedb.BuildRequest(id=52, buildsetid=self.BSID), # 53: unclaimed but complete (should not appear for claimed=False) fakedb.BuildRequest(id=53, buildsetid=self.BSID, complete=1), ]) d.addCallback( lambda _: self.db.buildrequests.getBuildRequests(**kwargs)) def check(brlist): self.assertEqual(sorted([br['brid'] for br in brlist]), sorted(expected)) d.addCallback(check) return d
def do_test_getBuildRequests_claim_args(self, **kwargs): expected = kwargs.pop('expected') yield self.insertTestData([ # 50: claimed by this master fakedb.BuildRequest(id=50, buildsetid=self.BSID, builderid=self.BLDRID1), fakedb.BuildRequestClaim(brid=50, masterid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 51: claimed by another master fakedb.BuildRequest(id=51, buildsetid=self.BSID, builderid=self.BLDRID2), fakedb.BuildRequestClaim(brid=51, masterid=self.OTHER_MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 52: unclaimed fakedb.BuildRequest(id=52, buildsetid=self.BSID, builderid=self.BLDRID1), # 53: unclaimed but complete (should not appear for claimed=False) fakedb.BuildRequest(id=53, buildsetid=self.BSID, builderid=self.BLDRID1, complete=1), ]) brlist = yield self.db.buildrequests.getBuildRequests(**kwargs) self.assertEqual(sorted([br['buildrequestid'] for br in brlist]), sorted(expected))
def test_reclaimBuildRequests_fail(self): d = self.do_test_reclaimBuildRequests( [ fakedb.BuildRequest(id=44, buildsetid=self.BSID), fakedb.BuildRequestClaim( brid=44, masterid=self.MASTER_ID, claimed_at=1300103810), fakedb.BuildRequest(id=45, buildsetid=self.BSID), fakedb.BuildRequestClaim(brid=45, masterid=self.OTHER_MASTER_ID, claimed_at=1300103810), ], 1300305712, [44, 45], expfailure=buildrequests.AlreadyClaimedError) # check that the time wasn't updated on 44, noting that MySQL does # not support this. if self.db_engine.dialect.name == 'mysql': return d d.addCallback(lambda _: self.db.buildrequests.getBuildRequests()) def check(results): self.assertEqual( sorted((r['buildrequestid'], r['claimed_at'], r['claimed_by_masterid']) for r in results), [ (44, epoch2datetime(1300103810), self.MASTER_ID), (45, epoch2datetime(1300103810), self.OTHER_MASTER_ID), ]) d.addCallback(check) return d
class TestMastersConfigConnectorComponent( connector_component.ConnectorComponentMixin, unittest.TestCase): def setUp(self): d = self.setUpConnectorComponent( table_names=['mastersconfig', 'objects', 'buildrequest_claims', 'buildrequests']) def finish_setup(_): self.db.mastersconfig = mastersconfig.MastersConfigConnectorComponent(self.db) d.addCallback(finish_setup) return d def tearDown(self): return self.tearDownConnectorComponent() # common sample data background_data = [ fakedb.Object(id=1, name='katana/buildmaster-01', class_name='buildbot.master.BuildMaster'), fakedb.Object(id=2, name='katana/buildmaster-02', class_name='buildbot.master.BuildMaster'), fakedb.MasterConfig(id=1, buildbotURL='http://localhost:8001/', objectid=1), fakedb.MasterConfig(id=2, buildbotURL='http://localhost:8002/', objectid=2), fakedb.BuildRequest(id=1, buildsetid=1, buildername='b1'), fakedb.BuildRequest(id=2, buildsetid=2, buildername='b1'), fakedb.BuildRequestClaim(brid=1, objectid=1, claimed_at='1416383733'), fakedb.BuildRequestClaim(brid=2, objectid=2, claimed_at='1416383733'), ] def test_setupMaster(self): d = self.db.mastersconfig.setupMaster('http://localhost:8001/', 1) def check(_): def thd(conn): r = conn.execute(self.db.model.mastersconfig.select()) rows = [(row.id, row.buildbotURL, row.objectid) for row in r.fetchall()] self.assertEqual(rows, [(1, 'http://localhost:8001/', 1)]) return self.db.pool.do(thd) d.addCallback(check) return d def test_getMasterURL(self): d = self.insertTestData(self.background_data) def check(row, expected_master={}): self.assertEqual(row, expected_master) d.addCallback(lambda _ : self.db.mastersconfig.getMasterURL(1)) d.addCallback(check, expected_master={'buildbotURL': 'http://localhost:8001/', 'id': 1, 'objectid': 1}) d.addCallback(lambda _ : self.db.mastersconfig.getMasterURL(2)) d.addCallback(check, expected_master={'buildbotURL': 'http://localhost:8002/', 'id': 2, 'objectid': 2}) return d
def test_getBuildRequests_combo(self): d = self.insertTestData([ # 44: everything we want fakedb.BuildRequest(id=44, buildsetid=self.BSID, builderid=self.BLDRID1, complete=1, results=92, complete_at=self.COMPLETE_AT_EPOCH), fakedb.BuildRequestClaim(brid=44, masterid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 45: different builderid fakedb.BuildRequest(id=45, buildsetid=self.BSID, builderid=self.BLDRID2, complete=1, complete_at=self.COMPLETE_AT_EPOCH), fakedb.BuildRequestClaim(brid=45, masterid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 46: incomplete fakedb.BuildRequest(id=46, buildsetid=self.BSID, builderid=self.BLDRID1, complete=0, results=92, complete_at=0), fakedb.BuildRequestClaim(brid=46, masterid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 47: unclaimed fakedb.BuildRequest(id=47, buildsetid=self.BSID, builderid=self.BLDRID1, complete=1, results=92, complete_at=self.COMPLETE_AT_EPOCH), # 48: claimed by other fakedb.BuildRequest(id=48, buildsetid=self.BSID, builderid=self.BLDRID1, complete=1, results=92, complete_at=self.COMPLETE_AT_EPOCH), fakedb.BuildRequestClaim(brid=48, masterid=self.OTHER_MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 49: different bsid fakedb.Buildset(id=self.BSID + 1), fakedb.BuildRequest(id=49, buildsetid=self.BSID + 1, builderid=self.BLDRID1, complete=1, results=92, complete_at=self.COMPLETE_AT_EPOCH), fakedb.BuildRequestClaim(brid=49, masterid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), ]) d.addCallback(lambda _: self.db.buildrequests.getBuildRequests(builderid=self.BLDRID1, claimed=self.MASTER_ID, complete=True, bsid=self.BSID)) @d.addCallback def check(brlist): self.assertEqual([br['buildrequestid'] for br in brlist], [44]) return d
def test_getBuildRequest(self): d = self.insertTestData([ fakedb.BuildRequest(id=44, buildsetid=self.BSID, builderid=self.BLDRID1, complete=1, results=75, priority=7, submitted_at=self.SUBMITTED_AT_EPOCH, complete_at=self.COMPLETE_AT_EPOCH), fakedb.BuildRequestClaim(brid=44, masterid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), ]) d.addCallback(lambda _: self.db.buildrequests.getBuildRequest(44)) @d.addCallback def check(brdict): self.assertEqual( brdict, dict(buildrequestid=44, buildsetid=self.BSID, builderid=self.BLDRID1, buildername="builder1", priority=7, claimed=True, claimed_by_masterid=self.MASTER_ID, complete=True, results=75, claimed_at=self.CLAIMED_AT, submitted_at=self.SUBMITTED_AT, complete_at=self.COMPLETE_AT, waited_for=False)) return d
def test_getBuildRequest(self): d = self.insertTestData([ fakedb.BuildRequest(id=44, buildsetid=self.BSID, buildername="bbb", complete=1, results=75, priority=7, submitted_at=self.SUBMITTED_AT_EPOCH, complete_at=self.COMPLETE_AT_EPOCH), fakedb.BuildRequestClaim(brid=44, objectid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), ]) d.addCallback(lambda _: self.db.buildrequests.getBuildRequest(44)) def check(brdict): self.assertEqual( brdict, dict(brid=44, buildsetid=self.BSID, buildername="bbb", priority=7, claimed=True, mine=True, complete=True, results=75, claimed_at=self.CLAIMED_AT, submitted_at=self.SUBMITTED_AT, complete_at=self.COMPLETE_AT)) d.addCallback(check) return d
def test_completeBuildRequests(self): return self.do_test_completeBuildRequests([ fakedb.BuildRequest( id=44, buildsetid=self.BSID, builderid=self.BLDRID1), fakedb.BuildRequestClaim( brid=44, masterid=self.MASTER_ID, claimed_at=1300103810), ], 1300305712, [(44, True, 7, epoch2datetime(1300305712))])
def test_claimBuildRequests_other_master_claim_stress(self): d = self.do_test_claimBuildRequests( [ fakedb.BuildRequest(id=id, buildsetid=self.BSID) for id in range(1, 1000) ] + [ fakedb.BuildRequest(id=1000, buildsetid=self.BSID), # the fly in the ointment.. fakedb.BuildRequestClaim(brid=1000, objectid=self.OTHER_MASTER_ID, claimed_at=1300103810), ], 1300305712, range(1, 1001), expfailure=buildrequests.AlreadyClaimedError) def check(_): # check that [1,1000) were not claimed, and 1000 is still claimed def thd(conn): tbl = self.db.model.buildrequest_claims q = tbl.select() results = conn.execute(q).fetchall() self.assertEqual([(r.brid, r.objectid, r.claimed_at) for r in results][:10], [(1000, self.OTHER_MASTER_ID, 1300103810)]) return self.db.pool.do(thd) d.addCallback(check) return d
def test_claimBuildRequests_other_master_claim_stress(self): d = self.do_test_claimBuildRequests( [ fakedb.BuildRequest( id=id, buildsetid=self.BSID, builderid=self.BLDRID1) for id in range(1, 1000) ] + [ fakedb.BuildRequest( id=1000, buildsetid=self.BSID, builderid=self.BLDRID1), # the fly in the ointment.. fakedb.BuildRequestClaim(brid=1000, masterid=self.OTHER_MASTER_ID, claimed_at=1300103810), ], 1300305712, lrange(1, 1001), expfailure=buildrequests.AlreadyClaimedError) d.addCallback( lambda _: self.db.buildrequests.getBuildRequests(claimed=True)) @d.addCallback def check(results): # check that [1,1000) were not claimed, and 1000 is still claimed self.assertEqual([ (r['buildrequestid'], r['claimed_by_masterid'], r['claimed_at']) for r in results ][:10], [(1000, self.OTHER_MASTER_ID, epoch2datetime(1300103810))]) return d
def do_test_unclaimMethod(self, method, expected): d = self.insertTestData([ # 44: a complete build (should not be unclaimed) fakedb.BuildRequest(id=44, buildsetid=self.BSID, builderid=self.BLDRID1, complete=1, results=92, complete_at=self.COMPLETE_AT_EPOCH), fakedb.BuildRequestClaim(brid=44, masterid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 45: incomplete build belonging to this incarnation fakedb.BuildRequest(id=45, buildsetid=self.BSID, builderid=self.BLDRID1, complete=0, complete_at=0), fakedb.BuildRequestClaim(brid=45, masterid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 46: incomplete build belonging to another master fakedb.BuildRequest(id=46, buildsetid=self.BSID, builderid=self.BLDRID1, complete=0, complete_at=0), fakedb.BuildRequestClaim(brid=46, masterid=self.OTHER_MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 47: unclaimed fakedb.BuildRequest(id=47, buildsetid=self.BSID, builderid=self.BLDRID1, complete=0, complete_at=0), # 48: claimed by this master, but recently fakedb.BuildRequest(id=48, buildsetid=self.BSID, builderid=self.BLDRID1, complete=0, complete_at=0), fakedb.BuildRequestClaim(brid=48, masterid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH - 50), # 49: incomplete old build belonging to another master fakedb.BuildRequest(id=49, buildsetid=self.BSID, builderid=self.BLDRID1, complete=0, complete_at=0), fakedb.BuildRequestClaim(brid=49, masterid=self.OTHER_MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH - 1000), ]) d.addCallback(lambda _: method()) # just select the unclaimed requests d.addCallback(lambda _: self.db.buildrequests.getBuildRequests(claimed=False)) @d.addCallback def check(results): self.assertEqual(sorted([r['buildrequestid'] for r in results]), sorted(expected)) return d
def trigger_sch(sourcestamps = None, set_props=None, triggeredbybrid=None, reason=None): rows = [ fakedb.MasterConfig(id=1, buildbotURL="build-master-01/", objectid=1), fakedb.MasterConfig(id=2, buildbotURL="build-master-02/", objectid=2), fakedb.SourceStampSet(id=1), fakedb.SourceStamp(id=1, sourcestampsetid=1, codebase='c', branch="az", repository="xz", revision="ww"), fakedb.Buildset(id=1, reason='because', sourcestampsetid=1), fakedb.BuildRequest(id=1, buildsetid=1, buildername="builder1", submitted_at=130000), fakedb.BuildRequest(id=2, buildsetid=1, buildername="builder2", submitted_at=130000), fakedb.BuildRequestClaim(brid=1, objectid=2, claimed_at=130000), fakedb.BuildRequestClaim(brid=2, objectid=1, claimed_at=130000), fakedb.Build(id=1, number=1, brid=1), fakedb.Build(id=2, number=1, brid=2)] d = m.db.insertTestData(rows) d.addCallback(lambda _: (SUCCESS, {'builder1': 1L, 'builder2': 2L})) return d
def test_claimBuildRequests_other_master_claim(self): return self.do_test_claimBuildRequests([ fakedb.BuildRequest( id=44, buildsetid=self.BSID, builderid=self.BLDRID1), fakedb.BuildRequestClaim(brid=44, masterid=self.OTHER_MASTER_ID, claimed_at=1300103810), ], 1300305712, [44], expfailure=buildrequests.AlreadyClaimedError)
def test_reclaimBuildRequests(self): return self.do_test_reclaimBuildRequests([ fakedb.BuildRequest( id=44, buildsetid=self.BSID, builderid=self.BLDRID1), fakedb.BuildRequestClaim(brid=44, masterid=self.MASTER_ID, claimed_at=1300103810), ], 1300305712, [44], # note that the time is updated [(44, epoch2datetime(1300305712), self.MASTER_ID)])
def test_completeBuildRequests_explicit_time(self): return self.do_test_completeBuildRequests( [ fakedb.BuildRequest(id=44, buildsetid=self.BSID), fakedb.BuildRequestClaim( brid=44, objectid=self.MASTER_ID, claimed_at=1300103810), ], 1300305712, [(44, True, 7, epoch2datetime(999999))], complete_at=epoch2datetime(999999))
def test_completeBuildRequests_multiple(self): return self.do_test_completeBuildRequests([ fakedb.BuildRequest(id=44, buildsetid=self.BSID), fakedb.BuildRequestClaim( brid=44, objectid=self.MASTER_ID, claimed_at=1300103810), fakedb.BuildRequest(id=45, buildsetid=self.BSID), fakedb.BuildRequestClaim( brid=45, objectid=self.OTHER_MASTER_ID, claimed_at=1300103811), fakedb.BuildRequest(id=46, buildsetid=self.BSID), fakedb.BuildRequestClaim( brid=46, objectid=self.MASTER_ID, claimed_at=1300103812), ], 1300305712, [ (44, 1, 7, 1300305712), (45, 0, -1, 0), (46, 1, 7, 1300305712), ], brids=[44, 46])
def test_completeBuildRequests_multiple(self): return self.do_test_completeBuildRequests([ fakedb.BuildRequest( id=44, buildsetid=self.BSID, builderid=self.BLDRID1), fakedb.BuildRequestClaim(brid=44, masterid=self.MASTER_ID, claimed_at=1300103810), fakedb.BuildRequest( id=45, buildsetid=self.BSID, builderid=self.BLDRID1), fakedb.BuildRequestClaim(brid=45, masterid=self.OTHER_MASTER_ID, claimed_at=1300103811), fakedb.BuildRequest( id=46, buildsetid=self.BSID, builderid=self.BLDRID1), fakedb.BuildRequestClaim(brid=46, masterid=self.MASTER_ID, claimed_at=1300103812), ], 1300305712, [(44, True, 7, epoch2datetime(1300305712)), (45, False, -1, None), (46, True, 7, epoch2datetime(1300305712)), ], brids=[44, 46])
def test_reclaimBuildRequests(self): return self.do_test_reclaimBuildRequests( [ fakedb.BuildRequest(id=44, buildsetid=self.BSID), fakedb.BuildRequestClaim( brid=44, objectid=self.MASTER_ID, claimed_at=1300103810), ], 1300305712, [44], # note that the time is updated [(44, 1300305712, self.MASTER_ID)])
def test_masterDeactivated(self): self.master.db.insertTestData([ fakedb.Master(id=14, name='other', active=0, last_active=0), # set up a running build with some steps fakedb.Builder(id=77, name='b1'), fakedb.Worker(id=13, name='wrk'), fakedb.Buildset(id=8822), fakedb.BuildRequest(id=82, builderid=77, buildsetid=8822), fakedb.BuildRequestClaim(brid=82, masterid=14, claimed_at=SOMETIME), fakedb.Build(id=13, builderid=77, masterid=14, workerid=13, buildrequestid=82, number=3, results=None), fakedb.Step(id=200, buildid=13), fakedb.Log(id=2000, stepid=200, num_lines=2), fakedb.LogChunk(logid=2000, first_line=1, last_line=2, content=u'ab\ncd') ]) # mock out the _masterDeactivated methods this will call for rtype in 'builder', 'scheduler', 'changesource': rtype_obj = getattr(self.master.data.rtypes, rtype) m = mock.Mock(name='%s._masterDeactivated' % rtype, spec=rtype_obj._masterDeactivated) m.side_effect = lambda masterid: defer.succeed(None) rtype_obj._masterDeactivated = m # and the update methods.. for meth in 'finishBuild', 'finishStep', 'finishLog': m = mock.create_autospec(getattr(self.master.data.updates, meth)) m.side_effect = lambda *args, **kwargs: defer.succeed(None) setattr(self.master.data.updates, meth, m) yield self.rtype._masterDeactivated(14, 'other') self.master.data.rtypes.builder._masterDeactivated. \ assert_called_with(masterid=14) self.master.data.rtypes.scheduler._masterDeactivated. \ assert_called_with(masterid=14) self.master.data.rtypes.changesource._masterDeactivated. \ assert_called_with(masterid=14) # see that we finished off that build and its steps and logs updates = self.master.data.updates updates.finishLog.assert_called_with(logid=2000) updates.finishStep.assert_called_with( stepid=200, results=RETRY, hidden=False) updates.finishBuild.assert_called_with(buildid=13, results=RETRY) self.assertEqual(self.master.mq.productions, [ (('masters', '14', 'stopped'), dict(masterid=14, name='other', active=False)), ])
def test_completeBuildRequests_stress(self): return self.do_test_completeBuildRequests( [ fakedb.BuildRequest(id=id, buildsetid=self.BSID) for id in range(1, 280) ] + [ fakedb.BuildRequestClaim( brid=id, objectid=self.MASTER_ID, claimed_at=1300103810) for id in range(1, 280) ], 1300305712, [(id, True, 7, epoch2datetime(1300305712)) for id in range(1, 280)], brids=range(1, 280))
def test_completeBuildRequests_multiple_notmine(self): # note that the requests are completed even though they are not mine! return self.do_test_completeBuildRequests([ # two unclaimed requests fakedb.BuildRequest( id=44, buildsetid=self.BSID, builderid=self.BLDRID1), fakedb.BuildRequest( id=45, buildsetid=self.BSID, builderid=self.BLDRID1), # and one claimed by another master fakedb.BuildRequest( id=46, buildsetid=self.BSID, builderid=self.BLDRID1), fakedb.BuildRequestClaim(brid=46, masterid=self.OTHER_MASTER_ID, claimed_at=1300103812), ], 1300305712, [(44, True, 7, epoch2datetime(1300305712)), (45, True, 7, epoch2datetime(1300305712)), (46, True, 7, epoch2datetime(1300305712)), ], brids=[44, 45, 46])
def test_completeBuildRequests_multiple_notmine(self): # note that the requests are completed even though they are not mine! return self.do_test_completeBuildRequests( [ # two unclaimed requests fakedb.BuildRequest(id=44, buildsetid=self.BSID), fakedb.BuildRequest(id=45, buildsetid=self.BSID), # and one claimed by another master fakedb.BuildRequest(id=46, buildsetid=self.BSID), fakedb.BuildRequestClaim(brid=46, objectid=self.MASTER_ID + 1100, claimed_at=1300103812), ], 1300305712, [ (44, 1, 7, 1300305712), (45, 1, 7, 1300305712), (46, 1, 7, 1300305712), ], brids=[44, 45, 46])
def do_test_unclaimMethod(self, method, expected): d = self.insertTestData([ # 44: a complete build (should not be unclaimed) fakedb.BuildRequest(id=44, buildsetid=self.BSID, complete=1, results=92, complete_at=self.COMPLETE_AT_EPOCH), fakedb.BuildRequestClaim(brid=44, objectid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 45: incomplete build belonging to this incarnation fakedb.BuildRequest(id=45, buildsetid=self.BSID, complete=0, complete_at=0), fakedb.BuildRequestClaim(brid=45, objectid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 46: incomplete build belonging to another master fakedb.BuildRequest(id=46, buildsetid=self.BSID, complete=0, complete_at=0), fakedb.BuildRequestClaim(brid=46, objectid=self.OTHER_MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 47: unclaimed fakedb.BuildRequest(id=47, buildsetid=self.BSID, complete=0, complete_at=0), # 48: claimed by this master, but recently fakedb.BuildRequest(id=48, buildsetid=self.BSID, complete=0, complete_at=0), fakedb.BuildRequestClaim(brid=48, objectid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH - 50), # 49: incomplete old build belonging to another master fakedb.BuildRequest(id=49, buildsetid=self.BSID, complete=0, complete_at=0), fakedb.BuildRequestClaim(brid=49, objectid=self.OTHER_MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH - 1000), ]) d.addCallback(lambda _: method()) def check(brlist): def thd(conn): # just select the unclaimed requests reqs_tbl = self.db.model.buildrequests claims_tbl = self.db.model.buildrequest_claims join = reqs_tbl.outerjoin(claims_tbl, reqs_tbl.c.id == claims_tbl.c.brid) q = sa.select([reqs_tbl.c.id], from_obj=[join], whereclause=claims_tbl.c.claimed_at == None) results = conn.execute(q).fetchall() self.assertEqual(sorted([r.id for r in results]), sorted(expected)) return self.db.pool.do(thd) d.addCallback(check) return d
def insertBuildrequests(self, buildername, priority, xrange, submitted_at=1449578391, results=BEGINNING, complete=0, mergebrid=None, artifactbrid=None, startbrid=None, selected_slave=None, sources=None): self.testdata += [ fakedb.BuildRequest(id=self.lastbrid + idx, buildsetid=self.lastbrid + idx, buildername=buildername, priority=priority, results=results, complete=complete, mergebrid=mergebrid, artifactbrid=artifactbrid, startbrid=startbrid, submitted_at=submitted_at) for idx in xrange ] if results == RESUME: breqsclaim = [ fakedb.BuildRequestClaim(brid=self.lastbrid + idx, objectid=self.MASTER_ID, claimed_at=1449578391) for idx in xrange ] self.testdata += breqsclaim if selected_slave: self.testdata += [ fakedb.BuildsetProperty( buildsetid=self.lastbrid + idx, property_name='selected_slave', property_value='["%s", "Force Build Form"]' % selected_slave) for idx in xrange ] self.testdata += [ fakedb.Buildset(id=self.lastbrid + idx, sourcestampsetid=self.lastbrid + idx) for idx in xrange ] if not sources: self.testdata += [ fakedb.SourceStamp(sourcestampsetid=self.lastbrid + idx, branch='branch_%d' % (self.lastbrid + idx)) for idx in xrange ] else: self.testdata += [ fakedb.SourceStampSet(id=self.lastbrid + idx) for idx in xrange ] for ss in sources: self.testdata += [ fakedb.SourceStamp(sourcestampsetid=self.lastbrid + idx, repository=ss['repository'], codebase=ss['codebase'], branch=ss['branch'], revision=ss['revision']) for idx in xrange ] self.lastbrid += len(xrange)
def test_getBuildRequests_combo(self): d = self.insertTestData([ # 44: everything we want fakedb.BuildRequest(id=44, buildsetid=self.BSID, buildername="bbb", complete=1, results=92, complete_at=self.COMPLETE_AT_EPOCH), fakedb.BuildRequestClaim(brid=44, objectid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 45: different buildername fakedb.BuildRequest(id=45, buildsetid=self.BSID, buildername="ccc", complete=1, complete_at=self.COMPLETE_AT_EPOCH), fakedb.BuildRequestClaim(brid=45, objectid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 46: incomplete fakedb.BuildRequest(id=46, buildsetid=self.BSID, buildername="bbb", complete=0, results=92, complete_at=0), fakedb.BuildRequestClaim(brid=46, objectid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), # 47: unclaimed fakedb.BuildRequest(id=47, buildsetid=self.BSID, buildername="bbb", complete=1, results=92, complete_at=self.COMPLETE_AT_EPOCH), # 48: claimed by other fakedb.BuildRequest(id=48, buildsetid=self.BSID, buildername="bbb", complete=1, results=92, complete_at=self.COMPLETE_AT_EPOCH), fakedb.BuildRequestClaim(brid=48, objectid=self.MASTER_ID + 1100, claimed_at=self.CLAIMED_AT_EPOCH), # 49: different bsid fakedb.Buildset(id=self.BSID + 1, sourcestampid=234), fakedb.BuildRequest(id=49, buildsetid=self.BSID + 1, buildername="bbb", complete=1, results=92, complete_at=self.COMPLETE_AT_EPOCH), fakedb.BuildRequestClaim(brid=49, objectid=self.MASTER_ID, claimed_at=self.CLAIMED_AT_EPOCH), ]) d.addCallback(lambda _: self.db.buildrequests.getBuildRequests( buildername="bbb", claimed="mine", complete=True, bsid=self.BSID)) def check(brlist): self.assertEqual([br['brid'] for br in brlist], [44]) d.addCallback(check) return d
def test_completeBuildRequests(self): return self.do_test_completeBuildRequests([ fakedb.BuildRequest(id=44, buildsetid=self.BSID), fakedb.BuildRequestClaim( brid=44, objectid=self.MASTER_ID, claimed_at=1300103810), ], 1300305712, [(44, 1, 7, 1300305712)])