aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_master.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_master.py')
-rw-r--r--lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_master.py567
1 files changed, 0 insertions, 567 deletions
diff --git a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_master.py b/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_master.py
deleted file mode 100644
index c170382e..00000000
--- a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_master.py
+++ /dev/null
@@ -1,567 +0,0 @@
-# This file is part of Buildbot. Buildbot is free software: you can
-# redistribute it and/or modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation, version 2.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc., 51
-# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Copyright Buildbot Team Members
-
-import os
-import mock
-import signal
-from twisted.internet import defer, reactor, task
-from twisted.trial import unittest
-from twisted.python import log
-from buildbot import master, monkeypatches, config
-from buildbot.util import subscription
-from buildbot.db import connector
-from buildbot.test.util import dirs, compat, misc, logging
-from buildbot.test.fake import fakedb
-from buildbot.util import epoch2datetime
-from buildbot.changes import changes
-from buildbot.process.users import users
-
-class Subscriptions(dirs.DirsMixin, unittest.TestCase):
-
- def setUp(self):
- basedir = os.path.abspath('basedir')
- d = self.setUpDirs(basedir)
- def set_master(_):
- self.master = master.BuildMaster(basedir)
- self.master.config.db['db_poll_interval'] = None
- d.addCallback(set_master)
- return d
-
- def tearDown(self):
- return self.tearDownDirs()
-
- def test_change_subscription(self):
- changeid = 918
- chdict = {
- 'changeid': 14,
- 'author': u'warner',
- 'branch': u'warnerdb',
- 'category': u'devel',
- 'comments': u'fix whitespace',
- 'files': [u'master/buildbot/__init__.py'],
- 'is_dir': 0,
- 'project': u'Buildbot',
- 'properties': {},
- 'repository': u'git://warner',
- 'revision': u'0e92a098b',
- 'revlink': u'http://warner/0e92a098b',
- 'when_timestamp': epoch2datetime(266738404),
- }
- newchange = mock.Mock(name='newchange')
-
- # patch out everything we're about to call
- self.master.db = mock.Mock()
- self.master.db.changes.addChange.return_value = \
- defer.succeed(changeid)
- self.master.db.changes.getChange.return_value = \
- defer.succeed(chdict)
- self.patch(changes.Change, 'fromChdict',
- classmethod(lambda cls, master, chdict :
- defer.succeed(newchange)))
-
- cb = mock.Mock()
- sub = self.master.subscribeToChanges(cb)
- self.assertIsInstance(sub, subscription.Subscription)
-
- d = self.master.addChange()
- def check(change):
- # master called the right thing in the db component, including with
- # appropriate default values
- self.master.db.changes.addChange.assert_called_with(author=None,
- files=None, comments=None, is_dir=0,
- revision=None, when_timestamp=None, branch=None, codebase='',
- category=None, revlink='', properties={}, repository='', project='', uid=None)
-
- self.master.db.changes.getChange.assert_called_with(changeid)
- # addChange returned the right value
- self.failUnless(change is newchange) # fromChdict's return value
- # and the notification sub was called correctly
- cb.assert_called_with(newchange)
- d.addCallback(check)
- return d
-
- def do_test_addChange_args(self, args=(), kwargs={}, exp_db_kwargs={}):
- # add default arguments
- default_db_kwargs = dict(files=None, comments=None, author=None,
- is_dir=0, revision=None, when_timestamp=None,
- branch=None, category=None, revlink='', properties={},
- repository='', codebase='', project='', uid=None)
- k = default_db_kwargs
- k.update(exp_db_kwargs)
- exp_db_kwargs = k
-
- self.master.db = mock.Mock()
- got = []
- def db_addChange(*args, **kwargs):
- got[:] = args, kwargs
- # use an exception as a quick way to bail out of the remainder
- # of the addChange method
- return defer.fail(RuntimeError)
- self.master.db.changes.addChange = db_addChange
-
- d = self.master.addChange(*args, **kwargs)
- d.addCallback(lambda _ : self.fail("should not succeed"))
- def check(f):
- self.assertEqual(got, [(), exp_db_kwargs])
- d.addErrback(check)
- return d
-
- def test_addChange_args_author(self):
- # who should come through as author
- return self.do_test_addChange_args(
- kwargs=dict(who='me'),
- exp_db_kwargs=dict(author='me'))
-
- def test_addChange_args_isdir(self):
- # isdir should come through as is_dir
- return self.do_test_addChange_args(
- kwargs=dict(isdir=1),
- exp_db_kwargs=dict(is_dir=1))
-
- def test_addChange_args_when(self):
- # when should come through as when_timestamp, as a datetime
- return self.do_test_addChange_args(
- kwargs=dict(when=892293875),
- exp_db_kwargs=dict(when_timestamp=epoch2datetime(892293875)))
-
- def test_addChange_args_properties(self):
- # properties should be qualified with a source
- return self.do_test_addChange_args(
- kwargs=dict(properties={ 'a' : 'b' }),
- exp_db_kwargs=dict(properties={ 'a' : ('b', 'Change') }))
-
- def test_addChange_args_properties_tuple(self):
- # properties should be qualified with a source, even if they
- # already look like they have a source
- return self.do_test_addChange_args(
- kwargs=dict(properties={ 'a' : ('b', 'Change') }),
- exp_db_kwargs=dict(properties={
- 'a' : (('b', 'Change'), 'Change') }))
-
- def test_addChange_args_positional(self):
- # master.addChange can take author, files, comments as positional
- # arguments
- return self.do_test_addChange_args(
- args=('me', ['a'], 'com'),
- exp_db_kwargs=dict(author='me', files=['a'], comments='com'))
-
- def do_test_createUserObjects_args(self, args=(), kwargs={}, exp_args=()):
- got = []
- def fake_createUserObject(*args, **kwargs):
- got[:] = args, kwargs
- # use an exception as a quick way to bail out of the remainder
- # of the createUserObject method
- return defer.fail(RuntimeError)
-
- self.patch(users, 'createUserObject', fake_createUserObject)
-
- d = self.master.addChange(*args, **kwargs)
- d.addCallback(lambda _ : self.fail("should not succeed"))
- def check(f):
- self.assertEqual(got, [exp_args, {}])
- d.addErrback(check)
- return d
-
- def test_addChange_createUserObject_args(self):
- # who should come through as author
- return self.do_test_createUserObjects_args(
- kwargs=dict(who='me', src='git'),
- exp_args=(self.master, 'me', 'git'))
-
- def test_buildset_subscription(self):
- self.master.db = mock.Mock()
- self.master.db.buildsets.addBuildset.return_value = \
- defer.succeed((938593, dict(a=19,b=20)))
-
- cb = mock.Mock()
- sub = self.master.subscribeToBuildsets(cb)
- self.assertIsInstance(sub, subscription.Subscription)
-
- d = self.master.addBuildset(ssid=999)
- def check((bsid,brids)):
- # master called the right thing in the db component
- self.master.db.buildsets.addBuildset.assert_called_with(ssid=999)
- # addBuildset returned the right value
- self.assertEqual((bsid,brids), (938593, dict(a=19,b=20)))
- # and the notification sub was called correctly
- cb.assert_called_with(bsid=938593, ssid=999)
- d.addCallback(check)
- return d
-
- def test_buildset_completion_subscription(self):
- self.master.db = mock.Mock()
-
- cb = mock.Mock()
- sub = self.master.subscribeToBuildsetCompletions(cb)
- self.assertIsInstance(sub, subscription.Subscription)
-
- self.master._buildsetComplete(938593, 999)
- # assert the notification sub was called correctly
- cb.assert_called_with(938593, 999)
-
-class StartupAndReconfig(dirs.DirsMixin, logging.LoggingMixin, unittest.TestCase):
-
- def setUp(self):
- self.setUpLogging()
- self.basedir = os.path.abspath('basedir')
- d = self.setUpDirs(self.basedir)
- @d.addCallback
- 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)
- 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)
-
- return d
-
- def tearDown(self):
- return self.tearDownDirs()
-
- def make_reactor(self):
- r = mock.Mock()
- r.callWhenRunning = reactor.callWhenRunning
- return r
-
- def patch_loadConfig_fail(self):
- @classmethod
- def loadConfig(cls, b, f):
- config.error('oh noes')
- self.patch(config.MasterConfig, 'loadConfig', loadConfig)
-
-
- # tests
-
- def test_startup_bad_config(self):
- reactor = self.make_reactor()
- self.patch_loadConfig_fail()
-
- d = self.master.startService(_reactor=reactor)
-
- @d.addCallback
- def check(_):
- reactor.stop.assert_called()
- self.assertLogged("oh noes")
- return d
-
- def test_startup_db_not_ready(self):
- reactor = self.make_reactor()
- def db_setup():
- log.msg("GOT HERE")
- raise connector.DatabaseNotReadyError()
- self.db.setup = db_setup
-
- d = self.master.startService(_reactor=reactor)
-
- @d.addCallback
- def check(_):
- reactor.stop.assert_called()
- self.assertLogged("GOT HERE")
- return d
-
- @compat.usesFlushLoggedErrors
- def test_startup_error(self):
- reactor = self.make_reactor()
- def db_setup():
- raise RuntimeError("oh noes")
- self.db.setup = db_setup
-
- d = self.master.startService(_reactor=reactor)
-
- @d.addCallback
- def check(_):
- reactor.stop.assert_called()
- self.assertEqual(len(self.flushLoggedErrors(RuntimeError)), 1)
- return d
-
- def test_startup_ok(self):
- reactor = self.make_reactor()
-
- d = self.master.startService(_reactor=reactor)
- d.addCallback(lambda _ : self.master.stopService())
-
- @d.addCallback
- def check(_):
- self.failIf(reactor.stop.called)
- self.assertLogged("BuildMaster is running")
- return d
-
- def test_reconfig(self):
- reactor = self.make_reactor()
- self.master.reconfigService = mock.Mock(
- side_effect=lambda n : defer.succeed(None))
-
- d = self.master.startService(_reactor=reactor)
- d.addCallback(lambda _ : self.master.reconfig())
- d.addCallback(lambda _ : self.master.stopService())
-
- @d.addCallback
- def check(_):
- self.master.reconfigService.assert_called()
- return d
-
- @defer.inlineCallbacks
- def test_reconfig_bad_config(self):
- reactor = self.make_reactor()
- self.master.reconfigService = mock.Mock(
- side_effect=lambda n : defer.succeed(None))
-
- yield self.master.startService(_reactor=reactor)
-
- # reset, since startService called reconfigService
- self.master.reconfigService.reset_mock()
-
- # reconfig, with a failure
- self.patch_loadConfig_fail()
- yield self.master.reconfig()
-
- self.master.stopService()
-
- self.assertLogged("reconfig aborted without")
- self.failIf(self.master.reconfigService.called)
-
- @defer.inlineCallbacks
- def test_reconfigService_db_url_changed(self):
- old = self.master.config = config.MasterConfig()
- old.db['db_url'] = 'aaaa'
- yield self.master.reconfigService(old)
-
- new = config.MasterConfig()
- new.db['db_url'] = 'bbbb'
-
- self.assertRaises(config.ConfigErrors, lambda :
- self.master.reconfigService(new))
-
- def test_reconfigService_start_polling(self):
- loopingcall = mock.Mock()
- self.patch(task, 'LoopingCall', lambda fn : loopingcall)
-
- self.master.config = config.MasterConfig()
- new = config.MasterConfig()
- new.db['db_poll_interval'] = 120
-
- d = self.master.reconfigService(new)
- @d.addCallback
- def check(_):
- loopingcall.start.assert_called_with(120, now=False)
- return d
-
- @defer.inlineCallbacks
- def test_reconfigService_stop_polling(self):
- db_loop = self.master.db_loop = mock.Mock()
-
- old = self.master.config = config.MasterConfig()
- old.db['db_poll_interval'] = 120
- yield self.master.reconfigService(old)
-
- new = config.MasterConfig()
- new.db['db_poll_interval'] = None
- yield self.master.reconfigService(new)
-
- db_loop.stop.assert_called()
- self.assertEqual(self.master.db_loop, None)
-
-
-class Polling(dirs.DirsMixin, misc.PatcherMixin, unittest.TestCase):
-
- def setUp(self):
- self.gotten_changes = []
- self.gotten_buildset_additions = []
- self.gotten_buildset_completions = []
- self.gotten_buildrequest_additions = []
-
-
- basedir = os.path.abspath('basedir')
-
- # patch out os.uname so that we get a consistent hostname
- self.patch_os_uname(lambda : [ 0, 'testhost.localdomain' ])
- self.master_name = "testhost.localdomain:%s" % (basedir,)
-
- d = self.setUpDirs(basedir)
- def set_master(_):
- self.master = master.BuildMaster(basedir)
-
- self.db = self.master.db = fakedb.FakeDBConnector(self)
-
- self.master.config.db['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
- self.master._new_buildrequest_subs = sub = mock.Mock()
- sub.deliver = self.deliverBuildRequestAddition
-
- d.addCallback(set_master)
- return d
-
- def tearDown(self):
- return self.tearDownDirs()
-
- def deliverChange(self, change):
- self.gotten_changes.append(change)
-
- def deliverBuildsetAddition(self, **kwargs):
- self.gotten_buildset_additions.append(kwargs)
-
- def deliverBuildsetCompletion(self, bsid, result):
- self.gotten_buildset_completions.append((bsid, result))
-
- def deliverBuildRequestAddition(self, notif):
- self.gotten_buildrequest_additions.append(notif)
-
- # tests
-
- def test_pollDatabaseChanges_empty(self):
- self.db.insertTestData([
- fakedb.Object(id=22, name=self.master_name,
- class_name='buildbot.master.BuildMaster'),
- ])
- d = self.master.pollDatabaseChanges()
- def check(_):
- self.assertEqual(self.gotten_changes, [])
- self.assertEqual(self.gotten_buildset_additions, [])
- self.assertEqual(self.gotten_buildset_completions, [])
- self.db.state.assertState(22, last_processed_change=0)
- d.addCallback(check)
- return d
-
- def test_pollDatabaseChanges_catchup(self):
- # with no existing state, it should catch up to the most recent change,
- # but not process anything
- self.db.insertTestData([
- fakedb.Object(id=22, name=self.master_name,
- class_name='buildbot.master.BuildMaster'),
- fakedb.Change(changeid=10),
- fakedb.Change(changeid=11),
- ])
- d = self.master.pollDatabaseChanges()
- def check(_):
- self.assertEqual(self.gotten_changes, [])
- self.assertEqual(self.gotten_buildset_additions, [])
- self.assertEqual(self.gotten_buildset_completions, [])
- self.db.state.assertState(22, last_processed_change=11)
- d.addCallback(check)
- return d
-
- def test_pollDatabaseChanges_multiple(self):
- self.db.insertTestData([
- fakedb.Object(id=53, name=self.master_name,
- class_name='buildbot.master.BuildMaster'),
- fakedb.ObjectState(objectid=53, name='last_processed_change',
- value_json='10'),
- fakedb.Change(changeid=10),
- fakedb.Change(changeid=11),
- fakedb.Change(changeid=12),
- ])
- d = self.master.pollDatabaseChanges()
- def check(_):
- self.assertEqual([ ch.number for ch in self.gotten_changes],
- [ 11, 12 ]) # note 10 was already seen
- self.assertEqual(self.gotten_buildset_additions, [])
- self.assertEqual(self.gotten_buildset_completions, [])
- self.db.state.assertState(53, last_processed_change=12)
- d.addCallback(check)
- return d
-
- def test_pollDatabaseChanges_nothing_new(self):
- self.db.insertTestData([
- fakedb.Object(id=53, name='master',
- class_name='buildbot.master.BuildMaster'),
- fakedb.ObjectState(objectid=53, name='last_processed_change',
- value_json='10'),
- fakedb.Change(changeid=10),
- ])
- d = self.master.pollDatabaseChanges()
- def check(_):
- self.assertEqual(self.gotten_changes, [])
- self.assertEqual(self.gotten_buildset_additions, [])
- self.assertEqual(self.gotten_buildset_completions, [])
- self.db.state.assertState(53, last_processed_change=10)
- d.addCallback(check)
- return d
-
- def test_pollDatabaseBuildRequests_empty(self):
- d = self.master.pollDatabaseBuildRequests()
- def check(_):
- self.assertEqual(self.gotten_buildrequest_additions, [])
- d.addCallback(check)
- return d
-
- def test_pollDatabaseBuildRequests_new(self):
- self.db.insertTestData([
- fakedb.SourceStampSet(id=127),
- fakedb.SourceStamp(id=127, sourcestampsetid=127),
- fakedb.Buildset(id=99, sourcestampsetid=127),
- fakedb.BuildRequest(id=19, buildsetid=99, buildername='9teen'),
- fakedb.BuildRequest(id=20, buildsetid=99, buildername='twenty')
- ])
- d = self.master.pollDatabaseBuildRequests()
- def check(_):
- self.assertEqual(sorted(self.gotten_buildrequest_additions),
- sorted([dict(bsid=99, brid=19, buildername='9teen'),
- dict(bsid=99, brid=20, buildername='twenty')]))
- d.addCallback(check)
- return d
-
- def test_pollDatabaseBuildRequests_incremental(self):
- d = defer.succeed(None)
- def insert1(_):
- self.db.insertTestData([
- fakedb.SourceStampSet(id=127),
- fakedb.SourceStamp(id=127, sourcestampsetid=127),
- fakedb.Buildset(id=99, sourcestampsetid=127),
- fakedb.BuildRequest(id=11, buildsetid=9, buildername='eleventy'),
- ])
- d.addCallback(insert1)
- d.addCallback(lambda _ : self.master.pollDatabaseBuildRequests())
- def insert2_and_claim(_):
- self.gotten_buildrequest_additions.append('MARK')
- self.db.insertTestData([
- fakedb.BuildRequest(id=20, buildsetid=9,
- buildername='twenty'),
- ])
- self.db.buildrequests.fakeClaimBuildRequest(11)
- d.addCallback(insert2_and_claim)
- d.addCallback(lambda _ : self.master.pollDatabaseBuildRequests())
- def unclaim(_):
- self.gotten_buildrequest_additions.append('MARK')
- self.db.buildrequests.fakeUnclaimBuildRequest(11)
- # note that at this point brid 20 is still unclaimed, but we do
- # not get a new notification about it
- d.addCallback(unclaim)
- d.addCallback(lambda _ : self.master.pollDatabaseBuildRequests())
- def check(_):
- self.assertEqual(self.gotten_buildrequest_additions, [
- dict(bsid=9, brid=11, buildername='eleventy'),
- 'MARK',
- dict(bsid=9, brid=20, buildername='twenty'),
- 'MARK',
- dict(bsid=9, brid=11, buildername='eleventy'),
- ])
- d.addCallback(check)
- return d
-