File: //lib/python3/dist-packages/twisted/trial/test/detests.py
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.
"""
Tests for Deferred handling by L{twisted.trial.unittest.TestCase}.
"""
from __future__ import division, absolute_import
from twisted.trial import unittest
from twisted.internet import defer, threads, reactor
from twisted.trial.util import suppress as SUPPRESS
from twisted.python.util import runWithWarningsSuppressed
class DeferredSetUpOK(unittest.TestCase):
    def setUp(self):
        d = defer.succeed('value')
        d.addCallback(self._cb_setUpCalled)
        return d
    def _cb_setUpCalled(self, ignored):
        self._setUpCalled = True
    def test_ok(self):
        self.assertTrue(self._setUpCalled)
class DeferredSetUpFail(unittest.TestCase):
    testCalled = False
    def setUp(self):
        return defer.fail(unittest.FailTest('i fail'))
    def test_ok(self):
        DeferredSetUpFail.testCalled = True
        self.fail("I should not get called")
class DeferredSetUpCallbackFail(unittest.TestCase):
    testCalled = False
    def setUp(self):
        d = defer.succeed('value')
        d.addCallback(self._cb_setUpCalled)
        return d
    def _cb_setUpCalled(self, ignored):
        self.fail('deliberate failure')
    def test_ok(self):
        DeferredSetUpCallbackFail.testCalled = True
class DeferredSetUpError(unittest.TestCase):
    testCalled = False
    def setUp(self):
        return defer.fail(RuntimeError('deliberate error'))
    def test_ok(self):
        DeferredSetUpError.testCalled = True
class DeferredSetUpNeverFire(unittest.TestCase):
    testCalled = False
    def setUp(self):
        return defer.Deferred()
    def test_ok(self):
        DeferredSetUpNeverFire.testCalled = True
class DeferredSetUpSkip(unittest.TestCase):
    testCalled = False
    def setUp(self):
        d = defer.succeed('value')
        d.addCallback(self._cb1)
        return d
    def _cb1(self, ignored):
        raise unittest.SkipTest("skip me")
    def test_ok(self):
        DeferredSetUpSkip.testCalled = True
class DeferredTests(unittest.TestCase):
    touched = False
    def _cb_fail(self, reason):
        self.fail(reason)
    def _cb_error(self, reason):
        raise RuntimeError(reason)
    def _cb_skip(self, reason):
        raise unittest.SkipTest(reason)
    def _touchClass(self, ignored):
        self.__class__.touched = True
    def setUp(self):
        self.__class__.touched = False
    def test_pass(self):
        return defer.succeed('success')
    def test_passGenerated(self):
        self._touchClass(None)
        yield None
    test_passGenerated = runWithWarningsSuppressed(
        [ SUPPRESS(message="twisted.internet.defer.deferredGenerator was "
                          "deprecated") ],
        defer.deferredGenerator, test_passGenerated)
    @defer.inlineCallbacks
    def test_passInlineCallbacks(self):
        """
        Test case that is decorated with L{defer.inlineCallbacks}.
        """
        self._touchClass(None)
        yield None
    def test_fail(self):
        return defer.fail(self.failureException('I fail'))
    def test_failureInCallback(self):
        d = defer.succeed('fail')
        d.addCallback(self._cb_fail)
        return d
    def test_errorInCallback(self):
        d = defer.succeed('error')
        d.addCallback(self._cb_error)
        return d
    def test_skip(self):
        d = defer.succeed('skip')
        d.addCallback(self._cb_skip)
        d.addCallback(self._touchClass)
        return d
    def test_thread(self):
        return threads.deferToThread(lambda : None)
    def test_expectedFailure(self):
        d = defer.succeed('todo')
        d.addCallback(self._cb_error)
        return d
    test_expectedFailure.todo = "Expected failure"
class TimeoutTests(unittest.TestCase):
    timedOut = None
    def test_pass(self):
        d = defer.Deferred()
        reactor.callLater(0, d.callback, 'hoorj!')
        return d
    test_pass.timeout = 2
    def test_passDefault(self):
        # test default timeout
        d = defer.Deferred()
        reactor.callLater(0, d.callback, 'hoorj!')
        return d
    def test_timeout(self):
        return defer.Deferred()
    test_timeout.timeout = 0.1
    def test_timeoutZero(self):
        return defer.Deferred()
    test_timeoutZero.timeout = 0
    def test_expectedFailure(self):
        return defer.Deferred()
    test_expectedFailure.timeout = 0.1
    test_expectedFailure.todo = "i will get it right, eventually"
    def test_skip(self):
        return defer.Deferred()
    test_skip.timeout = 0.1
    test_skip.skip = "i will get it right, eventually"
    def test_errorPropagation(self):
        def timedOut(err):
            self.__class__.timedOut = err
            return err
        d = defer.Deferred()
        d.addErrback(timedOut)
        return d
    test_errorPropagation.timeout = 0.1
    def test_calledButNeverCallback(self):
        d = defer.Deferred()
        def neverFire(r):
            return defer.Deferred()
        d.addCallback(neverFire)
        d.callback(1)
        return d
    test_calledButNeverCallback.timeout = 0.1
class TestClassTimeoutAttribute(unittest.TestCase):
    timeout = 0.2
    def setUp(self):
        self.d = defer.Deferred()
    def testMethod(self):
        self.methodCalled = True
        return self.d