'Return the current failure result of C{deferred} or raise
C{self.failureException}.
@param deferred: A L{Deferred<twisted.internet.defer.Deferred>} which
has a failure result.  This means
L{Deferred.callback<twisted.internet.defer.Deferred.callback>} or
L{Deferred.errback<twisted.internet.defer.Deferred.errback>} has
been called on it and it has reached the end of its callback chain
and the last callback or errback raised an exception or returned a
L{failure.Failure}.
@type deferred: L{Deferred<twisted.internet.defer.Deferred>}
@param expectedExceptionTypes: Exception types to expect - if
provided, and the exception wrapped by the failure result is
not one of the types provided, then this test will fail.
@raise SynchronousTestCase.failureException: If the
L{Deferred<twisted.internet.defer.Deferred>} has no result, has a
success result, or has an unexpected failure result.
@return: The failure result of C{deferred}.
@rtype: L{failure.Failure}'

def failureResultOf(self, deferred, *expectedExceptionTypes):

    result = []
    deferred.addBoth(result.append)
    if (not result):
        self.fail(('Failure    result    expected    on    %r,    found    no    result    instead' % (deferred,)))
    elif (not isinstance(result[0], failure.Failure)):
        self.fail(('Failure    result    expected    on    %r,    found    success    result    (%r)    instead' % (deferred, result[0])))
    elif (expectedExceptionTypes and (not result[0].check(*expectedExceptionTypes))):
        expectedString = '    or    '.join(['.'.join((t.__module__, t.__name__)) for t in expectedExceptionTypes])
        self.fail(('Failure    of    type    (%s)    expected    on    %r,    found    type    %r    instead:    %s' % (expectedString, deferred, result[0].type, result[0].getTraceback())))
    else:
        return result[0]
