class AsyncXMLRPCTests(unittest.TestCase): """ Tests for L{XMLRPC}'s support of Deferreds. """ def setUp(self): self.request = DummyRequest(['']) self.request.method = 'POST' self.request.content = StringIO( payloadTemplate % ('async', xmlrpclib.dumps(()))) result = self.result = defer.Deferred() class AsyncResource(XMLRPC): def xmlrpc_async(self): return result self.resource = AsyncResource() def test_deferredResponse(self): """ If an L{XMLRPC} C{xmlrpc_*} method returns a L{defer.Deferred}, the response to the request is the result of that L{defer.Deferred}. """ self.resource.render(self.request) self.assertEquals(self.request.written, []) self.result.callback("result") resp = xmlrpclib.loads("".join(self.request.written)) self.assertEquals(resp, (('result',), None)) self.assertEquals(self.request.finished, 1) def test_interruptedDeferredResponse(self): """ While waiting for the L{Deferred} returned by an L{XMLRPC} C{xmlrpc_*} method to fire, the connection the request was issued over may close. If this happens, neither C{write} nor C{finish} is called on the request. """ self.resource.render(self.request) self.request.processingFailed( failure.Failure(ConnectionDone("Simulated"))) self.result.callback("result") self.assertEquals(self.request.written, []) self.assertEquals(self.request.finished, 0)
def processingFailed(self, reason): self._disconnected = True _TwistedDummyRequest.processingFailed(self, reason)