| Index: third_party/buildbot_7_12/buildbot/test/test_config.py
|
| diff --git a/third_party/buildbot_7_12/buildbot/test/test_config.py b/third_party/buildbot_7_12/buildbot/test/test_config.py
|
| deleted file mode 100644
|
| index 60cfa218629a1a6c2527ffa80142c84f39246522..0000000000000000000000000000000000000000
|
| --- a/third_party/buildbot_7_12/buildbot/test/test_config.py
|
| +++ /dev/null
|
| @@ -1,1367 +0,0 @@
|
| -# -*- test-case-name: buildbot.test.test_config -*-
|
| -
|
| -import os, warnings, exceptions
|
| -
|
| -from twisted.trial import unittest
|
| -from twisted.python import failure
|
| -from twisted.internet import defer
|
| -
|
| -from buildbot.master import BuildMaster
|
| -from buildbot import scheduler
|
| -from twisted.application import service, internet
|
| -from twisted.spread import pb
|
| -from twisted.web.server import Site
|
| -from twisted.web.distrib import ResourcePublisher
|
| -from buildbot.process.builder import Builder
|
| -from buildbot.process.factory import BasicBuildFactory, ArgumentsInTheWrongPlace
|
| -from buildbot.changes.pb import PBChangeSource
|
| -from buildbot.changes.mail import SyncmailMaildirSource
|
| -from buildbot.steps.source import CVS, Darcs
|
| -from buildbot.steps.shell import Compile, Test, ShellCommand
|
| -from buildbot.status import base
|
| -from buildbot.steps import dummy, maxq, python, python_twisted, shell, \
|
| - source, transfer
|
| -words = None
|
| -try:
|
| - from buildbot.status import words
|
| -except ImportError:
|
| - pass
|
| -
|
| -emptyCfg = \
|
| -"""
|
| -from buildbot.buildslave import BuildSlave
|
| -BuildmasterConfig = c = {}
|
| -c['slaves'] = []
|
| -c['schedulers'] = []
|
| -c['builders'] = []
|
| -c['slavePortnum'] = 9999
|
| -c['projectName'] = 'dummy project'
|
| -c['projectURL'] = 'http://dummy.example.com'
|
| -c['buildbotURL'] = 'http://dummy.example.com/buildbot'
|
| -"""
|
| -
|
| -buildersCfg = \
|
| -"""
|
| -from buildbot.process.factory import BasicBuildFactory
|
| -from buildbot.buildslave import BuildSlave
|
| -BuildmasterConfig = c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -c['schedulers'] = []
|
| -c['slavePortnum'] = 9999
|
| -f1 = BasicBuildFactory('cvsroot', 'cvsmodule')
|
| -c['builders'] = [{'name':'builder1', 'slavename':'bot1',
|
| - 'builddir':'workdir', 'factory':f1}]
|
| -"""
|
| -
|
| -buildersCfg2 = buildersCfg + \
|
| -"""
|
| -f1 = BasicBuildFactory('cvsroot', 'cvsmodule2')
|
| -c['builders'] = [{'name':'builder1', 'slavename':'bot1',
|
| - 'builddir':'workdir', 'factory':f1}]
|
| -"""
|
| -
|
| -buildersCfg3 = buildersCfg2 + \
|
| -"""
|
| -c['builders'].append({'name': 'builder2', 'slavename': 'bot1',
|
| - 'builddir': 'workdir2', 'factory': f1 })
|
| -"""
|
| -
|
| -buildersCfg4 = buildersCfg2 + \
|
| -"""
|
| -c['builders'] = [{ 'name': 'builder1', 'slavename': 'bot1',
|
| - 'builddir': 'newworkdir', 'factory': f1 },
|
| - { 'name': 'builder2', 'slavename': 'bot1',
|
| - 'builddir': 'workdir2', 'factory': f1 }]
|
| -"""
|
| -
|
| -buildersCfg5 = buildersCfg2 + \
|
| -"""
|
| -from buildbot.config import BuilderConfig
|
| -c['builders'] = [
|
| - BuilderConfig(
|
| - name = 'builder1',
|
| - slavename = 'bot1',
|
| - builddir = 'newworkdir',
|
| - factory = f1),
|
| - BuilderConfig(
|
| - name = 'builder2',
|
| - slavename = 'bot1',
|
| - builddir = 'workdir2',
|
| - factory = f1)
|
| -]
|
| -"""
|
| -
|
| -
|
| -wpCfg1 = buildersCfg + \
|
| -"""
|
| -from buildbot.steps import shell
|
| -from buildbot.config import BuilderConfig
|
| -f1 = BasicBuildFactory('cvsroot', 'cvsmodule')
|
| -f1.addStep(shell.ShellCommand, command=[shell.WithProperties('echo')])
|
| -c['builders'] = [
|
| - BuilderConfig(name='builder1', slavename='bot1',
|
| - builddir='workdir1', factory=f1)
|
| -]
|
| -"""
|
| -
|
| -wpCfg2 = buildersCfg + \
|
| -"""
|
| -from buildbot.steps import shell
|
| -from buildbot.config import BuilderConfig
|
| -f1 = BasicBuildFactory('cvsroot', 'cvsmodule')
|
| -f1.addStep(shell.ShellCommand,
|
| - command=[shell.WithProperties('echo %s', 'revision')])
|
| -c['builders'] = [
|
| - BuilderConfig(name='builder1', slavename='bot1',
|
| - builddir='workdir1', factory=f1)
|
| -]
|
| -"""
|
| -
|
| -
|
| -
|
| -ircCfg1 = emptyCfg + \
|
| -"""
|
| -from buildbot.status import words
|
| -c['status'] = [words.IRC('irc.us.freenode.net', 'buildbot', ['twisted'])]
|
| -"""
|
| -
|
| -ircCfg2 = emptyCfg + \
|
| -"""
|
| -from buildbot.status import words
|
| -c['status'] = [words.IRC('irc.us.freenode.net', 'buildbot', ['twisted']),
|
| - words.IRC('irc.example.com', 'otherbot', ['chan1', 'chan2'])]
|
| -"""
|
| -
|
| -ircCfg3 = emptyCfg + \
|
| -"""
|
| -from buildbot.status import words
|
| -c['status'] = [words.IRC('irc.us.freenode.net', 'buildbot', ['knotted'])]
|
| -"""
|
| -
|
| -webCfg1 = emptyCfg + \
|
| -"""
|
| -from buildbot.status import html
|
| -c['status'] = [html.Waterfall(http_port=9980)]
|
| -"""
|
| -
|
| -webCfg2 = emptyCfg + \
|
| -"""
|
| -from buildbot.status import html
|
| -c['status'] = [html.Waterfall(http_port=9981)]
|
| -"""
|
| -
|
| -webCfg3 = emptyCfg + \
|
| -"""
|
| -from buildbot.status import html
|
| -c['status'] = [html.Waterfall(http_port='tcp:9981:interface=127.0.0.1')]
|
| -"""
|
| -
|
| -webNameCfg1 = emptyCfg + \
|
| -"""
|
| -from buildbot.status import html
|
| -c['status'] = [html.Waterfall(distrib_port='~/.twistd-web-pb')]
|
| -"""
|
| -
|
| -webNameCfg2 = emptyCfg + \
|
| -"""
|
| -from buildbot.status import html
|
| -c['status'] = [html.Waterfall(distrib_port='./bar.socket')]
|
| -"""
|
| -
|
| -debugPasswordCfg = emptyCfg + \
|
| -"""
|
| -c['debugPassword'] = 'sekrit'
|
| -"""
|
| -
|
| -interlockCfgBad = \
|
| -"""
|
| -from buildbot.process.factory import BasicBuildFactory
|
| -from buildbot.buildslave import BuildSlave
|
| -from buildbot.config import BuilderConfig
|
| -c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -c['schedulers'] = []
|
| -f1 = BasicBuildFactory('cvsroot', 'cvsmodule')
|
| -c['builders'] = [
|
| - BuilderConfig(name='builder1', slavename='bot1', factory=f1),
|
| - BuilderConfig(name='builder2', slavename='bot1', factory=f1),
|
| -]
|
| -# interlocks have been removed
|
| -c['interlocks'] = [('lock1', ['builder1'], ['builder2', 'builder3']),
|
| - ]
|
| -c['slavePortnum'] = 9999
|
| -BuildmasterConfig = c
|
| -"""
|
| -
|
| -lockCfgBad1 = \
|
| -"""
|
| -from buildbot.steps.dummy import Dummy
|
| -from buildbot.process.factory import BuildFactory, s
|
| -from buildbot.locks import MasterLock
|
| -from buildbot.buildslave import BuildSlave
|
| -from buildbot.config import BuilderConfig
|
| -c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -c['schedulers'] = []
|
| -l1 = MasterLock('lock1')
|
| -l2 = MasterLock('lock1') # duplicate lock name
|
| -f1 = BuildFactory([s(Dummy, locks=[])])
|
| -c['builders'] = [
|
| - BuilderConfig(name='builder1', slavename='bot1', factory=f1,
|
| - locks=[l1, l2]),
|
| - BuilderConfig(name='builder2', slavename='bot1', factory=f1),
|
| -]
|
| -c['slavePortnum'] = 9999
|
| -BuildmasterConfig = c
|
| -"""
|
| -
|
| -lockCfgBad2 = \
|
| -"""
|
| -from buildbot.steps.dummy import Dummy
|
| -from buildbot.process.factory import BuildFactory, s
|
| -from buildbot.locks import MasterLock, SlaveLock
|
| -from buildbot.buildslave import BuildSlave
|
| -from buildbot.config import BuilderConfig
|
| -c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -c['schedulers'] = []
|
| -l1 = MasterLock('lock1')
|
| -l2 = SlaveLock('lock1') # duplicate lock name
|
| -f1 = BuildFactory([s(Dummy, locks=[])])
|
| -c['builders'] = [
|
| - BuilderConfig(name='builder1', slavename='bot1', factory=f1,
|
| - locks=[l1, l2]),
|
| - BuilderConfig(name='builder2', slavename='bot1', factory=f1),
|
| -]
|
| -c['slavePortnum'] = 9999
|
| -BuildmasterConfig = c
|
| -"""
|
| -
|
| -lockCfgBad3 = \
|
| -"""
|
| -from buildbot.steps.dummy import Dummy
|
| -from buildbot.process.factory import BuildFactory, s
|
| -from buildbot.locks import MasterLock
|
| -from buildbot.buildslave import BuildSlave
|
| -c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -c['schedulers'] = []
|
| -l1 = MasterLock('lock1')
|
| -l2 = MasterLock('lock1') # duplicate lock name
|
| -f1 = BuildFactory([s(Dummy, locks=[l2])])
|
| -f2 = BuildFactory([s(Dummy)])
|
| -c['builders'] = [
|
| - { 'name': 'builder1', 'slavename': 'bot1',
|
| - 'builddir': 'workdir', 'factory': f2, 'locks': [l1] },
|
| - { 'name': 'builder2', 'slavename': 'bot1',
|
| - 'builddir': 'workdir2', 'factory': f1 },
|
| - ]
|
| -c['slavePortnum'] = 9999
|
| -BuildmasterConfig = c
|
| -"""
|
| -
|
| -lockCfg1a = \
|
| -"""
|
| -from buildbot.process.factory import BasicBuildFactory
|
| -from buildbot.locks import MasterLock
|
| -from buildbot.buildslave import BuildSlave
|
| -from buildbot.config import BuilderConfig
|
| -c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -c['schedulers'] = []
|
| -f1 = BasicBuildFactory('cvsroot', 'cvsmodule')
|
| -l1 = MasterLock('lock1')
|
| -l2 = MasterLock('lock2')
|
| -c['builders'] = [
|
| - BuilderConfig(name='builder1', slavename='bot1', factory=f1,
|
| - locks=[l1, l2]),
|
| - BuilderConfig(name='builder2', slavename='bot1', factory=f1),
|
| -]
|
| -c['slavePortnum'] = 9999
|
| -BuildmasterConfig = c
|
| -"""
|
| -
|
| -lockCfg1b = \
|
| -"""
|
| -from buildbot.process.factory import BasicBuildFactory
|
| -from buildbot.locks import MasterLock
|
| -from buildbot.buildslave import BuildSlave
|
| -from buildbot.config import BuilderConfig
|
| -c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -c['schedulers'] = []
|
| -f1 = BasicBuildFactory('cvsroot', 'cvsmodule')
|
| -l1 = MasterLock('lock1')
|
| -l2 = MasterLock('lock2')
|
| -c['builders'] = [
|
| - BuilderConfig(name='builder1', slavename='bot1', factory=f1, locks=[l1]),
|
| - BuilderConfig(name='builder2', slavename='bot1', factory=f1),
|
| -]
|
| -c['slavePortnum'] = 9999
|
| -BuildmasterConfig = c
|
| -"""
|
| -
|
| -# test out step Locks
|
| -lockCfg2a = \
|
| -"""
|
| -from buildbot.steps.dummy import Dummy
|
| -from buildbot.process.factory import BuildFactory, s
|
| -from buildbot.locks import MasterLock
|
| -from buildbot.buildslave import BuildSlave
|
| -from buildbot.config import BuilderConfig
|
| -c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -c['schedulers'] = []
|
| -l1 = MasterLock('lock1')
|
| -l2 = MasterLock('lock2')
|
| -f1 = BuildFactory([s(Dummy, locks=[l1,l2])])
|
| -f2 = BuildFactory([s(Dummy)])
|
| -
|
| -c['builders'] = [
|
| - BuilderConfig(name='builder1', slavename='bot1', factory=f1),
|
| - BuilderConfig(name='builder2', slavename='bot1', factory=f2),
|
| -]
|
| -c['slavePortnum'] = 9999
|
| -BuildmasterConfig = c
|
| -"""
|
| -
|
| -lockCfg2b = \
|
| -"""
|
| -from buildbot.steps.dummy import Dummy
|
| -from buildbot.process.factory import BuildFactory, s
|
| -from buildbot.locks import MasterLock
|
| -from buildbot.buildslave import BuildSlave
|
| -from buildbot.config import BuilderConfig
|
| -c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -c['schedulers'] = []
|
| -l1 = MasterLock('lock1')
|
| -l2 = MasterLock('lock2')
|
| -f1 = BuildFactory([s(Dummy, locks=[l1])])
|
| -f2 = BuildFactory([s(Dummy)])
|
| -
|
| -c['builders'] = [
|
| - BuilderConfig(name='builder1', slavename='bot1', factory=f1),
|
| - BuilderConfig(name='builder2', slavename='bot1', factory=f2),
|
| -]
|
| -c['slavePortnum'] = 9999
|
| -BuildmasterConfig = c
|
| -"""
|
| -
|
| -lockCfg2c = \
|
| -"""
|
| -from buildbot.steps.dummy import Dummy
|
| -from buildbot.process.factory import BuildFactory, s
|
| -from buildbot.locks import MasterLock
|
| -from buildbot.buildslave import BuildSlave
|
| -from buildbot.config import BuilderConfig
|
| -c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -c['schedulers'] = []
|
| -l1 = MasterLock('lock1')
|
| -l2 = MasterLock('lock2')
|
| -f1 = BuildFactory([s(Dummy)])
|
| -f2 = BuildFactory([s(Dummy)])
|
| -
|
| -c['builders'] = [
|
| - BuilderConfig(name='builder1', slavename='bot1', factory=f1),
|
| - BuilderConfig(name='builder2', slavename='bot1', factory=f2),
|
| -]
|
| -c['slavePortnum'] = 9999
|
| -BuildmasterConfig = c
|
| -"""
|
| -
|
| -schedulersCfg = \
|
| -"""
|
| -from buildbot.scheduler import Scheduler, Dependent
|
| -from buildbot.process.factory import BasicBuildFactory
|
| -from buildbot.buildslave import BuildSlave
|
| -from buildbot.config import BuilderConfig
|
| -c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -f1 = BasicBuildFactory('cvsroot', 'cvsmodule')
|
| -b1 = BuilderConfig(name='builder1', slavename='bot1', factory=f1)
|
| -c['builders'] = [b1]
|
| -c['schedulers'] = [Scheduler('full', None, 60, ['builder1'])]
|
| -c['slavePortnum'] = 9999
|
| -c['projectName'] = 'dummy project'
|
| -c['projectURL'] = 'http://dummy.example.com'
|
| -c['buildbotURL'] = 'http://dummy.example.com/buildbot'
|
| -BuildmasterConfig = c
|
| -"""
|
| -
|
| -class ConfigTest(unittest.TestCase):
|
| - def setUp(self):
|
| - # this class generates several deprecation warnings, which the user
|
| - # doesn't need to see.
|
| - warnings.simplefilter('ignore', exceptions.DeprecationWarning)
|
| - self.buildmaster = BuildMaster(".")
|
| -
|
| - def failUnlessListsEquivalent(self, list1, list2):
|
| - l1 = list1[:]
|
| - l1.sort()
|
| - l2 = list2[:]
|
| - l2.sort()
|
| - self.failUnlessEqual(l1, l2)
|
| -
|
| - def servers(self, s, types):
|
| - # perform a recursive search of s.services, looking for instances of
|
| - # twisted.application.internet.TCPServer, then extract their .args
|
| - # values to find the TCP ports they want to listen on
|
| - for child in s:
|
| - if service.IServiceCollection.providedBy(child):
|
| - for gc in self.servers(child, types):
|
| - yield gc
|
| - if isinstance(child, types):
|
| - yield child
|
| -
|
| - def TCPports(self, s):
|
| - return list(self.servers(s, internet.TCPServer))
|
| - def UNIXports(self, s):
|
| - return list(self.servers(s, internet.UNIXServer))
|
| - def TCPclients(self, s):
|
| - return list(self.servers(s, internet.TCPClient))
|
| -
|
| - def checkPorts(self, svc, expected):
|
| - """Verify that the TCPServer and UNIXServer children of the given
|
| - service have the expected portnum/pathname and factory classes. As a
|
| - side-effect, return a list of servers in the same order as the
|
| - 'expected' list. This can be used to verify properties of the
|
| - factories contained therein."""
|
| -
|
| - expTCP = [e for e in expected if type(e[0]) == int]
|
| - expUNIX = [e for e in expected if type(e[0]) == str]
|
| - haveTCP = [(p.args[0], p.args[1].__class__)
|
| - for p in self.TCPports(svc)]
|
| - haveUNIX = [(p.args[0], p.args[1].__class__)
|
| - for p in self.UNIXports(svc)]
|
| - self.failUnlessListsEquivalent(expTCP, haveTCP)
|
| - self.failUnlessListsEquivalent(expUNIX, haveUNIX)
|
| - ret = []
|
| - for e in expected:
|
| - for have in self.TCPports(svc) + self.UNIXports(svc):
|
| - if have.args[0] == e[0]:
|
| - ret.append(have)
|
| - continue
|
| - assert(len(ret) == len(expected))
|
| - return ret
|
| -
|
| - def testEmpty(self):
|
| - self.failUnlessRaises(KeyError, self.buildmaster.loadConfig, "")
|
| -
|
| - def testSimple(self):
|
| - # covers slavePortnum, base checker passwords
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| -
|
| - master.loadConfig(emptyCfg)
|
| - # note: this doesn't actually start listening, because the app
|
| - # hasn't been started running
|
| - self.failUnlessEqual(master.slavePortnum, "tcp:9999")
|
| - self.checkPorts(master, [(9999, pb.PBServerFactory)])
|
| - self.failUnlessEqual(list(master.change_svc), [])
|
| - self.failUnlessEqual(master.botmaster.builders, {})
|
| - self.failUnlessEqual(master.checker.users,
|
| - {"change": "changepw"})
|
| - self.failUnlessEqual(master.projectName, "dummy project")
|
| - self.failUnlessEqual(master.projectURL, "http://dummy.example.com")
|
| - self.failUnlessEqual(master.buildbotURL,
|
| - "http://dummy.example.com/buildbot")
|
| -
|
| - def testSlavePortnum(self):
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| -
|
| - master.loadConfig(emptyCfg)
|
| - self.failUnlessEqual(master.slavePortnum, "tcp:9999")
|
| - ports = self.checkPorts(master, [(9999, pb.PBServerFactory)])
|
| - p = ports[0]
|
| -
|
| - master.loadConfig(emptyCfg)
|
| - self.failUnlessEqual(master.slavePortnum, "tcp:9999")
|
| - ports = self.checkPorts(master, [(9999, pb.PBServerFactory)])
|
| - self.failUnlessIdentical(p, ports[0],
|
| - "the slave port was changed even " + \
|
| - "though the configuration was not")
|
| -
|
| - master.loadConfig(emptyCfg + "c['slavePortnum'] = 9000\n")
|
| - self.failUnlessEqual(master.slavePortnum, "tcp:9000")
|
| - ports = self.checkPorts(master, [(9000, pb.PBServerFactory)])
|
| - self.failIf(p is ports[0],
|
| - "slave port was unchanged but configuration was changed")
|
| -
|
| - def testSlaves(self):
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| - master.loadConfig(emptyCfg)
|
| - self.failUnlessEqual(master.botmaster.builders, {})
|
| - self.failUnlessEqual(master.checker.users,
|
| - {"change": "changepw"})
|
| - # 'botsCfg' is testing backwards compatibility, for 0.7.5 config
|
| - # files that have not yet been updated to 0.7.6 . This compatibility
|
| - # (and this test) is scheduled for removal in 0.8.0 .
|
| - botsCfg = (emptyCfg +
|
| - "c['bots'] = [('bot1', 'pw1'), ('bot2', 'pw2')]\n")
|
| - master.loadConfig(botsCfg)
|
| - self.failUnlessEqual(master.checker.users,
|
| - {"change": "changepw",
|
| - "bot1": "pw1",
|
| - "bot2": "pw2"})
|
| - master.loadConfig(botsCfg)
|
| - self.failUnlessEqual(master.checker.users,
|
| - {"change": "changepw",
|
| - "bot1": "pw1",
|
| - "bot2": "pw2"})
|
| - master.loadConfig(emptyCfg)
|
| - self.failUnlessEqual(master.checker.users,
|
| - {"change": "changepw"})
|
| - slavesCfg = (emptyCfg +
|
| - "from buildbot.buildslave import BuildSlave\n"
|
| - "c['slaves'] = [BuildSlave('bot1','pw1'), "
|
| - "BuildSlave('bot2','pw2')]\n")
|
| - master.loadConfig(slavesCfg)
|
| - self.failUnlessEqual(master.checker.users,
|
| - {"change": "changepw",
|
| - "bot1": "pw1",
|
| - "bot2": "pw2"})
|
| -
|
| -
|
| - def testChangeSource(self):
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| - master.loadConfig(emptyCfg)
|
| - self.failUnlessEqual(list(master.change_svc), [])
|
| -
|
| - sourcesCfg = emptyCfg + \
|
| -"""
|
| -from buildbot.changes.pb import PBChangeSource
|
| -c['change_source'] = PBChangeSource()
|
| -"""
|
| -
|
| - d = master.loadConfig(sourcesCfg)
|
| - def _check1(res):
|
| - self.failUnlessEqual(len(list(self.buildmaster.change_svc)), 1)
|
| - s1 = list(self.buildmaster.change_svc)[0]
|
| - self.failUnless(isinstance(s1, PBChangeSource))
|
| - self.failUnlessEqual(s1, list(self.buildmaster.change_svc)[0])
|
| - self.failUnless(s1.parent)
|
| -
|
| - # verify that unchanged sources are not interrupted
|
| - d1 = self.buildmaster.loadConfig(sourcesCfg)
|
| -
|
| - def _check2(res):
|
| - self.failUnlessEqual(len(list(self.buildmaster.change_svc)), 1)
|
| - s2 = list(self.buildmaster.change_svc)[0]
|
| - self.failUnlessIdentical(s1, s2)
|
| - self.failUnless(s1.parent)
|
| - d1.addCallback(_check2)
|
| - return d1
|
| - d.addCallback(_check1)
|
| -
|
| - # make sure we can get rid of the sources too
|
| - d.addCallback(lambda res: self.buildmaster.loadConfig(emptyCfg))
|
| -
|
| - def _check3(res):
|
| - self.failUnlessEqual(list(self.buildmaster.change_svc), [])
|
| - d.addCallback(_check3)
|
| -
|
| - return d
|
| -
|
| - def testChangeSources(self):
|
| - # make sure we can accept a list
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| - master.loadConfig(emptyCfg)
|
| - self.failUnlessEqual(list(master.change_svc), [])
|
| -
|
| - sourcesCfg = emptyCfg + \
|
| -"""
|
| -from buildbot.changes.pb import PBChangeSource
|
| -from buildbot.changes.mail import SyncmailMaildirSource
|
| -c['change_source'] = [PBChangeSource(),
|
| - SyncmailMaildirSource('.'),
|
| - ]
|
| -"""
|
| -
|
| - d = master.loadConfig(sourcesCfg)
|
| - def _check1(res):
|
| - self.failUnlessEqual(len(list(self.buildmaster.change_svc)), 2)
|
| - s1,s2 = list(self.buildmaster.change_svc)
|
| - if isinstance(s2, PBChangeSource):
|
| - s1,s2 = s2,s1
|
| - self.failUnless(isinstance(s1, PBChangeSource))
|
| - self.failUnless(s1.parent)
|
| - self.failUnless(isinstance(s2, SyncmailMaildirSource))
|
| - self.failUnless(s2.parent)
|
| - d.addCallback(_check1)
|
| - return d
|
| -
|
| - def testSources(self):
|
| - # test backwards compatibility. c['sources'] is deprecated.
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| - master.loadConfig(emptyCfg)
|
| - self.failUnlessEqual(list(master.change_svc), [])
|
| -
|
| - sourcesCfg = emptyCfg + \
|
| -"""
|
| -from buildbot.changes.pb import PBChangeSource
|
| -c['sources'] = [PBChangeSource()]
|
| -"""
|
| -
|
| - d = master.loadConfig(sourcesCfg)
|
| - def _check1(res):
|
| - self.failUnlessEqual(len(list(self.buildmaster.change_svc)), 1)
|
| - s1 = list(self.buildmaster.change_svc)[0]
|
| - self.failUnless(isinstance(s1, PBChangeSource))
|
| - self.failUnless(s1.parent)
|
| - d.addCallback(_check1)
|
| - return d
|
| -
|
| - def shouldBeFailure(self, res, *expected):
|
| - self.failUnless(isinstance(res, failure.Failure),
|
| - "we expected this to fail, not produce %s" % (res,))
|
| - res.trap(*expected)
|
| - return None # all is good
|
| -
|
| - def testSchedulerErrors(self):
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| - master.loadConfig(emptyCfg)
|
| - self.failUnlessEqual(master.allSchedulers(), [])
|
| -
|
| - def _shouldBeFailure(res, hint=None):
|
| - self.shouldBeFailure(res, AssertionError, ValueError)
|
| - if hint:
|
| - self.failUnless(str(res).find(hint) != -1)
|
| -
|
| - def _loadConfig(res, newcfg):
|
| - return self.buildmaster.loadConfig(newcfg)
|
| - d = defer.succeed(None)
|
| -
|
| - # c['schedulers'] must be a list
|
| - badcfg = schedulersCfg + \
|
| -"""
|
| -c['schedulers'] = Scheduler('full', None, 60, ['builder1'])
|
| -"""
|
| - d.addCallback(_loadConfig, badcfg)
|
| - d.addBoth(_shouldBeFailure,
|
| - "c['schedulers'] must be a list of Scheduler instances")
|
| -
|
| - # c['schedulers'] must be a list of IScheduler objects
|
| - badcfg = schedulersCfg + \
|
| -"""
|
| -c['schedulers'] = ['oops', 'problem']
|
| -"""
|
| - d.addCallback(_loadConfig, badcfg)
|
| - d.addBoth(_shouldBeFailure,
|
| - "c['schedulers'] must be a list of Scheduler instances")
|
| -
|
| - # c['schedulers'] must point at real builders
|
| - badcfg = schedulersCfg + \
|
| -"""
|
| -c['schedulers'] = [Scheduler('full', None, 60, ['builder-bogus'])]
|
| -"""
|
| - d.addCallback(_loadConfig, badcfg)
|
| - d.addBoth(_shouldBeFailure, "uses unknown builder")
|
| -
|
| - # builderNames= must be a list
|
| - badcfg = schedulersCfg + \
|
| -"""
|
| -c['schedulers'] = [Scheduler('full', None, 60, 'builder1')]
|
| -"""
|
| - d.addCallback(_loadConfig, badcfg)
|
| - d.addBoth(_shouldBeFailure,
|
| - "must be a list of Builder description names")
|
| -
|
| - # builderNames= must be a list of strings, not dicts
|
| - badcfg = schedulersCfg + \
|
| -"""
|
| -c['schedulers'] = [Scheduler('full', None, 60, [b1])]
|
| -"""
|
| - d.addCallback(_loadConfig, badcfg)
|
| - d.addBoth(_shouldBeFailure,
|
| - "must be a list of Builder description names")
|
| -
|
| - # builderNames= must be a list of strings, not a dict
|
| - badcfg = schedulersCfg + \
|
| -"""
|
| -c['schedulers'] = [Scheduler('full', None, 60, b1)]
|
| -"""
|
| - d.addCallback(_loadConfig, badcfg)
|
| - d.addBoth(_shouldBeFailure,
|
| - "must be a list of Builder description names")
|
| -
|
| - # each Scheduler must have a unique name
|
| - badcfg = schedulersCfg + \
|
| -"""
|
| -c['schedulers'] = [Scheduler('dup', None, 60, []),
|
| - Scheduler('dup', None, 60, [])]
|
| -"""
|
| - d.addCallback(_loadConfig, badcfg)
|
| - d.addBoth(_shouldBeFailure, "Schedulers must have unique names")
|
| -
|
| - return d
|
| -
|
| - def testSchedulers(self):
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| - master.loadConfig(emptyCfg)
|
| - self.failUnlessEqual(master.allSchedulers(), [])
|
| -
|
| - d = self.buildmaster.loadConfig(schedulersCfg)
|
| - d.addCallback(self._testSchedulers_1)
|
| - return d
|
| -
|
| - def _testSchedulers_1(self, res):
|
| - sch = self.buildmaster.allSchedulers()
|
| - self.failUnlessEqual(len(sch), 1)
|
| - s = sch[0]
|
| - self.failUnless(isinstance(s, scheduler.Scheduler))
|
| - self.failUnlessEqual(s.name, "full")
|
| - self.failUnlessEqual(s.branch, None)
|
| - self.failUnlessEqual(s.treeStableTimer, 60)
|
| - self.failUnlessEqual(s.builderNames, ['builder1'])
|
| -
|
| - newcfg = schedulersCfg + \
|
| -"""
|
| -s1 = Scheduler('full', None, 60, ['builder1'])
|
| -c['schedulers'] = [s1, Dependent('downstream', s1, ['builder1'])]
|
| -"""
|
| - d = self.buildmaster.loadConfig(newcfg)
|
| - d.addCallback(self._testSchedulers_2, newcfg)
|
| - return d
|
| - def _testSchedulers_2(self, res, newcfg):
|
| - sch = self.buildmaster.allSchedulers()
|
| - self.failUnlessEqual(len(sch), 2)
|
| - s = sch[0]
|
| - self.failUnless(isinstance(s, scheduler.Scheduler))
|
| - s = sch[1]
|
| - self.failUnless(isinstance(s, scheduler.Dependent))
|
| - self.failUnlessEqual(s.name, "downstream")
|
| - self.failUnlessEqual(s.builderNames, ['builder1'])
|
| -
|
| - # reloading the same config file should leave the schedulers in place
|
| - d = self.buildmaster.loadConfig(newcfg)
|
| - d.addCallback(self._testSchedulers_3, sch)
|
| - return d
|
| - def _testSchedulers_3(self, res, sch1):
|
| - sch2 = self.buildmaster.allSchedulers()
|
| - self.failUnlessEqual(len(sch2), 2)
|
| - sch1.sort()
|
| - sch2.sort()
|
| - self.failUnlessEqual(sch1, sch2)
|
| - self.failUnlessIdentical(sch1[0], sch2[0])
|
| - self.failUnlessIdentical(sch1[1], sch2[1])
|
| - self.failUnlessIdentical(sch1[0].parent, self.buildmaster)
|
| - self.failUnlessIdentical(sch1[1].parent, self.buildmaster)
|
| -
|
| -
|
| -
|
| - def testBuilders(self):
|
| - master = self.buildmaster
|
| - master.loadConfig(emptyCfg)
|
| - self.failUnlessEqual(master.botmaster.builders, {})
|
| -
|
| - master.loadConfig(buildersCfg)
|
| - self.failUnlessEqual(master.botmaster.builderNames, ["builder1"])
|
| - self.failUnlessEqual(master.botmaster.builders.keys(), ["builder1"])
|
| - b = master.botmaster.builders["builder1"]
|
| - self.failUnless(isinstance(b, Builder))
|
| - self.failUnlessEqual(b.name, "builder1")
|
| - self.failUnlessEqual(b.slavenames, ["bot1"])
|
| - self.failUnlessEqual(b.builddir, "workdir")
|
| - f1 = b.buildFactory
|
| - self.failUnless(isinstance(f1, BasicBuildFactory))
|
| - steps = f1.steps
|
| - self.failUnlessEqual(len(steps), 3)
|
| - self.failUnlessEqual(steps[0], (CVS,
|
| - {'cvsroot': 'cvsroot',
|
| - 'cvsmodule': 'cvsmodule',
|
| - 'mode': 'clobber'}))
|
| - self.failUnlessEqual(steps[1], (Compile,
|
| - {'command': 'make all'}))
|
| - self.failUnlessEqual(steps[2], (Test,
|
| - {'command': 'make check'}))
|
| -
|
| -
|
| - # make sure a reload of the same data doesn't interrupt the Builder
|
| - master.loadConfig(buildersCfg)
|
| - self.failUnlessEqual(master.botmaster.builderNames, ["builder1"])
|
| - self.failUnlessEqual(master.botmaster.builders.keys(), ["builder1"])
|
| - b2 = master.botmaster.builders["builder1"]
|
| - self.failUnlessIdentical(b, b2)
|
| - # TODO: test that the BuilderStatus object doesn't change
|
| - #statusbag2 = master.client_svc.statusbags["builder1"]
|
| - #self.failUnlessIdentical(statusbag, statusbag2)
|
| -
|
| - # but changing something should result in a new Builder
|
| - master.loadConfig(buildersCfg2)
|
| - self.failUnlessEqual(master.botmaster.builderNames, ["builder1"])
|
| - self.failUnlessEqual(master.botmaster.builders.keys(), ["builder1"])
|
| - b3 = master.botmaster.builders["builder1"]
|
| - self.failIf(b is b3)
|
| - # the statusbag remains the same TODO
|
| - #statusbag3 = master.client_svc.statusbags["builder1"]
|
| - #self.failUnlessIdentical(statusbag, statusbag3)
|
| -
|
| - # adding new builder
|
| - master.loadConfig(buildersCfg3)
|
| - self.failUnlessEqual(master.botmaster.builderNames, ["builder1",
|
| - "builder2"])
|
| - self.failUnlessListsEquivalent(master.botmaster.builders.keys(),
|
| - ["builder1", "builder2"])
|
| - b4 = master.botmaster.builders["builder1"]
|
| - self.failUnlessIdentical(b3, b4)
|
| -
|
| - # changing first builder should leave it at the same place in the list
|
| - master.loadConfig(buildersCfg4)
|
| - self.failUnlessEqual(master.botmaster.builderNames, ["builder1",
|
| - "builder2"])
|
| - self.failUnlessListsEquivalent(master.botmaster.builders.keys(),
|
| - ["builder1", "builder2"])
|
| - b5 = master.botmaster.builders["builder1"]
|
| - self.failIf(b4 is b5)
|
| -
|
| - master.loadConfig(buildersCfg5)
|
| - self.failUnlessEqual(master.botmaster.builderNames, ["builder1",
|
| - "builder2"])
|
| - self.failUnlessListsEquivalent(master.botmaster.builders.keys(),
|
| - ["builder1", "builder2"])
|
| - b5 = master.botmaster.builders["builder1"]
|
| -
|
| - # and removing it should make the Builder go away
|
| - master.loadConfig(emptyCfg)
|
| - self.failUnlessEqual(master.botmaster.builderNames, [])
|
| - self.failUnlessEqual(master.botmaster.builders, {})
|
| - #self.failUnlessEqual(master.client_svc.statusbags, {}) # TODO
|
| -
|
| - def testWithProperties(self):
|
| - master = self.buildmaster
|
| - master.loadConfig(wpCfg1)
|
| - self.failUnlessEqual(master.botmaster.builderNames, ["builder1"])
|
| - self.failUnlessEqual(master.botmaster.builders.keys(), ["builder1"])
|
| - b1 = master.botmaster.builders["builder1"]
|
| -
|
| - # reloading the same config should leave the builder unchanged
|
| - master.loadConfig(wpCfg1)
|
| - b2 = master.botmaster.builders["builder1"]
|
| - self.failUnlessIdentical(b1, b2)
|
| -
|
| - # but changing the parameters of the WithProperties should change it
|
| - master.loadConfig(wpCfg2)
|
| - b3 = master.botmaster.builders["builder1"]
|
| - self.failIf(b1 is b3)
|
| -
|
| - # again, reloading same config should leave the builder unchanged
|
| - master.loadConfig(wpCfg2)
|
| - b4 = master.botmaster.builders["builder1"]
|
| - self.failUnlessIdentical(b3, b4)
|
| -
|
| - def checkIRC(self, m, expected):
|
| - ircs = {}
|
| - for irc in self.servers(m, words.IRC):
|
| - ircs[irc.host] = (irc.nick, irc.channels)
|
| - self.failUnlessEqual(ircs, expected)
|
| -
|
| - def testIRC(self):
|
| - if not words:
|
| - raise unittest.SkipTest("Twisted Words package is not installed")
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| - d = master.loadConfig(emptyCfg)
|
| - e1 = {}
|
| - d.addCallback(lambda res: self.checkIRC(master, e1))
|
| - d.addCallback(lambda res: master.loadConfig(ircCfg1))
|
| - e2 = {'irc.us.freenode.net': ('buildbot', ['twisted'])}
|
| - d.addCallback(lambda res: self.checkIRC(master, e2))
|
| - d.addCallback(lambda res: master.loadConfig(ircCfg2))
|
| - e3 = {'irc.us.freenode.net': ('buildbot', ['twisted']),
|
| - 'irc.example.com': ('otherbot', ['chan1', 'chan2'])}
|
| - d.addCallback(lambda res: self.checkIRC(master, e3))
|
| - d.addCallback(lambda res: master.loadConfig(ircCfg3))
|
| - e4 = {'irc.us.freenode.net': ('buildbot', ['knotted'])}
|
| - d.addCallback(lambda res: self.checkIRC(master, e4))
|
| - d.addCallback(lambda res: master.loadConfig(ircCfg1))
|
| - e5 = {'irc.us.freenode.net': ('buildbot', ['twisted'])}
|
| - d.addCallback(lambda res: self.checkIRC(master, e5))
|
| - return d
|
| -
|
| - def testWebPortnum(self):
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| -
|
| - d = master.loadConfig(webCfg1)
|
| - def _check1(res):
|
| - ports = self.checkPorts(self.buildmaster,
|
| - [(9999, pb.PBServerFactory), (9980, Site)])
|
| - p = ports[1]
|
| - self.p = p
|
| - # nothing should be changed
|
| - d.addCallback(_check1)
|
| -
|
| - d.addCallback(lambda res: self.buildmaster.loadConfig(webCfg1))
|
| - def _check2(res):
|
| - ports = self.checkPorts(self.buildmaster,
|
| - [(9999, pb.PBServerFactory), (9980, Site)])
|
| - self.failUnlessIdentical(self.p, ports[1],
|
| - "web port was changed even though "
|
| - "configuration was not")
|
| - # WebStatus is no longer a ComparableMixin, so it will be
|
| - # rebuilt on each reconfig
|
| - #d.addCallback(_check2)
|
| -
|
| - d.addCallback(lambda res: self.buildmaster.loadConfig(webCfg2))
|
| - # changes port to 9981
|
| - def _check3(p):
|
| - ports = self.checkPorts(self.buildmaster,
|
| - [(9999, pb.PBServerFactory), (9981, Site)])
|
| - self.failIf(self.p is ports[1],
|
| - "configuration was changed but web port was unchanged")
|
| - d.addCallback(_check3)
|
| -
|
| - d.addCallback(lambda res: self.buildmaster.loadConfig(webCfg3))
|
| - # make 9981 on only localhost
|
| - def _check4(p):
|
| - ports = self.checkPorts(self.buildmaster,
|
| - [(9999, pb.PBServerFactory), (9981, Site)])
|
| - self.failUnlessEqual(ports[1].kwargs['interface'], "127.0.0.1")
|
| - d.addCallback(_check4)
|
| -
|
| - d.addCallback(lambda res: self.buildmaster.loadConfig(emptyCfg))
|
| - d.addCallback(lambda res:
|
| - self.checkPorts(self.buildmaster,
|
| - [(9999, pb.PBServerFactory)]))
|
| - return d
|
| -
|
| - def testWebPathname(self):
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| -
|
| - d = master.loadConfig(webNameCfg1)
|
| - def _check1(res):
|
| - self.checkPorts(self.buildmaster,
|
| - [(9999, pb.PBServerFactory),
|
| - ('~/.twistd-web-pb', pb.PBServerFactory)])
|
| - unixports = self.UNIXports(self.buildmaster)
|
| - self.f = f = unixports[0].args[1]
|
| - self.failUnless(isinstance(f.root, ResourcePublisher))
|
| - d.addCallback(_check1)
|
| -
|
| - d.addCallback(lambda res: self.buildmaster.loadConfig(webNameCfg1))
|
| - # nothing should be changed
|
| - def _check2(res):
|
| - self.checkPorts(self.buildmaster,
|
| - [(9999, pb.PBServerFactory),
|
| - ('~/.twistd-web-pb', pb.PBServerFactory)])
|
| - newf = self.UNIXports(self.buildmaster)[0].args[1]
|
| - self.failUnlessIdentical(self.f, newf,
|
| - "web factory was changed even though "
|
| - "configuration was not")
|
| - # WebStatus is no longer a ComparableMixin, so it will be
|
| - # rebuilt on each reconfig
|
| - #d.addCallback(_check2)
|
| -
|
| - d.addCallback(lambda res: self.buildmaster.loadConfig(webNameCfg2))
|
| - def _check3(res):
|
| - self.checkPorts(self.buildmaster,
|
| - [(9999, pb.PBServerFactory),
|
| - ('./bar.socket', pb.PBServerFactory)])
|
| - newf = self.UNIXports(self.buildmaster)[0].args[1],
|
| - self.failIf(self.f is newf,
|
| - "web factory was unchanged but "
|
| - "configuration was changed")
|
| - d.addCallback(_check3)
|
| -
|
| - d.addCallback(lambda res: self.buildmaster.loadConfig(emptyCfg))
|
| - d.addCallback(lambda res:
|
| - self.checkPorts(self.buildmaster,
|
| - [(9999, pb.PBServerFactory)]))
|
| - return d
|
| -
|
| - def testDebugPassword(self):
|
| - master = self.buildmaster
|
| -
|
| - master.loadConfig(debugPasswordCfg)
|
| - self.failUnlessEqual(master.checker.users,
|
| - {"change": "changepw",
|
| - "debug": "sekrit"})
|
| -
|
| - master.loadConfig(debugPasswordCfg)
|
| - self.failUnlessEqual(master.checker.users,
|
| - {"change": "changepw",
|
| - "debug": "sekrit"})
|
| -
|
| - master.loadConfig(emptyCfg)
|
| - self.failUnlessEqual(master.checker.users,
|
| - {"change": "changepw"})
|
| -
|
| - def testLocks(self):
|
| - master = self.buildmaster
|
| - botmaster = master.botmaster
|
| -
|
| - # make sure that c['interlocks'] is rejected properly
|
| - self.failUnlessRaises(KeyError, master.loadConfig, interlockCfgBad)
|
| - # and that duplicate-named Locks are caught
|
| - self.failUnlessRaises(ValueError, master.loadConfig, lockCfgBad1)
|
| - self.failUnlessRaises(ValueError, master.loadConfig, lockCfgBad2)
|
| - self.failUnlessRaises(ValueError, master.loadConfig, lockCfgBad3)
|
| -
|
| - # create a Builder that uses Locks
|
| - master.loadConfig(lockCfg1a)
|
| - b1 = master.botmaster.builders["builder1"]
|
| - self.failUnlessEqual(len(b1.locks), 2)
|
| -
|
| - # reloading the same config should not change the Builder
|
| - master.loadConfig(lockCfg1a)
|
| - self.failUnlessIdentical(b1, master.botmaster.builders["builder1"])
|
| - # but changing the set of locks used should change it
|
| - master.loadConfig(lockCfg1b)
|
| - self.failIfIdentical(b1, master.botmaster.builders["builder1"])
|
| - b1 = master.botmaster.builders["builder1"]
|
| - self.failUnlessEqual(len(b1.locks), 1)
|
| -
|
| - # similar test with step-scoped locks
|
| - master.loadConfig(lockCfg2a)
|
| - b1 = master.botmaster.builders["builder1"]
|
| - # reloading the same config should not change the Builder
|
| - master.loadConfig(lockCfg2a)
|
| - self.failUnlessIdentical(b1, master.botmaster.builders["builder1"])
|
| - # but changing the set of locks used should change it
|
| - master.loadConfig(lockCfg2b)
|
| - self.failIfIdentical(b1, master.botmaster.builders["builder1"])
|
| - b1 = master.botmaster.builders["builder1"]
|
| - # remove the locks entirely
|
| - master.loadConfig(lockCfg2c)
|
| - self.failIfIdentical(b1, master.botmaster.builders["builder1"])
|
| -
|
| - def testNoChangeHorizon(self):
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| - sourcesCfg = emptyCfg + \
|
| -"""
|
| -from buildbot.changes.pb import PBChangeSource
|
| -c['change_source'] = PBChangeSource()
|
| -"""
|
| - d = master.loadConfig(sourcesCfg)
|
| - def _check1(res):
|
| - self.failUnlessEqual(len(list(self.buildmaster.change_svc)), 1)
|
| - self.failUnlessEqual(self.buildmaster.change_svc.changeHorizon, 0)
|
| - d.addCallback(_check1)
|
| - return d
|
| -
|
| - def testChangeHorizon(self):
|
| - master = self.buildmaster
|
| - master.loadChanges()
|
| - sourcesCfg = emptyCfg + \
|
| -"""
|
| -from buildbot.changes.pb import PBChangeSource
|
| -c['change_source'] = PBChangeSource()
|
| -c['changeHorizon'] = 5
|
| -"""
|
| - d = master.loadConfig(sourcesCfg)
|
| - def _check1(res):
|
| - self.failUnlessEqual(len(list(self.buildmaster.change_svc)), 1)
|
| - self.failUnlessEqual(self.buildmaster.change_svc.changeHorizon, 5)
|
| - d.addCallback(_check1)
|
| - return d
|
| -
|
| -class ConfigElements(unittest.TestCase):
|
| - # verify that ComparableMixin is working
|
| - def testSchedulers(self):
|
| - s1 = scheduler.Scheduler(name='quick', branch=None,
|
| - treeStableTimer=30,
|
| - builderNames=['quick'])
|
| - s2 = scheduler.Scheduler(name="all", branch=None,
|
| - treeStableTimer=5*60,
|
| - builderNames=["a", "b"])
|
| - s3 = scheduler.Try_Userpass("try", ["a","b"], port=9989,
|
| - userpass=[("foo","bar")])
|
| - s1a = scheduler.Scheduler(name='quick', branch=None,
|
| - treeStableTimer=30,
|
| - builderNames=['quick'])
|
| - s2a = scheduler.Scheduler(name="all", branch=None,
|
| - treeStableTimer=5*60,
|
| - builderNames=["a", "b"])
|
| - s3a = scheduler.Try_Userpass("try", ["a","b"], port=9989,
|
| - userpass=[("foo","bar")])
|
| - self.failUnless(s1 == s1)
|
| - self.failUnless(s1 == s1a)
|
| - self.failUnless(s1a in [s1, s2, s3])
|
| - self.failUnless(s2a in [s1, s2, s3])
|
| - self.failUnless(s3a in [s1, s2, s3])
|
| -
|
| -
|
| -
|
| -class ConfigFileTest(unittest.TestCase):
|
| -
|
| - def testFindConfigFile(self):
|
| - os.mkdir("test_cf")
|
| - open(os.path.join("test_cf", "master.cfg"), "w").write(emptyCfg)
|
| - slaveportCfg = emptyCfg + "c['slavePortnum'] = 9000\n"
|
| - open(os.path.join("test_cf", "alternate.cfg"), "w").write(slaveportCfg)
|
| -
|
| - m = BuildMaster("test_cf")
|
| - m.loadTheConfigFile()
|
| - self.failUnlessEqual(m.slavePortnum, "tcp:9999")
|
| -
|
| - m = BuildMaster("test_cf", "alternate.cfg")
|
| - m.loadTheConfigFile()
|
| - self.failUnlessEqual(m.slavePortnum, "tcp:9000")
|
| -
|
| -
|
| -class MyTarget(base.StatusReceiverMultiService):
|
| - def __init__(self, name):
|
| - self.name = name
|
| - base.StatusReceiverMultiService.__init__(self)
|
| - def startService(self):
|
| - # make a note in a list stashed in the BuildMaster
|
| - self.parent.targetevents.append(("start", self.name))
|
| - return base.StatusReceiverMultiService.startService(self)
|
| - def stopService(self):
|
| - self.parent.targetevents.append(("stop", self.name))
|
| - return base.StatusReceiverMultiService.stopService(self)
|
| -
|
| -class MySlowTarget(MyTarget):
|
| - def stopService(self):
|
| - from twisted.internet import reactor
|
| - d = base.StatusReceiverMultiService.stopService(self)
|
| - def stall(res):
|
| - d2 = defer.Deferred()
|
| - reactor.callLater(0.1, d2.callback, res)
|
| - return d2
|
| - d.addCallback(stall)
|
| - m = self.parent
|
| - def finishedStalling(res):
|
| - m.targetevents.append(("stop", self.name))
|
| - return res
|
| - d.addCallback(finishedStalling)
|
| - return d
|
| -
|
| -# we can't actually startService a buildmaster with a config that uses a
|
| -# fixed slavePortnum like 9999, so instead this makes it possible to pass '0'
|
| -# for the first time, and then substitute back in the allocated port number
|
| -# on subsequent passes.
|
| -startableEmptyCfg = emptyCfg + \
|
| -"""
|
| -c['slavePortnum'] = %d
|
| -"""
|
| -
|
| -targetCfg1 = startableEmptyCfg + \
|
| -"""
|
| -from buildbot.test.test_config import MyTarget
|
| -c['status'] = [MyTarget('a')]
|
| -"""
|
| -
|
| -targetCfg2 = startableEmptyCfg + \
|
| -"""
|
| -from buildbot.test.test_config import MySlowTarget
|
| -c['status'] = [MySlowTarget('b')]
|
| -"""
|
| -
|
| -class StartService(unittest.TestCase):
|
| - def tearDown(self):
|
| - return self.master.stopService()
|
| -
|
| - def testStartService(self):
|
| - os.mkdir("test_ss")
|
| - self.master = m = BuildMaster("test_ss")
|
| - # inhibit the usual read-config-on-startup behavior
|
| - m.readConfig = True
|
| - m.startService()
|
| - d = m.loadConfig(startableEmptyCfg % 0)
|
| - d.addCallback(self._testStartService_0)
|
| - return d
|
| -
|
| - def _testStartService_0(self, res):
|
| - m = self.master
|
| - m.targetevents = []
|
| - # figure out what port got allocated
|
| - self.portnum = m.slavePort._port.getHost().port
|
| - d = m.loadConfig(targetCfg1 % self.portnum)
|
| - d.addCallback(self._testStartService_1)
|
| - return d
|
| -
|
| - def _testStartService_1(self, res):
|
| - self.failUnlessEqual(len(self.master.statusTargets), 1)
|
| - self.failUnless(isinstance(self.master.statusTargets[0], MyTarget))
|
| - self.failUnlessEqual(self.master.targetevents,
|
| - [('start', 'a')])
|
| - self.master.targetevents = []
|
| - # reloading the same config should not start or stop the target
|
| - d = self.master.loadConfig(targetCfg1 % self.portnum)
|
| - d.addCallback(self._testStartService_2)
|
| - return d
|
| -
|
| - def _testStartService_2(self, res):
|
| - self.failUnlessEqual(self.master.targetevents, [])
|
| - # but loading a new config file should stop the old one, then
|
| - # start the new one
|
| - d = self.master.loadConfig(targetCfg2 % self.portnum)
|
| - d.addCallback(self._testStartService_3)
|
| - return d
|
| -
|
| - def _testStartService_3(self, res):
|
| - self.failUnlessEqual(self.master.targetevents,
|
| - [('stop', 'a'), ('start', 'b')])
|
| - self.master.targetevents = []
|
| - # and going back to the old one should do the same, in the same
|
| - # order, even though the current MySlowTarget takes a moment to shut
|
| - # down
|
| - d = self.master.loadConfig(targetCfg1 % self.portnum)
|
| - d.addCallback(self._testStartService_4)
|
| - return d
|
| -
|
| - def _testStartService_4(self, res):
|
| - self.failUnlessEqual(self.master.targetevents,
|
| - [('stop', 'b'), ('start', 'a')])
|
| -
|
| -cfg1 = \
|
| -"""
|
| -from buildbot.process.factory import BuildFactory, s
|
| -from buildbot.steps.shell import ShellCommand
|
| -from buildbot.steps.source import Darcs
|
| -from buildbot.buildslave import BuildSlave
|
| -from buildbot.config import BuilderConfig
|
| -BuildmasterConfig = c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -c['schedulers'] = []
|
| -c['slavePortnum'] = 9999
|
| -f1 = BuildFactory([ShellCommand(command='echo yes'),
|
| - s(ShellCommand, command='old-style'),
|
| - ])
|
| -f1.addStep(Darcs(repourl='http://buildbot.net/repos/trunk'))
|
| -f1.addStep(ShellCommand, command='echo old-style')
|
| -c['builders'] = [
|
| - BuilderConfig(name='builder1', slavename='bot1', factory=f1),
|
| -]
|
| -"""
|
| -
|
| -cfg1_bad = \
|
| -"""
|
| -from buildbot.process.factory import BuildFactory, s
|
| -from buildbot.steps.shell import ShellCommand
|
| -from buildbot.steps.source import Darcs
|
| -from buildbot.buildslave import BuildSlave
|
| -from buildbot.config import BuilderConfig
|
| -BuildmasterConfig = c = {}
|
| -c['slaves'] = [BuildSlave('bot1', 'pw1')]
|
| -c['schedulers'] = []
|
| -c['slavePortnum'] = 9999
|
| -f1 = BuildFactory([ShellCommand(command='echo yes'),
|
| - s(ShellCommand, command='old-style'),
|
| - ])
|
| -# it should be this:
|
| -#f1.addStep(ShellCommand(command='echo args'))
|
| -# but an easy mistake is to do this:
|
| -f1.addStep(ShellCommand(), command='echo args')
|
| -# this test makes sure this error doesn't get ignored
|
| -c['builders'] = [
|
| - BuilderConfig(name='builder1', slavename='bot1', factory=f1),
|
| -]
|
| -"""
|
| -
|
| -class Factories(unittest.TestCase):
|
| - def printExpecting(self, factory, args):
|
| - factory_keys = factory[1].keys()
|
| - factory_keys.sort()
|
| - args_keys = args.keys()
|
| - args_keys.sort()
|
| -
|
| - print
|
| - print "factory had:"
|
| - for k in factory_keys:
|
| - print k
|
| - print "but we were expecting:"
|
| - for k in args_keys:
|
| - print k
|
| -
|
| - def failUnlessExpectedShell(self, factory, defaults=True, **kwargs):
|
| - shell_args = {}
|
| - if defaults:
|
| - shell_args.update({'descriptionDone': None,
|
| - 'description': None,
|
| - 'workdir': None,
|
| - 'logfiles': {},
|
| - 'lazylogfiles': False,
|
| - 'usePTY': "slave-config",
|
| - })
|
| - shell_args.update(kwargs)
|
| - self.failUnlessIdentical(factory[0], ShellCommand)
|
| - if factory[1] != shell_args:
|
| - self.printExpecting(factory, shell_args)
|
| - self.failUnlessEqual(factory[1], shell_args)
|
| -
|
| - def failUnlessExpectedDarcs(self, factory, **kwargs):
|
| - darcs_args = {'workdir': None,
|
| - 'alwaysUseLatest': False,
|
| - 'mode': 'update',
|
| - 'timeout': 1200,
|
| - 'retry': None,
|
| - 'baseURL': None,
|
| - 'defaultBranch': None,
|
| - 'logfiles': {},
|
| - 'lazylogfiles' : False,
|
| - }
|
| - darcs_args.update(kwargs)
|
| - self.failUnlessIdentical(factory[0], Darcs)
|
| - if factory[1] != darcs_args:
|
| - self.printExpecting(factory, darcs_args)
|
| - self.failUnlessEqual(factory[1], darcs_args)
|
| -
|
| - def testSteps(self):
|
| - m = BuildMaster(".")
|
| - m.loadConfig(cfg1)
|
| - b = m.botmaster.builders["builder1"]
|
| - steps = b.buildFactory.steps
|
| - self.failUnlessEqual(len(steps), 4)
|
| -
|
| - self.failUnlessExpectedShell(steps[0], command="echo yes")
|
| - self.failUnlessExpectedShell(steps[1], defaults=False,
|
| - command="old-style")
|
| - self.failUnlessExpectedDarcs(steps[2],
|
| - repourl="http://buildbot.net/repos/trunk")
|
| - self.failUnlessExpectedShell(steps[3], defaults=False,
|
| - command="echo old-style")
|
| -
|
| - def testBadAddStepArguments(self):
|
| - m = BuildMaster(".")
|
| - self.failUnlessRaises(ArgumentsInTheWrongPlace, m.loadConfig, cfg1_bad)
|
| -
|
| - def _loop(self, orig):
|
| - step_class, kwargs = orig.getStepFactory()
|
| - newstep = step_class(**kwargs)
|
| - return newstep
|
| -
|
| - def testAllSteps(self):
|
| - # make sure that steps can be created from the factories that they
|
| - # return
|
| - for s in ( dummy.Dummy(), dummy.FailingDummy(), dummy.RemoteDummy(),
|
| - maxq.MaxQ("testdir"),
|
| - python.BuildEPYDoc(), python.PyFlakes(),
|
| - python_twisted.HLint(),
|
| - python_twisted.Trial(testpath=None, tests="tests"),
|
| - python_twisted.ProcessDocs(), python_twisted.BuildDebs(),
|
| - python_twisted.RemovePYCs(),
|
| - shell.ShellCommand(), shell.TreeSize(),
|
| - shell.Configure(), shell.Compile(), shell.Test(),
|
| - source.CVS("cvsroot", "module"),
|
| - source.SVN("svnurl"), source.Darcs("repourl"),
|
| - source.Git("repourl"),
|
| - source.Arch("url", "version"),
|
| - source.Bazaar("url", "version", "archive"),
|
| - source.Bzr("repourl"),
|
| - source.Mercurial("repourl"),
|
| - source.P4("p4base"),
|
| - source.P4Sync(1234, "p4user", "passwd", "client",
|
| - mode="copy"),
|
| - source.Monotone("server", "branch"),
|
| - transfer.FileUpload("src", "dest"),
|
| - transfer.FileDownload("src", "dest"),
|
| - ):
|
| - try:
|
| - self._loop(s)
|
| - except:
|
| - print "error checking %s" % s
|
| - raise
|
| -
|
|
|