def setUp(self): # The QueryFactory that we are testing. We don't care about any # of the constructor parameters. self.queryFactory = QueryFactory(path=None, host=None, method='POST', user=None, password=None, allowNone=False, args=()) # An XML-RPC response that will parse without raising an error. self.goodContents = xmlrpclib.dumps(('', )) # An 'XML-RPC response' that will raise a parsing error. self.badContents = 'invalid xml' # A dummy 'reason' to pass to clientConnectionLost. We don't care # what it is. self.reason = failure.Failure(ConnectionDone())
def parseResponse(self, contents): print(contents) # show the raw XML-RPC string return QueryFactory.parseResponse(self, contents)
class QueryFactoryParseResponseTests(unittest.TestCase): """ Test the behaviour of L{QueryFactory.parseResponse}. """ def setUp(self): # The QueryFactory that we are testing. We don't care about any # of the constructor parameters. self.queryFactory = QueryFactory( path=None, host=None, method="POST", user=None, password=None, allowNone=False, args=(), ) # An XML-RPC response that will parse without raising an error. self.goodContents = xmlrpclib.dumps(("", )) # An 'XML-RPC response' that will raise a parsing error. self.badContents = "invalid xml" # A dummy 'reason' to pass to clientConnectionLost. We don't care # what it is. self.reason = failure.Failure(ConnectionDone()) def test_parseResponseCallbackSafety(self): """ We can safely call L{QueryFactory.clientConnectionLost} as a callback of L{QueryFactory.parseResponse}. """ d = self.queryFactory.deferred # The failure mode is that this callback raises an AlreadyCalled # error. We have to add it now so that it gets called synchronously # and triggers the race condition. d.addCallback(self.queryFactory.clientConnectionLost, self.reason) self.queryFactory.parseResponse(self.goodContents) return d def test_parseResponseErrbackSafety(self): """ We can safely call L{QueryFactory.clientConnectionLost} as an errback of L{QueryFactory.parseResponse}. """ d = self.queryFactory.deferred # The failure mode is that this callback raises an AlreadyCalled # error. We have to add it now so that it gets called synchronously # and triggers the race condition. d.addErrback(self.queryFactory.clientConnectionLost, self.reason) self.queryFactory.parseResponse(self.badContents) return d def test_badStatusErrbackSafety(self): """ We can safely call L{QueryFactory.clientConnectionLost} as an errback of L{QueryFactory.badStatus}. """ d = self.queryFactory.deferred # The failure mode is that this callback raises an AlreadyCalled # error. We have to add it now so that it gets called synchronously # and triggers the race condition. d.addErrback(self.queryFactory.clientConnectionLost, self.reason) self.queryFactory.badStatus("status", "message") return d def test_parseResponseWithoutData(self): """ Some server can send a response without any data: L{QueryFactory.parseResponse} should catch the error and call the result errback. """ content = """ <methodResponse> <params> <param> </param> </params> </methodResponse>""" d = self.queryFactory.deferred self.queryFactory.parseResponse(content) return self.assertFailure(d, IndexError)