| Index: third_party/twisted_8_1/twisted/test/test_pbfailure.py
|
| diff --git a/third_party/twisted_8_1/twisted/test/test_pbfailure.py b/third_party/twisted_8_1/twisted/test/test_pbfailure.py
|
| deleted file mode 100644
|
| index a0981de373e5c81709cc8cb195e7028c3cd02088..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/test/test_pbfailure.py
|
| +++ /dev/null
|
| @@ -1,407 +0,0 @@
|
| -# Copyright (c) 2001-2008 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -Tests for error handling in PB.
|
| -"""
|
| -
|
| -from twisted.trial import unittest
|
| -
|
| -from twisted.spread import pb, flavors, jelly
|
| -from twisted.internet import reactor, defer
|
| -from twisted.python import log
|
| -
|
| -##
|
| -# test exceptions
|
| -##
|
| -class AsynchronousException(Exception):
|
| - """
|
| - Helper used to test remote methods which return Deferreds which fail with
|
| - exceptions which are not L{pb.Error} subclasses.
|
| - """
|
| -
|
| -
|
| -class SynchronousException(Exception):
|
| - """
|
| - Helper used to test remote methods which raise exceptions which are not
|
| - L{pb.Error} subclasses.
|
| - """
|
| -
|
| -
|
| -class AsynchronousError(pb.Error):
|
| - """
|
| - Helper used to test remote methods which return Deferreds which fail with
|
| - exceptions which are L{pb.Error} subclasses.
|
| - """
|
| -
|
| -
|
| -class SynchronousError(pb.Error):
|
| - """
|
| - Helper used to test remote methods which raise exceptions which are
|
| - L{pb.Error} subclasses.
|
| - """
|
| -
|
| -
|
| -#class JellyError(flavors.Jellyable, pb.Error): pass
|
| -class JellyError(flavors.Jellyable, pb.Error, pb.RemoteCopy):
|
| - pass
|
| -
|
| -
|
| -class SecurityError(pb.Error, pb.RemoteCopy):
|
| - pass
|
| -
|
| -pb.setUnjellyableForClass(JellyError, JellyError)
|
| -pb.setUnjellyableForClass(SecurityError, SecurityError)
|
| -pb.globalSecurity.allowInstancesOf(SecurityError)
|
| -
|
| -
|
| -####
|
| -# server-side
|
| -####
|
| -class SimpleRoot(pb.Root):
|
| - def remote_asynchronousException(self):
|
| - """
|
| - Fail asynchronously with a non-pb.Error exception.
|
| - """
|
| - return defer.fail(AsynchronousException("remote asynchronous exception"))
|
| -
|
| - def remote_synchronousException(self):
|
| - """
|
| - Fail synchronously with a non-pb.Error exception.
|
| - """
|
| - raise SynchronousException("remote synchronous exception")
|
| -
|
| - def remote_asynchronousError(self):
|
| - """
|
| - Fail asynchronously with a pb.Error exception.
|
| - """
|
| - return defer.fail(AsynchronousError("remote asynchronous error"))
|
| -
|
| - def remote_synchronousError(self):
|
| - """
|
| - Fail synchronously with a pb.Error exception.
|
| - """
|
| - raise SynchronousError("remote synchronous error")
|
| -
|
| - def remote_unknownError(self):
|
| - """
|
| - Fail with error that is not known to client.
|
| - """
|
| - class UnknownError(pb.Error):
|
| - pass
|
| - raise UnknownError("I'm not known to client!")
|
| -
|
| - def remote_jelly(self):
|
| - self.raiseJelly()
|
| -
|
| - def remote_security(self):
|
| - self.raiseSecurity()
|
| -
|
| - def remote_deferredJelly(self):
|
| - d = defer.Deferred()
|
| - d.addCallback(self.raiseJelly)
|
| - d.callback(None)
|
| - return d
|
| -
|
| - def remote_deferredSecurity(self):
|
| - d = defer.Deferred()
|
| - d.addCallback(self.raiseSecurity)
|
| - d.callback(None)
|
| - return d
|
| -
|
| - def raiseJelly(self, results=None):
|
| - raise JellyError("I'm jellyable!")
|
| -
|
| - def raiseSecurity(self, results=None):
|
| - raise SecurityError("I'm secure!")
|
| -
|
| -
|
| -
|
| -class PBConnTestCase(unittest.TestCase):
|
| - unsafeTracebacks = 0
|
| -
|
| - def setUp(self):
|
| - self._setUpServer()
|
| - self._setUpClient()
|
| -
|
| - def _setUpServer(self):
|
| - self.serverFactory = pb.PBServerFactory(SimpleRoot())
|
| - self.serverFactory.unsafeTracebacks = self.unsafeTracebacks
|
| - self.serverPort = reactor.listenTCP(0, self.serverFactory, interface="127.0.0.1")
|
| -
|
| - def _setUpClient(self):
|
| - portNo = self.serverPort.getHost().port
|
| - self.clientFactory = pb.PBClientFactory()
|
| - self.clientConnector = reactor.connectTCP("127.0.0.1", portNo, self.clientFactory)
|
| -
|
| - def tearDown(self):
|
| - return defer.gatherResults([
|
| - self._tearDownServer(),
|
| - self._tearDownClient()])
|
| -
|
| - def _tearDownServer(self):
|
| - return defer.maybeDeferred(self.serverPort.stopListening)
|
| -
|
| - def _tearDownClient(self):
|
| - self.clientConnector.disconnect()
|
| - return defer.succeed(None)
|
| -
|
| -
|
| -
|
| -class PBFailureTest(PBConnTestCase):
|
| - compare = unittest.TestCase.assertEquals
|
| -
|
| -
|
| - def _exceptionTest(self, method, exceptionType, flush):
|
| - def eb(err):
|
| - err.trap(exceptionType)
|
| - self.compare(err.traceback, "Traceback unavailable\n")
|
| - if flush:
|
| - errs = self.flushLoggedErrors(exceptionType)
|
| - self.assertEqual(len(errs), 1)
|
| - return (err.type, err.value, err.traceback)
|
| - d = self.clientFactory.getRootObject()
|
| - def gotRootObject(root):
|
| - d = root.callRemote(method)
|
| - d.addErrback(eb)
|
| - return d
|
| - d.addCallback(gotRootObject)
|
| - return d
|
| -
|
| -
|
| - def test_asynchronousException(self):
|
| - """
|
| - Test that a Deferred returned by a remote method which already has a
|
| - Failure correctly has that error passed back to the calling side.
|
| - """
|
| - return self._exceptionTest(
|
| - 'asynchronousException', AsynchronousException, True)
|
| -
|
| -
|
| - def test_synchronousException(self):
|
| - """
|
| - Like L{test_asynchronousException}, but for a method which raises an
|
| - exception synchronously.
|
| - """
|
| - return self._exceptionTest(
|
| - 'synchronousException', SynchronousException, True)
|
| -
|
| -
|
| - def test_asynchronousError(self):
|
| - """
|
| - Like L{test_asynchronousException}, but for a method which returns a
|
| - Deferred failing with an L{pb.Error} subclass.
|
| - """
|
| - return self._exceptionTest(
|
| - 'asynchronousError', AsynchronousError, False)
|
| -
|
| -
|
| - def test_synchronousError(self):
|
| - """
|
| - Like L{test_asynchronousError}, but for a method which synchronously
|
| - raises a L{pb.Error} subclass.
|
| - """
|
| - return self._exceptionTest(
|
| - 'synchronousError', SynchronousError, False)
|
| -
|
| -
|
| - def _success(self, result, expectedResult):
|
| - self.assertEquals(result, expectedResult)
|
| - return result
|
| -
|
| -
|
| - def _addFailingCallbacks(self, remoteCall, expectedResult, eb):
|
| - remoteCall.addCallbacks(self._success, eb,
|
| - callbackArgs=(expectedResult,))
|
| - return remoteCall
|
| -
|
| -
|
| - def _testImpl(self, method, expected, eb, exc=None):
|
| - """
|
| - Call the given remote method and attach the given errback to the
|
| - resulting Deferred. If C{exc} is not None, also assert that one
|
| - exception of that type was logged.
|
| - """
|
| - rootDeferred = self.clientFactory.getRootObject()
|
| - def gotRootObj(obj):
|
| - failureDeferred = self._addFailingCallbacks(obj.callRemote(method), expected, eb)
|
| - if exc is not None:
|
| - def gotFailure(err):
|
| - self.assertEquals(len(self.flushLoggedErrors(exc)), 1)
|
| - return err
|
| - failureDeferred.addBoth(gotFailure)
|
| - return failureDeferred
|
| - rootDeferred.addCallback(gotRootObj)
|
| - return rootDeferred
|
| -
|
| -
|
| - def test_jellyFailure(self):
|
| - """
|
| - Test that an exception which is a subclass of L{pb.Error} has more
|
| - information passed across the network to the calling side.
|
| - """
|
| - def failureJelly(fail):
|
| - fail.trap(JellyError)
|
| - self.failIf(isinstance(fail.type, str))
|
| - self.failUnless(isinstance(fail.value, fail.type))
|
| - return 43
|
| - return self._testImpl('jelly', 43, failureJelly)
|
| -
|
| -
|
| - def test_deferredJellyFailure(self):
|
| - """
|
| - Test that a Deferred which fails with a L{pb.Error} is treated in
|
| - the same way as a synchronously raised L{pb.Error}.
|
| - """
|
| - def failureDeferredJelly(fail):
|
| - fail.trap(JellyError)
|
| - self.failIf(isinstance(fail.type, str))
|
| - self.failUnless(isinstance(fail.value, fail.type))
|
| - return 430
|
| - return self._testImpl('deferredJelly', 430, failureDeferredJelly)
|
| -
|
| -
|
| - def test_unjellyableFailure(self):
|
| - """
|
| - An non-jellyable L{pb.Error} subclass raised by a remote method is
|
| - turned into a Failure with a type set to the FQPN of the exception
|
| - type.
|
| - """
|
| - def failureUnjellyable(fail):
|
| - self.assertEqual(
|
| - fail.type, 'twisted.test.test_pbfailure.SynchronousError')
|
| - return 431
|
| - return self._testImpl('synchronousError', 431, failureUnjellyable)
|
| -
|
| -
|
| - def test_unknownFailure(self):
|
| - """
|
| - Test that an exception which is a subclass of L{pb.Error} but not
|
| - known on the client side has its type set properly.
|
| - """
|
| - def failureUnknown(fail):
|
| - self.assertEqual(
|
| - fail.type, 'twisted.test.test_pbfailure.UnknownError')
|
| - return 4310
|
| - return self._testImpl('unknownError', 4310, failureUnknown)
|
| -
|
| -
|
| - def test_securityFailure(self):
|
| - """
|
| - Test that even if an exception is not explicitly jellyable (by being
|
| - a L{pb.Jellyable} subclass), as long as it is an L{pb.Error}
|
| - subclass it receives the same special treatment.
|
| - """
|
| - def failureSecurity(fail):
|
| - fail.trap(SecurityError)
|
| - self.failIf(isinstance(fail.type, str))
|
| - self.failUnless(isinstance(fail.value, fail.type))
|
| - return 4300
|
| - return self._testImpl('security', 4300, failureSecurity)
|
| -
|
| -
|
| - def test_deferredSecurity(self):
|
| - """
|
| - Test that a Deferred which fails with a L{pb.Error} which is not
|
| - also a L{pb.Jellyable} is treated in the same way as a synchronously
|
| - raised exception of the same type.
|
| - """
|
| - def failureDeferredSecurity(fail):
|
| - fail.trap(SecurityError)
|
| - self.failIf(isinstance(fail.type, str))
|
| - self.failUnless(isinstance(fail.value, fail.type))
|
| - return 43000
|
| - return self._testImpl('deferredSecurity', 43000, failureDeferredSecurity)
|
| -
|
| -
|
| - def test_noSuchMethodFailure(self):
|
| - """
|
| - Test that attempting to call a method which is not defined correctly
|
| - results in an AttributeError on the calling side.
|
| - """
|
| - def failureNoSuch(fail):
|
| - fail.trap(pb.NoSuchMethod)
|
| - self.compare(fail.traceback, "Traceback unavailable\n")
|
| - return 42000
|
| - return self._testImpl('nosuch', 42000, failureNoSuch, AttributeError)
|
| -
|
| -
|
| - def test_copiedFailureLogging(self):
|
| - """
|
| - Test that a copied failure received from a PB call can be logged
|
| - locally.
|
| -
|
| - Note: this test needs some serious help: all it really tests is that
|
| - log.err(copiedFailure) doesn't raise an exception.
|
| - """
|
| - d = self.clientFactory.getRootObject()
|
| -
|
| - def connected(rootObj):
|
| - return rootObj.callRemote('synchronousException')
|
| - d.addCallback(connected)
|
| -
|
| - def exception(failure):
|
| - log.err(failure)
|
| - errs = self.flushLoggedErrors(SynchronousException)
|
| - self.assertEquals(len(errs), 2)
|
| - d.addErrback(exception)
|
| -
|
| - return d
|
| -
|
| -
|
| -
|
| -class PBFailureTestUnsafe(PBFailureTest):
|
| - compare = unittest.TestCase.failIfEquals
|
| - unsafeTracebacks = 1
|
| -
|
| -
|
| -
|
| -class DummyInvoker(object):
|
| - """
|
| - A behaviorless object to be used as the invoker parameter to
|
| - L{jelly.jelly}.
|
| - """
|
| - serializingPerspective = None
|
| -
|
| -
|
| -
|
| -class FailureJellyingTests(unittest.TestCase):
|
| - """
|
| - Tests for the interaction of jelly and failures.
|
| - """
|
| - def test_unjelliedFailureCheck(self):
|
| - """
|
| - An unjellied L{CopyableFailure} has a check method which behaves the
|
| - same way as the original L{CopyableFailure}'s check method.
|
| - """
|
| - original = pb.CopyableFailure(ZeroDivisionError())
|
| - self.assertIdentical(
|
| - original.check(ZeroDivisionError), ZeroDivisionError)
|
| - self.assertIdentical(original.check(ArithmeticError), ArithmeticError)
|
| - copied = jelly.unjelly(jelly.jelly(original, invoker=DummyInvoker()))
|
| - self.assertIdentical(
|
| - copied.check(ZeroDivisionError), ZeroDivisionError)
|
| - self.assertIdentical(copied.check(ArithmeticError), ArithmeticError)
|
| -
|
| -
|
| - def test_twiceUnjelliedFailureCheck(self):
|
| - """
|
| - The object which results from jellying a L{CopyableFailure}, unjellying
|
| - the result, creating a new L{CopyableFailure} from the result of that,
|
| - jellying it, and finally unjellying the result of that has a check
|
| - method which behaves the same way as the original L{CopyableFailure}'s
|
| - check method.
|
| - """
|
| - original = pb.CopyableFailure(ZeroDivisionError())
|
| - self.assertIdentical(
|
| - original.check(ZeroDivisionError), ZeroDivisionError)
|
| - self.assertIdentical(original.check(ArithmeticError), ArithmeticError)
|
| - copiedOnce = jelly.unjelly(
|
| - jelly.jelly(original, invoker=DummyInvoker()))
|
| - derivative = pb.CopyableFailure(copiedOnce)
|
| - copiedTwice = jelly.unjelly(
|
| - jelly.jelly(derivative, invoker=DummyInvoker()))
|
| - self.assertIdentical(
|
| - copiedTwice.check(ZeroDivisionError), ZeroDivisionError)
|
| - self.assertIdentical(
|
| - copiedTwice.check(ArithmeticError), ArithmeticError)
|
|
|