aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_process_botmaster_DuplicateSlaveArbitrator.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_process_botmaster_DuplicateSlaveArbitrator.py')
-rw-r--r--lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_process_botmaster_DuplicateSlaveArbitrator.py213
1 files changed, 0 insertions, 213 deletions
diff --git a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_process_botmaster_DuplicateSlaveArbitrator.py b/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_process_botmaster_DuplicateSlaveArbitrator.py
deleted file mode 100644
index 34e5af1e..00000000
--- a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/test/unit/test_process_botmaster_DuplicateSlaveArbitrator.py
+++ /dev/null
@@ -1,213 +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 mock
-from twisted.python import failure, log
-from twisted.trial import unittest
-from twisted.internet import defer, reactor, task
-from twisted.spread import pb
-from buildbot.test.util import compat
-from buildbot.process import botmaster
-from buildbot.util.eventual import eventually
-
-# TODO: should do this with more of the Twisted machinery intact - maybe in a
-# separate integration test?
-
-class FakeAbstractBuildSlave(object):
-
- def __init__(self, slave, name, isConnected=True, reactor=reactor):
- self.slavename = name
- self.slave = slave
- self.isConnectedResult = isConnected
- self.reactor = reactor
- self.call_on_detach = lambda : None
-
- # set up for loseConnection to cause the slave to detach, but not
- # immediately
- def tport_loseConnection():
- self.isConnectedResult = False
- self.call_on_detach()
- self.call_on_detach = None
- self.slave.broker.transport.loseConnection = (lambda :
- eventually(tport_loseConnection))
-
- def subscribeToDetach(self, callback):
- self.call_on_detach = callback
-
- def isConnected(self):
- return self.isConnectedResult
-
-
-class FakeRemoteBuildSlave(object):
-
- def __init__(self, name, callRemoteFailure=False,
- callRemoteException=False,
- callRemoteHang=0,
- reactor=reactor):
- self.name = name
- self.callRemoteFailure = callRemoteFailure
- self.callRemoteException = callRemoteException
- self.callRemoteHang = callRemoteHang
- self.reactor = reactor
-
- self.broker = mock.Mock()
- self.broker.transport.getPeer = lambda : "<peer %s>" % name
-
- def _makePingResult(self):
- if self.callRemoteException:
- exc = self.callRemoteException()
- log.msg(" -> exception %r" % (exc,))
- raise exc
- if self.callRemoteFailure:
- f = defer.fail(self.callRemoteFailure())
- log.msg(" -> failure %r" % (f,))
- return f
- return defer.succeed(None)
-
- def callRemote(self, meth, *args, **kwargs):
- assert meth == "print"
- log.msg("%r.callRemote('print', %r)" % (self, args[0],))
- # if we're asked to hang, then set up to fire the deferred later
- if self.callRemoteHang:
- log.msg(" -> hang for %d s" % (self.callRemoteHang,))
- d = defer.Deferred()
- self.reactor.callLater(self.callRemoteHang, d.callback, None)
- def hangdone(_):
- log.msg("%r.callRemote hang finished" % (self,))
- return self._makePingResult()
- d.addCallback(hangdone)
- self.callRemote_d = d
- # otherwise, return a fired deferred
- else:
- self.callRemote_d = self._makePingResult()
- return self.callRemote_d
-
- def __repr__(self):
- return "<FakeRemoteBuildSlave %s>" % (self.name,)
-
-
-class DuplicateSlaveArbitrator(unittest.TestCase):
-
- def makeDeadReferenceError(self):
- return pb.DeadReferenceError("Calling Stale Broker (fake exception)")
-
- def makeRuntimeError(self):
- return RuntimeError("oh noes!")
-
- def makePBConnectionLostFailure(self):
- return failure.Failure(pb.PBConnectionLost("gone"))
-
- def test_old_slave_present(self):
- old_remote = FakeRemoteBuildSlave("old")
- new_remote = FakeRemoteBuildSlave("new")
- buildslave = FakeAbstractBuildSlave(old_remote, name="testslave")
- arb = botmaster.DuplicateSlaveArbitrator(buildslave)
- d = arb.getPerspective(new_remote, "testslave")
- def got_persp(bs):
- self.fail("shouldn't get here")
- def failed(f):
- f.trap(RuntimeError) # expected error
- d.addCallbacks(got_persp, failed)
- return d
-
- def test_old_slave_absent_deadref_exc(self):
- old_remote = FakeRemoteBuildSlave("old",
- callRemoteException=self.makeDeadReferenceError)
- new_remote = FakeRemoteBuildSlave("new")
- buildslave = FakeAbstractBuildSlave(old_remote, name="testslave")
- arb = botmaster.DuplicateSlaveArbitrator(buildslave)
- d = arb.getPerspective(new_remote, "testslave")
- def got_persp(bs):
- self.assertIdentical(bs, buildslave)
- d.addCallback(got_persp)
- return d
-
- def test_old_slave_absent_connlost_failure(self):
- old_remote = FakeRemoteBuildSlave("old",
- callRemoteFailure=self.makePBConnectionLostFailure)
- new_remote = FakeRemoteBuildSlave("new")
- buildslave = FakeAbstractBuildSlave(old_remote, name="testslave")
- arb = botmaster.DuplicateSlaveArbitrator(buildslave)
- d = arb.getPerspective(new_remote, "testslave")
- def got_persp(bs):
- self.assertIdentical(bs, buildslave)
- d.addCallback(got_persp)
- return d
-
- @compat.usesFlushLoggedErrors
- def test_old_slave_absent_unexpected_exc(self):
- old_remote = FakeRemoteBuildSlave("old",
- callRemoteException=self.makeRuntimeError)
- new_remote = FakeRemoteBuildSlave("new")
- buildslave = FakeAbstractBuildSlave(old_remote, name="testslave")
- arb = botmaster.DuplicateSlaveArbitrator(buildslave)
- d = arb.getPerspective(new_remote, "testslave")
- def got_persp(bs):
- # getPerspective has returned successfully:
- self.assertIdentical(bs, buildslave)
- # and the unexpected RuntimeError was logged:
- self.assertEqual(len(self.flushLoggedErrors(RuntimeError)), 1)
- d.addCallback(got_persp)
- return d
-
- def do_test_old_slave_absent_timeout(self, callRemoteException=None):
- clock = task.Clock()
- PING_TIMEOUT = botmaster.DuplicateSlaveArbitrator.PING_TIMEOUT
-
- old_remote = FakeRemoteBuildSlave("old", reactor=clock,
- callRemoteHang=PING_TIMEOUT+1,
- callRemoteException=callRemoteException)
- new_remote = FakeRemoteBuildSlave("new")
- buildslave = FakeAbstractBuildSlave(old_remote, name="testslave",
- reactor=clock)
- arb = botmaster.DuplicateSlaveArbitrator(buildslave)
- arb._reactor = clock
- d = arb.getPerspective(new_remote, "testslave")
- def got_persp(bs):
- self.assertIdentical(bs, buildslave)
- d.addCallback(got_persp)
-
- # show the passage of time for 2s more than the PING_TIMEOUT, to allow
- # the old callRemote to return eventually
- clock.pump([.1] * 10 * (PING_TIMEOUT+4))
-
- # check that the timed-out call eventually returned (and was ignored,
- # even if there was an exception)
- self.failUnless(old_remote.callRemote_d.called)
-
- return d
-
- def test_old_slave_absent_timeout(self):
- return self.do_test_old_slave_absent_timeout()
-
- def test_old_slave_absent_timeout_exc(self):
- return self.do_test_old_slave_absent_timeout(
- callRemoteException=self.makeRuntimeError)
-
- @compat.usesFlushLoggedErrors
- def test_new_slave_ping_error(self):
- old_remote = FakeRemoteBuildSlave("old")
- new_remote = FakeRemoteBuildSlave("new",
- callRemoteException=self.makeRuntimeError)
- buildslave = FakeAbstractBuildSlave(old_remote, name="testslave")
- arb = botmaster.DuplicateSlaveArbitrator(buildslave)
- d = arb.getPerspective(new_remote, "testslave")
- def got_persp(bs):
- self.fail("shouldn't get here")
- def failed(f):
- pass #f.trap(RuntimeError) # expected error
- d.addCallbacks(got_persp, failed)
- return d
-