def setup_multi_builders(self): # Make first builder configured, but not connected # Make second builder configured and connected self.master.db.insertTestData([ fakedb.Worker(id=1, name=u'linux', info={}), # connected one fakedb.Worker(id=2, name=u'linux', info={}), # disconnected one fakedb.BuilderMaster(id=4012, masterid=13, builderid=self.BUILDER_IDS[0]), fakedb.BuilderMaster(id=4013, masterid=13, builderid=self.BUILDER_IDS[1]), fakedb.ConfiguredWorker(id=14013, workerid=2, buildermasterid=4012), fakedb.ConfiguredWorker(id=14013, workerid=1, buildermasterid=4013), ])
def setUp(self): self.setUpEndpoint() self.db.insertTestData([ fakedb.Builder(id=77, name='builder77'), fakedb.Builder(id=78, name='builder78'), fakedb.Master(id=88), fakedb.Worker(id=13, name='wrk'), fakedb.Buildset(id=8822), fakedb.BuildRequest(id=82, buildsetid=8822), fakedb.Build(id=13, builderid=77, masterid=88, workerid=13, buildrequestid=82, number=3), fakedb.Build(id=14, builderid=77, masterid=88, workerid=13, buildrequestid=82, number=4), fakedb.Build(id=15, builderid=78, masterid=88, workerid=12, buildrequestid=83, number=5, complete_at=1), ])
def test_attached_workerInfoUpdates(self): # put in stale info: self.master.db.insertTestData([ fakedb.Worker(name='bot', info={ 'admin': 'WrongAdmin', 'host': 'WrongHost', 'access_uri': 'WrongURI', 'version': 'WrongVersion' }) ]) worker = yield self.createWorker() yield worker.startService() conn = fakeprotocol.FakeConnection(worker.master, worker) conn.info = { 'admin': 'TheAdmin', 'host': 'TheHost', 'access_uri': 'TheURI', 'version': 'TheVersion', } yield worker.attached(conn) self.assertEqual(worker.worker_status.getAdmin(), 'TheAdmin') self.assertEqual(worker.worker_status.getHost(), 'TheHost') self.assertEqual(worker.worker_status.getAccessURI(), 'TheURI') self.assertEqual(worker.worker_status.getVersion(), 'TheVersion') # and the db is updated too: db_worker = yield self.master.db.workers.getWorker(name="bot") self.assertEqual(db_worker['workerinfo']['admin'], 'TheAdmin') self.assertEqual(db_worker['workerinfo']['host'], 'TheHost') self.assertEqual(db_worker['workerinfo']['access_uri'], 'TheURI') self.assertEqual(db_worker['workerinfo']['version'], 'TheVersion')
def test_getWorker_multiple_connections(self): yield self.insertTestData(self.baseRows + [ # the worker is connected to two masters at once. # weird, but the DB should represent it. fakedb.Worker(id=32, name='two'), fakedb.ConnectedWorker(workerid=32, masterid=10), fakedb.ConnectedWorker(workerid=32, masterid=11), fakedb.BuilderMaster(id=24, builderid=20, masterid=10), fakedb.BuilderMaster(id=25, builderid=20, masterid=11), fakedb.ConfiguredWorker(workerid=32, buildermasterid=24), fakedb.ConfiguredWorker(workerid=32, buildermasterid=25), ]) workerdict = yield self.db.workers.getWorker(workerid=32) validation.verifyDbDict(self, 'workerdict', workerdict) self.assertEqual( workerdict, dict(id=32, name='two', workerinfo={'a': 'b'}, connected_to=[10, 11], configured_on=[ { 'builderid': 20, 'masterid': 10 }, { 'builderid': 20, 'masterid': 11 }, ]))
def test_getSourceStampsForBuild_OneCodeBase(self): rows = [fakedb.Master(id=88, name="bar"), fakedb.Worker(id=13, name='one'), fakedb.Builder(id=77, name='A'), fakedb.SourceStamp(id=234, codebase='A', created_at=CREATED_AT, revision="aaa"), # 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, builderid=77, priority=13, submitted_at=1300305712, results=-1), fakedb.Build(id=50, buildrequestid=19, number=5, masterid=88, builderid=77, state_string="test", workerid=13, started_at=1304262222), ] expected = [{ 'branch': u'master', 'codebase': u'A', 'created_at': epoch2datetime(CREATED_AT), 'patch_author': None, 'patch_body': None, 'patch_comment': None, 'patch_level': None, 'patch_subdir': None, 'patchid': None, 'project': u'proj', 'repository': u'repo', 'revision': u'aaa', 'ssid': 234}] return self.do_test_getSourceStampsForBuild(rows, 50, expected)
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) ])
def setUp(self): self.setUpEndpoint() self.db.insertTestData([ fakedb.Builder(id=77), fakedb.Master(id=88), fakedb.Worker(id=13, name='sl'), fakedb.Buildset(id=8822), fakedb.BuildRequest(id=82, buildsetid=8822), fakedb.Build(id=13, builderid=77, masterid=88, workerid=13, buildrequestid=82, number=3), fakedb.Step(id=50, buildid=13, number=5, name='make'), fakedb.Log(id=60, stepid=50, name=u'stdio', slug=u'stdio', type='s'), fakedb.Log(id=61, stepid=50, name=u'errors', slug=u'errors', type='t'), ])
def setupDb(self, results1, results2): self.db = self.master.db self.db.insertTestData([ fakedb.Master(id=92), fakedb.Worker(id=13, name='wrkr'), fakedb.Buildset(id=98, results=results1, reason="testReason1"), fakedb.Buildset(id=99, results=results2, reason="testReason2"), fakedb.Builder(id=80, name='Builder1'), fakedb.BuildRequest(id=11, buildsetid=98, builderid=80), fakedb.BuildRequest(id=12, buildsetid=99, builderid=80), fakedb.Build(id=20, number=0, builderid=80, buildrequestid=11, workerid=13, masterid=92, results=results1), fakedb.Build(id=21, number=1, builderid=80, buildrequestid=12, workerid=13, masterid=92, results=results1), ]) for _id in (20, 21): self.db.insertTestData([ fakedb.BuildProperty(buildid=_id, name="workername", value="wrkr"), fakedb.BuildProperty(buildid=_id, name="reason", value="because"), ])
def setUp(self): self.setUpEndpoint() self.db.insertTestData([ fakedb.Builder(id=77), fakedb.Master(id=88), fakedb.Worker(id=13, name='sl'), fakedb.Buildset(id=8822), fakedb.BuildRequest(id=82, buildsetid=8822, builderid=77), fakedb.Build(id=13, builderid=77, masterid=88, workerid=13, buildrequestid=82, number=3), fakedb.Build(id=14, builderid=77, masterid=88, workerid=13, buildrequestid=82, number=4), fakedb.Build(id=15, builderid=77, masterid=88, workerid=13, buildrequestid=82, number=5), ])
def setupStep(self, step, sourcestampsInBuild=None, gotRevisionsInBuild=None, *args, **kwargs): sourcestamps = sourcestampsInBuild or [] got_revisions = gotRevisionsInBuild or {} steps.BuildStepMixin.setupStep(self, step, *args, **kwargs) # This step reaches deeply into a number of parts of Buildbot. That # should be fixed! # set up a buildmaster that knows about two fake schedulers, a and b m = self.master m.db.checkForeignKeys = True self.build.builder.botmaster = m.botmaster m.status = master.Status() m.status.setServiceParent(m) m.config.buildbotURL = "baseurl/" m.scheduler_manager = FakeSchedulerManager() self.scheduler_a = a = FakeTriggerable(name='a') self.scheduler_b = b = FakeTriggerable(name='b') m.scheduler_manager.namedServices = dict(a=a, b=b) a.brids = {77: 11} b.brids = {78: 22} make_fake_br = lambda brid, builderid: fakedb.BuildRequest( id=brid, buildsetid=BRID_TO_BSID(brid), builderid=builderid) make_fake_build = lambda brid: fakedb.Build( buildrequestid=brid, id=BRID_TO_BID(brid), number=BRID_TO_BUILD_NUMBER(brid), masterid=9, workerid=13) m.db.insertTestData([ fakedb.Builder(id=77, name='A'), fakedb.Builder(id=78, name='B'), fakedb.Master(id=9), fakedb.Buildset(id=2022), fakedb.Buildset(id=2011), fakedb.Worker(id=13, name="some:worker"), make_fake_br(11, 77), make_fake_br(22, 78), make_fake_build(11), make_fake_build(22), ]) def getAllSourceStamps(): return sourcestamps self.build.getAllSourceStamps = getAllSourceStamps def getAllGotRevisions(): return got_revisions self.step.getAllGotRevisions = getAllGotRevisions self.exp_add_sourcestamp = None self.exp_a_trigger = None self.exp_b_trigger = None self.exp_added_urls = []
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.insertTestData([ fakedb.Master(id=92), fakedb.Worker(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, workerid=13), fakedb.BuildRequest(id=11, buildsetid=99, builderid=81), fakedb.Build(number=0, buildrequestid=11, masterid=92, workerid=13), fakedb.BuildRequest(id=12, buildsetid=99, builderid=82), fakedb.Build(number=0, buildrequestid=12, masterid=92, workerid=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 test_command_list_workers(self): workers = ['worker1', 'worker2'] for worker in workers: self.master.db.workers.db.insertTestData( [fakedb.Worker(name=worker)]) yield self.do_test_command('list', args='all workers') self.assertEqual(len(self.sent), 1) for worker in workers: self.assertIn('`%s` ❌' % worker, self.sent[0][1])
def setUp(self): self.setUpEndpoint() self.db.insertTestData([ fakedb.Builder(id=77, name='bbb'), fakedb.Master(id=fakedb.FakeBuildRequestsComponent.MASTER_ID), fakedb.Worker(id=13, name='sl'), fakedb.Buildset(id=8822), fakedb.BuildRequest(id=44, buildsetid=8822, builderid=77, priority=7, submitted_at=self.SUBMITTED_AT_EPOCH, waited_for=1), ])
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_getWorker_connected_not_configured(self): yield self.insertTestData(self.baseRows + [ # the worker is connected to this master, but not configured. # weird, but the DB should represent it. fakedb.Worker(id=32, name='two'), fakedb.ConnectedWorker(workerid=32, masterid=11), ]) workerdict = yield self.db.workers.getWorker(workerid=32) validation.verifyDbDict(self, 'workerdict', workerdict) self.assertEqual(workerdict, dict(id=32, name='two', workerinfo={'a': 'b'}, connected_to=[11], configured_on=[]))
def setupDb(self): self.db = self.master.db self.db.insertTestData([ fakedb.Master(id=92), fakedb.Worker(id=13, name='wrk'), fakedb.Buildset(id=98, results=SUCCESS, reason="testReason1"), fakedb.Builder(id=80, name='Builder1'), fakedb.BuildRequest(id=9, buildsetid=97, builderid=80), fakedb.BuildRequest(id=10, buildsetid=97, builderid=80), fakedb.BuildRequest(id=11, buildsetid=98, builderid=80), fakedb.BuildRequest(id=12, buildsetid=98, builderid=80), fakedb.Build(id=18, number=0, builderid=80, buildrequestid=9, workerid=13, masterid=92, results=FAILURE), fakedb.Build(id=19, number=1, builderid=80, buildrequestid=10, workerid=13, masterid=92, results=RETRY), fakedb.Build(id=20, number=2, builderid=80, buildrequestid=11, workerid=13, masterid=92, results=SUCCESS), fakedb.Build(id=21, number=3, builderid=80, buildrequestid=12, workerid=13, masterid=92, results=SUCCESS), fakedb.BuildsetSourceStamp(buildsetid=98, sourcestampid=234), fakedb.SourceStamp(id=234), fakedb.Change(changeid=13, branch=u'trunk', revision=u'9283', author='me@foo', repository=u'svn://...', codebase=u'cbsvn', project=u'world-domination', sourcestampid=234), fakedb.Patch(id=99, patch_base64='aGVsbG8sIHdvcmxk', patch_author='him@foo', patch_comment='foo', subdir='/foo', patchlevel=3), fakedb.SourceStamp(id=235, patchid=99), ]) for _id in (20, 21): self.db.insertTestData([ fakedb.BuildProperty( buildid=_id, name="workername", value="wrk"), fakedb.BuildProperty( buildid=_id, name="reason", value="because"), fakedb.BuildProperty( buildid=_id, name="owner", value="him"), fakedb.Step(id=100 + _id, buildid=_id, name="step1"), fakedb.Step(id=200 + _id, buildid=_id, name="step2"), fakedb.Log(id=60 + _id, stepid=100 + _id, name='stdio', slug='stdio', type='s', num_lines=2), fakedb.LogChunk(logid=60 + _id, first_line=0, last_line=1, compressed=0, content=self.LOGCONTENT), ]) @defer.inlineCallbacks def getChangesForBuild(buildid): assert buildid == 20 ch = yield self.master.db.changes.getChange(13) defer.returnValue([ch]) self.master.db.changes.getChangesForBuild = getChangesForBuild
def setupBuildResults(self, results, wantPreviousBuild=False): # this testsuite always goes through setupBuildResults so that # the data is sure to be the real data schema known coming from data # api self.db = self.master.db self.db.insertTestData([ fakedb.Master(id=92), fakedb.Worker(id=13, name='wrk'), fakedb.Buildset(id=98, results=results, reason="testReason1"), fakedb.Builder(id=80, name='Builder1'), fakedb.BuildRequest(id=11, buildsetid=98, builderid=80), fakedb.Build(id=20, number=0, builderid=80, buildrequestid=11, workerid=13, masterid=92, results=results), fakedb.Step(id=50, buildid=20, number=5, name='make'), fakedb.BuildsetSourceStamp(buildsetid=98, sourcestampid=234), fakedb.SourceStamp(id=234, patchid=99), fakedb.Change(changeid=13, branch=u'trunk', revision=u'9283', author='me@foo', repository=u'svn://...', codebase=u'cbsvn', project=u'world-domination', sourcestampid=234), fakedb.Log(id=60, stepid=50, name='stdio', slug='stdio', type='s', num_lines=7), fakedb.LogChunk(logid=60, first_line=0, last_line=1, compressed=0, content=u'Unicode log with non-ascii (\u00E5\u00E4\u00F6).'), fakedb.Patch(id=99, patch_base64='aGVsbG8sIHdvcmxk', patch_author='him@foo', patch_comment='foo', subdir='/foo', patchlevel=3), ]) for _id in (20,): self.db.insertTestData([ fakedb.BuildProperty( buildid=_id, name="workername", value="wrk"), fakedb.BuildProperty( buildid=_id, name="reason", value="because"), fakedb.BuildProperty( buildid=_id, name="scheduler", value="checkin"), fakedb.BuildProperty( buildid=_id, name="branch", value="master"), ]) res = yield utils.getDetailsForBuildset(self.master, 98, wantProperties=True, wantPreviousBuild=wantPreviousBuild) builds = res['builds'] buildset = res['buildset'] @defer.inlineCallbacks def getChangesForBuild(buildid): assert buildid == 20 ch = yield self.master.db.changes.getChange(13) defer.returnValue([ch]) self.master.db.changes.getChangesForBuild = getChangesForBuild defer.returnValue((buildset, builds))
def setUp(self): self.setUpEndpoint() self.db.insertTestData([ fakedb.Builder(id=77, name='bbb'), fakedb.Master(id=fakedb.FakeBuildRequestsComponent.MASTER_ID), fakedb.Worker(id=13, name='wrk'), fakedb.Buildset(id=8822), fakedb.BuildRequest(id=44, buildsetid=8822, builderid=77, priority=7, submitted_at=self.SUBMITTED_AT_EPOCH, waited_for=1), fakedb.BuildsetProperty(buildsetid=8822, property_name='prop1', property_value='["one", "fake1"]'), fakedb.BuildsetProperty(buildsetid=8822, property_name='prop2', property_value='["two", "fake2"]'), ])
def setupBuildResults(self, buildResults, finalResult): # this testsuite always goes through setupBuildResults so that # the data is sure to be the real data schema known coming from data api 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), fakedb.Change(changeid=13, branch=u'master', revision=u'9283', author='me@foo', repository=u'https://...', codebase=u'cbgerrit', project=u'world-domination', sourcestampid=234), ]) i = 0 for results in 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) ]) i += 1 res = yield utils.getDetailsForBuildset(self.master, 98, wantProperties=True) builds = res['builds'] buildset = res['buildset'] @defer.inlineCallbacks def getChangesForBuild(buildid): assert buildid == 20 ch = yield self.master.db.changes.getChange(13) defer.returnValue([ch]) self.master.db.changes.getChangesForBuild = getChangesForBuild defer.returnValue((buildset, builds))
def setUp(self): self.setUpEndpoint() self.db.insertTestData([ fakedb.Buildset(id=28), fakedb.BuildRequest(id=5, buildsetid=28), fakedb.Master(id=3), fakedb.Worker(id=42, name="Friday"), fakedb.Build(id=786, buildrequestid=5, masterid=3, workerid=42), fakedb.BuildProperty(buildid=786, name="year", value=1651, source="Wikipedia"), fakedb.BuildProperty(buildid=786, name="island_name", value="despair", source="Book"), ])
def setUp(self): self.setUpEndpoint() self.db.insertTestData([ fakedb.Worker(id=47, name='linux'), fakedb.Builder(id=77), fakedb.Master(id=88), fakedb.Buildset(id=8822), fakedb.BuildRequest(id=82, buildsetid=8822), fakedb.Build(id=30, builderid=77, number=7, masterid=88, buildrequestid=82, workerid=47), fakedb.Build(id=31, builderid=77, number=8, masterid=88, buildrequestid=82, workerid=47), fakedb.Step(id=70, number=0, name='one', buildid=30, started_at=TIME1, complete_at=TIME2, results=0), fakedb.Step(id=71, number=1, name='two', buildid=30, started_at=TIME2, complete_at=TIME3, results=2, urls_json='[{"name":"url","url":"http://url"}]'), fakedb.Step(id=72, number=2, name='three', buildid=30, started_at=TIME3), fakedb.Step(id=73, number=0, name='otherbuild', buildid=31, started_at=TIME2), ])
def testRebuildBuildrequest(self): self.master.db.insertTestData([ fakedb.Builder(id=77, name='builder'), fakedb.Master(id=88), fakedb.Worker(id=13, name='wrk'), fakedb.Buildset(id=8822), fakedb.SourceStamp(id=234), fakedb.BuildsetSourceStamp(buildsetid=8822, sourcestampid=234), fakedb.BuildRequest(id=82, buildsetid=8822, builderid=77), fakedb.BuildsetProperty(buildsetid=8822, property_name='prop1', property_value='["one", "fake1"]'), fakedb.BuildsetProperty(buildsetid=8822, property_name='prop2', property_value='["two", "fake2"]'), ]) buildrequest = yield self.master.data.get(('buildrequests', 82)) new_bsid, brid_dict = yield self.rtype.rebuildBuildrequest(buildrequest) self.assertEqual(list(brid_dict.keys()), [77]) buildrequest = yield self.master.data.get(('buildrequests', brid_dict[77])) # submitted_at is the time of the test, so better not depend on it self.assertTrue(buildrequest['submitted_at'] is not None) buildrequest['submitted_at'] = None self.assertEqual(buildrequest, {'buildrequestid': 1001, 'complete': False, 'waited_for': False, 'claimed_at': None, 'results': -1, 'claimed': False, 'buildsetid': 200, 'complete_at': None, 'submitted_at': None, 'builderid': 77, 'claimed_by_masterid': None, 'priority': 0, 'properties': None}) buildset = yield self.master.data.get(('buildsets', new_bsid)) oldbuildset = yield self.master.data.get(('buildsets', 8822)) # assert same sourcestamp self.assertEqual(buildset['sourcestamps'], oldbuildset['sourcestamps']) buildset['sourcestamps'] = None self.assertTrue(buildset['submitted_at'] is not None) buildset['submitted_at'] = None self.assertEqual(buildset, {'bsid': 200, 'complete_at': None, 'submitted_at': None, 'sourcestamps': None, 'parent_buildid': None, 'results': -1, 'parent_relationship': None, 'reason': u'rebuild', 'external_idstring': u'extid', 'complete': False}) properties = yield self.master.data.get(('buildsets', new_bsid, 'properties')) self.assertEqual( properties, {u'prop1': (u'one', u'fake1'), u'prop2': (u'two', u'fake2')})
def test_getBuildsForChange_OneCodebase(self): rows = [ fakedb.Master(id=88, name="bar"), fakedb.Worker(id=13, name='one'), fakedb.Builder(id=77, name='A'), fakedb.SourceStamp(id=234, created_at=CREATED_AT, revision="aaa"), 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, builderid=77, priority=13, submitted_at=1300305712, results=1, complete=0, complete_at=None), fakedb.Build(id=50, buildrequestid=19, number=5, masterid=88, builderid=77, state_string="test", workerid=13, started_at=1304262222, results=1), ] expected = [{ 'id': 50, 'number': 5, 'builderid': 77, 'buildrequestid': 19, 'workerid': 13, 'masterid': 88, 'started_at': epoch2datetime(1304262222), 'complete_at': None, 'state_string': 'test', 'results': 1 }] return self.do_test_getBuildsForChange(rows, 14, expected)
def setUp(self): self.setUpEndpoint() self.db.insertTestData([ fakedb.Builder(id=77), fakedb.Master(id=88), fakedb.Worker(id=13, name='wrk'), fakedb.Buildset(id=8822), fakedb.BuildRequest(id=82, buildsetid=8822), fakedb.Build(id=13, builderid=77, masterid=88, workerid=13, buildrequestid=82, number=3), fakedb.Step(id=50, buildid=13, number=9, name='make'), fakedb.Log(id=60, stepid=50, name='stdio', type='s'), fakedb.Log(id=61, stepid=50, name='errors', type='t'), fakedb.Step(id=51, buildid=13, number=10, name='make_install'), fakedb.Log(id=70, stepid=51, name='stdio', type='s'), fakedb.Log(id=71, stepid=51, name='results_html', type='h'), fakedb.Step(id=52, buildid=13, number=11, name='nothing'), ])
def test_startService_getWorkerInfo_fromDb(self): self.master.db.insertTestData([ fakedb.Worker(id=9292, name='bot', info={ 'admin': 'TheAdmin', 'host': 'TheHost', 'access_uri': 'TheURI', 'version': 'TheVersion' }) ]) worker = self.createWorker() yield worker.startService() self.assertEqual(worker.workerid, 9292) self.assertEqual(worker.worker_status.getAdmin(), 'TheAdmin') self.assertEqual(worker.worker_status.getHost(), 'TheHost') self.assertEqual(worker.worker_status.getAccessURI(), 'TheURI') self.assertEqual(worker.worker_status.getVersion(), 'TheVersion')
def test_workerConfiguredMany(self): manyWorkers = [ fakedb.BuilderMaster(id=1000, builderid=20, masterid=10), ] + [ fakedb.Worker(id=50 + n, name='zero' + str(n)) for n in range(1000) ] + [ fakedb.ConfiguredWorker( id=n + 3000, workerid=50 + n, buildermasterid=1000) for n in range(1000) ] yield self.insertTestData(self.baseRows + manyWorkers) # should succesfully remove all ConfiguredWorker rows with self.assertNoMaxVariables(): yield self.db.workers.deconfigureAllWorkersForMaster(masterid=10) w = yield self.db.workers.getWorker(30) self.assertEqual(sorted(w['configured_on']), [])
def test_setBuildProperties(self): self.master.db.insertTestData([ fakedb.Buildset(id=28), fakedb.BuildRequest(id=5, buildsetid=28), fakedb.Master(id=3), fakedb.Worker(id=42, name="Friday"), fakedb.Build(id=1234, buildrequestid=5, masterid=3, workerid=42), ]) self.master.db.builds.setBuildProperty = mock.Mock( wraps=self.master.db.builds.setBuildProperty) props = processProperties.fromDict( dict(a=(1, 't'), b=(['abc', 9], 't'))) yield self.rtype.setBuildProperties(1234, props) setBuildPropertiesCalls = sorted( self.master.db.builds.setBuildProperty.mock_calls) self.assertEqual(setBuildPropertiesCalls, [ mock.call(1234, 'a', 1, 't'), mock.call(1234, 'b', ['abc', 9], 't') ]) self.master.mq.assertProductions([ (('builds', '1234', 'properties', 'update'), { 'a': (1, 't'), 'b': (['abc', 9], 't') }), ]) # sync without changes: no db write self.master.db.builds.setBuildProperty.reset_mock() self.master.mq.clearProductions() yield self.rtype.setBuildProperties(1234, props) self.master.db.builds.setBuildProperty.assert_not_called() self.master.mq.assertProductions([]) # sync with one changes: one db write props.setProperty('b', 2, 'step') self.master.db.builds.setBuildProperty.reset_mock() yield self.rtype.setBuildProperties(1234, props) self.master.db.builds.setBuildProperty.assert_called_with( 1234, 'b', 2, 'step') self.master.mq.assertProductions([(('builds', '1234', 'properties', 'update'), { 'b': (2, 'step') })])
def setupDb(self, results1, results2): # License note: # Copied from the original buildbot implementation with # minor changes and additions. self.db = self.master.db self.db.insertTestData([ fakedb.Master(id=92), fakedb.Worker(id=13, name='wrkr'), fakedb.Buildset(id=98, results=results1, reason='testReason1'), fakedb.Buildset(id=99, results=results2, reason='testReason2'), fakedb.Builder(id=80, name='Builder1'), fakedb.BuildRequest(id=11, buildsetid=98, builderid=80), fakedb.BuildRequest(id=12, buildsetid=99, builderid=80), fakedb.Build(id=20, number=0, builderid=80, buildrequestid=11, workerid=13, masterid=92, results=results1), fakedb.Build(id=21, number=1, builderid=80, buildrequestid=12, workerid=13, masterid=92, results=results1), ]) for _id in (20, 21): self.db.insertTestData([ fakedb.BuildProperty(buildid=_id, name='buildername', value='Builder1'), fakedb.BuildProperty(buildid=_id, name='workername', value='wrkr'), fakedb.BuildProperty(buildid=_id, name='revision', value=self.REVISION), fakedb.BuildProperty(buildid=_id, name='reason', value='because') ])
def setUp(self): self.setUpEndpoint() self.db.insertTestData([ fakedb.Builder(id=77), fakedb.Worker(id=13, name='sl'), fakedb.Master(id=88), fakedb.Buildset(id=8822), fakedb.BuildRequest(id=82, buildsetid=8822), fakedb.Build(id=13, builderid=77, masterid=88, workerid=13, buildrequestid=82, number=3), fakedb.Step(id=50, buildid=13, number=9, name='make'), fakedb.Log(id=60, stepid=50, name='stdio', slug='stdio', type='s', num_lines=7), fakedb.LogChunk(logid=60, first_line=0, last_line=1, compressed=0, content=textwrap.dedent("""\ line zero line 1""")), fakedb.LogChunk(logid=60, first_line=2, last_line=4, compressed=0, content=textwrap.dedent("""\ line TWO line 3 line 2**2""")), fakedb.LogChunk(logid=60, first_line=5, last_line=5, compressed=0, content="another line"), fakedb.LogChunk(logid=60, first_line=6, last_line=6, compressed=0, content="yet another line"), fakedb.Log(id=61, stepid=50, name='errors', slug='errors', type='t', num_lines=100), ] + [ fakedb.LogChunk(logid=61, first_line=i, last_line=i, compressed=0, content="%08d" % i) for i in range(100) ] + [ fakedb.Log(id=62, stepid=50, name='notes', slug='notes', type='t', num_lines=0), # logid 62 is empty ])
def testMissingWorker(self): yield self.insertTestData([fakedb.Worker(id=1, name='local1')]) tb = self.master.config.services['TelegramBot'] channel = tb.bot.getChannel(-123456) self.assertEquals(channel.notify_events, {'worker'}) yield self.master.data.updates.workerMissing( workerid=1, masterid=self.master.masterid, last_connection='long time ago', notify=['*****@*****.**'], ) self.assertEquals( self.sent_messages[0][1], "Worker `local1` is missing. It was seen last on long time ago.") yield self.master.data.updates.workerConnected( workerid=1, masterid=self.master.masterid, workerinfo={}, ) self.assertEquals(self.sent_messages[1][1], "Worker `local1` is back online.")