def setUp(self): self.setup_test_reactor() self.setUpLogging() self.basedir = os.path.abspath('basedir') yield self.setUpDirs(self.basedir) # don't create child services self.patch(master.BuildMaster, 'create_child_services', lambda self: None) # patch out a few other annoying things the master likes to do self.patch(monkeypatches, 'patch_all', lambda: None) self.patch(signal, 'signal', lambda sig, hdlr: None) master.BuildMaster.masterHeartbeatService = mock.Mock() self.master = master.BuildMaster(self.basedir, reactor=self.reactor, config_loader=DefaultLoader()) self.master.sendBuildbotNetUsageData = mock.Mock() self.master.botmaster = FakeBotMaster() self.db = self.master.db = fakedb.FakeDBConnector(self) yield self.db.setServiceParent(self.master) self.mq = self.master.mq = fakemq.FakeMQConnector(self) yield self.mq.setServiceParent(self.master) self.data = self.master.data = fakedata.FakeDataConnector( self.master, self) yield self.data.setServiceParent(self.master)
def setUp(self): self.slaves = {} self.rmtree("basedir") os.mkdir("basedir") self.master = master.BuildMaster("basedir") self.status = self.master.getStatus() self.control = interfaces.IControl(self.master)
def test_configfile_default(self): """ If neither configfile nor config_loader are specified, The default config_loader is a `FileLoader` pointing at `"master.cfg"`. """ m = master.BuildMaster(".", reactor=reactor) self.assertEqual(m.config_loader, FileLoader(".", "master.cfg"))
def make_master(_): # don't create child services self.patch(master.BuildMaster, 'create_child_services', lambda self: None) # patch out a few other annoying things the master likes to do self.patch(monkeypatches, 'patch_all', lambda: None) self.patch(signal, 'signal', lambda sig, hdlr: None) # XXX temporary self.patch(master, 'Status', lambda master: mock.Mock()) master.BuildMaster.masterHeartbeatService = mock.Mock() self.reactor = self.make_reactor() self.master = master.BuildMaster(self.basedir, reactor=self.reactor, config_loader=DefaultLoader()) self.master.sendBuildbotNetUsageData = mock.Mock() self.master.botmaster = FakeBotMaster() self.db = self.master.db = fakedb.FakeDBConnector(self) self.db.setServiceParent(self.master) self.mq = self.master.mq = fakemq.FakeMQConnector(self) self.mq.setServiceParent(self.master) self.data = self.master.data = fakedata.FakeDataConnector( self.master, self) self.data.setServiceParent(self.master)
def test_configfile_configloader_conflict(self): """ If both configfile and config_loader are specified, a configuration error is raised. """ with self.assertRaises(config.ConfigErrors): master.BuildMaster(".", "master.cfg", reactor=reactor, config_loader=DefaultLoader())
def setUp(self): self.master = None self.slave = None self.rmtree("control_basedir") os.mkdir("control_basedir") self.master = master.BuildMaster("control_basedir") self.slavebase = os.path.abspath("control_slavebase") self.rmtree(self.slavebase) os.mkdir("control_slavebase")
def testGetBuilderNames(self): os.mkdir("bnames") m = master.BuildMaster("bnames") s = m.getStatus() m.loadConfig(config_3) m.readConfig = True self.failUnlessEqual(s.getBuilderNames(), ["dummy", "testdummy", "adummy", "bdummy"]) self.failUnlessEqual(s.getBuilderNames(categories=['test']), ["testdummy", "bdummy"])
def loadcfg(_): # Use a temporary directory since loadConfig() creates a bunch of # builder directories self.tempdir = mkdtemp() copy(self.configFileName, self.tempdir) os.chdir(self.tempdir) # Add the original directory to the library path so local module # imports work sys.path.append(self.basedir) bmaster = master.BuildMaster(self.basedir, self.configFileName) return bmaster.loadConfig(open(self.configFileName, "r"), checkOnly=True)
def set_master(_): self.master = master.BuildMaster(basedir) self.db = self.master.db = fakedb.FakeDBConnector(self) self.master.db_poll_interval = 10 # overridesubscription callbacks self.master._change_subs = sub = mock.Mock() sub.deliver = self.deliverChange self.master._new_buildset_subs = sub = mock.Mock() sub.deliver = self.deliverBuildsetAddition self.master._complete_buildset_subs = sub = mock.Mock() sub.deliver = self.deliverBuildsetCompletion
def make_master(_): # don't create child services self.patch(master.BuildMaster, 'create_child_services', lambda self : None) # patch out a few other annoying things the msater likes to do self.patch(monkeypatches, 'patch_all', lambda : None) self.patch(signal, 'signal', lambda sig, hdlr : None) self.patch(master, 'Status', lambda master : mock.Mock()) # XXX temporary self.patch(config.MasterConfig, 'loadConfig', classmethod(lambda cls, b, f : cls())) self.master = master.BuildMaster(self.basedir) self.db = self.master.db = fakedb.FakeDBConnector(self)
def startMaster(self, sch, startWorker=False): BuildmasterConfig['schedulers'] = [sch] self.sch = sch BuildmasterConfig['status'] = [] # create the master and set its config m = self.master = master.BuildMaster(self.basedir, self.configfile) m.config = config.MasterConfig.loadConfig(self.basedir, self.configfile) # set up the db yield m.db.setup(check_version=False) yield m.db.model.create() # stub out m.db.setup since it was already called above m.db.setup = lambda: None # mock reactor.stop (which trial *really* doesn't # like test code to call!) mock_reactor = mock.Mock(spec=reactor) mock_reactor.callWhenRunning = reactor.callWhenRunning mock_reactor.getThreadPool = reactor.getThreadPool mock_reactor.callFromThread = reactor.callFromThread # start the service yield m.startService(_reactor=mock_reactor) self.failIf(mock_reactor.stop.called, "startService tried to stop the reactor; check logs") # wait until the scheduler is active yield waitFor(lambda: self.sch.active) # and, for Try_Userpass, until it's registered its port if isinstance(self.sch, trysched.Try_Userpass): def getSchedulerPort(): if not self.sch.registrations: return self.serverPort = self.sch.registrations[0].getPort() log.msg("Scheduler registered at port %d" % self.serverPort) return True yield waitFor(getSchedulerPort) # now start the fake worker if startWorker: self.worker = FakeRemoteWorker(self.serverPort) yield self.worker.start()
def testSender(self): basedir = "changes/Sender/sender" if not os.path.exists(basedir): os.makedirs(basedir) spec = dbspec.DBSpec("sqlite3", os.path.join(basedir, "state.sqlite")) sm = schema.DBSchemaManager(spec, basedir) sm.upgrade() self.master = master.BuildMaster(basedir, db_spec=spec) self.master.readConfig = True self.master.startService() d = self.master.loadConfig(config_sender) d.addCallback(self._testSender_1) return d
def testMaster(self): self.rmtree("basedir") os.mkdir("basedir") m = master.BuildMaster("basedir") m.loadConfig(config_run) m.readConfig = True m.startService() cm = m.change_svc c = changes.Change("bob", ["Makefile", "foo/bar.c"], "changed stuff") cm.addChange(c) # verify that the Scheduler is now waiting s = m.allSchedulers()[0] self.failUnless(s.timer) # halting the service will also stop the timer d = defer.maybeDeferred(m.stopService) return d
def startMaster(self, sch, startSlave=False, wantPBListener=False): BuildmasterConfig['schedulers'] = [sch] self.sch = sch if wantPBListener: self.pblistener = client.PBListener(0) BuildmasterConfig['status'] = [self.pblistener] else: BuildmasterConfig['status'] = [] # create the master and set its config m = self.master = master.BuildMaster(self.basedir, self.configfile) m.config = config.MasterConfig.loadConfig( self.basedir, self.configfile) # set up the db yield m.db.setup(check_version=False) yield m.db.model.create() # stub out m.db.setup since it was already called above m.db.setup = lambda: None # mock reactor.stop (which trial *really* doesn't # like test code to call!) mock_reactor = mock.Mock(spec=reactor) mock_reactor.callWhenRunning = reactor.callWhenRunning # start the service yield m.startService(_reactor=mock_reactor) self.failIf(mock_reactor.stop.called, "startService tried to stop the reactor; check logs") # hang out until the scheduler has registered its PB port if isinstance(self.sch, trysched.Try_Userpass): def getSchedulerPort(): if not self.sch.registrations: return self.serverPort = self.sch.registrations[0].getPort() log.msg("Scheduler registered at port %d" % self.serverPort) return True yield waitFor(getSchedulerPort) # now start the fake slave if startSlave: self.slave = FakeRemoteSlave(self.serverPort) yield self.slave.start()
def loadcfg(_): # Use a temporary directory since loadConfig() creates a bunch of # directories and compiles .py files self.tempdir = mkdtemp() copy(self.configFileName, self.tempdir) for entry in os.listdir("."): # Any code in a subdirectory will _not_ be copied! This is a bug if isfile(entry) and not entry.startswith("twistd.log"): copy(entry, self.tempdir) os.chdir(self.tempdir) # Add the temp directory to the library path so local modules work sys.path.append(self.tempdir) bmaster = master.BuildMaster(self.basedir, self.configFileName) return bmaster.loadConfig(open(self.configFileName, "r"), checkOnly=True)
def setUp(self): self.patch(master.BuildMaster, 'create_child_services', lambda self: None) self.master = master.BuildMaster(basedir=None) self.master.data = fakedata.FakeDataConnector(self.master, self) self.master.db = fakedb.FakeDBConnector(self.master, self) self.master.db.insertTestData([ fakedb.Change(changeid=1, author='this is a test'), ]) self.fake_Change = mock.Mock(name='fake_Change') def fromChdict(master, chdict): if chdict['author'] != 'this is a test': raise AssertionError("did not get expected chdict") return defer.succeed(self.fake_Change) self.patch(Change, 'fromChdict', staticmethod(fromChdict))
def create_master(self, **kwargs): assert not self.master, "you called create_master twice" # probably because you subclassed RunMixin instead of MasterMixin self.slaves = {} if self.basedir is None: self.basedir = self.mktemp() basedir = self.basedir os.makedirs(basedir) self.master = master.BuildMaster(basedir, **kwargs) spec = dbspec.DBSpec.from_url("sqlite:///state.sqlite", basedir=basedir) sm = schema.DBSchemaManager(spec, basedir) sm.upgrade(quiet=True) self.master.loadDatabase(spec) self.master.readConfig = True self.master.startService() self.status = self.master.getStatus() self.control = interfaces.IControl(self.master)
def set_master(_): self.master = master.BuildMaster(basedir) self.master.db_poll_interval = None
def loadcfg(_): sys.path.append(self.basedir) bmaster = master.BuildMaster(self.basedir, self.configFileName) return bmaster.loadConfig(open(self.configFileName, "r"), checkOnly=True)
def set_master(_): self.master = master.BuildMaster(basedir) self.master.config.db['db_poll_interval'] = None
def setUp(self): self.master = master.BuildMaster(".")