1
# Copyright (c) 2009 Twisted Matrix Laboratories.
2
# See LICENSE for details.
5
Tests for L{twisted.internet.posixbase} and supporting code.
8
from twisted.python.compat import set
9
from twisted.trial.unittest import TestCase
10
from twisted.internet.posixbase import PosixReactorBase, _Waker
11
from twisted.internet.protocol import ServerFactory
12
from twisted.internet.tcp import Port
13
from twisted.internet import reactor
16
class TrivialReactor(PosixReactorBase):
20
PosixReactorBase.__init__(self)
23
def addReader(self, reader):
24
self._readers[reader] = True
27
def removeReader(self, reader):
28
del self._readers[reader]
31
def addWriter(self, writer):
32
self._writers[writer] = True
35
def removeWriter(self, writer):
36
del self._writers[writer]
40
class PosixReactorBaseTests(TestCase):
42
Tests for L{PosixReactorBase}.
45
def _checkWaker(self, reactor):
46
self.assertIsInstance(reactor.waker, _Waker)
47
self.assertIn(reactor.waker, reactor._internalReaders)
48
self.assertIn(reactor.waker, reactor._readers)
51
def test_wakerIsInternalReader(self):
53
When L{PosixReactorBase} is instantiated, it creates a waker and adds
54
it to its internal readers set.
56
reactor = TrivialReactor()
57
self._checkWaker(reactor)
60
def test_removeAllSkipsInternalReaders(self):
62
Any L{IReadDescriptors} in L{PosixReactorBase._internalReaders} are
63
left alone by L{PosixReactorBase._removeAll}.
65
reactor = TrivialReactor()
67
reactor._internalReaders.add(extra)
68
reactor.addReader(extra)
69
reactor._removeAll(reactor._readers, reactor._writers)
70
self._checkWaker(reactor)
71
self.assertIn(extra, reactor._internalReaders)
72
self.assertIn(extra, reactor._readers)
75
def test_removeAllReturnsRemovedDescriptors(self):
77
L{PosixReactorBase._removeAll} returns a list of removed
78
L{IReadDescriptor} and L{IWriteDescriptor} objects.
80
reactor = TrivialReactor()
83
reactor.addReader(reader)
84
reactor.addWriter(writer)
85
removed = reactor._removeAll(
86
reactor._readers, reactor._writers)
87
self.assertEqual(set(removed), set([reader, writer]))
88
self.assertNotIn(reader, reactor._readers)
89
self.assertNotIn(writer, reactor._writers)
93
class TCPPortTests(TestCase):
95
Tests for L{twisted.internet.tcp.Port}.
98
if not isinstance(reactor, PosixReactorBase):
99
skip = "Non-posixbase reactor"
101
def test_connectionLostFailed(self):
103
L{Port.stopListening} returns a L{Deferred} which errbacks if
104
L{Port.connectionLost} raises an exception.
106
port = Port(12345, ServerFactory())
107
port.connected = True
108
port.connectionLost = lambda reason: 1 / 0
109
return self.assertFailure(port.stopListening(), ZeroDivisionError)