1
# Copyright (c) 2001-2006 Twisted Matrix Laboratories.
2
# See LICENSE for details.
5
Tests for epoll wrapper.
8
import socket, errno, time
10
from twisted.trial import unittest
13
from twisted.python import _epoll
18
class EPoll(unittest.TestCase):
20
Tests for the low-level epoll bindings.
24
Create a listening server port and a list with which to keep track
27
self.serverSocket = socket.socket()
28
self.serverSocket.bind(('127.0.0.1', 0))
29
self.serverSocket.listen(1)
30
self.connections = [self.serverSocket]
35
Close any sockets which were opened by the test.
37
for skt in self.connections:
41
def _connectedPair(self):
43
Return the two sockets which make up a new TCP connection.
45
client = socket.socket()
46
client.setblocking(False)
48
client.connect(('127.0.0.1', self.serverSocket.getsockname()[1]))
49
except socket.error, e:
50
self.assertEquals(e.args[0], errno.EINPROGRESS)
52
raise unittest.FailTest("Connect should have raised EINPROGRESS")
53
server, addr = self.serverSocket.accept()
55
self.connections.extend((client, server))
59
def test_create(self):
61
Test the creation of an epoll object.
66
raise unittest.FailTest(str(e))
71
def test_badCreate(self):
73
Test that attempting to create an epoll object with some random
74
objects raises a TypeError.
76
self.assertRaises(TypeError, _epoll.epoll, 1, 2, 3)
77
self.assertRaises(TypeError, _epoll.epoll, 'foo')
78
self.assertRaises(TypeError, _epoll.epoll, None)
79
self.assertRaises(TypeError, _epoll.epoll, ())
80
self.assertRaises(TypeError, _epoll.epoll, ['foo'])
81
self.assertRaises(TypeError, _epoll.epoll, {})
82
self.assertRaises(TypeError, _epoll.epoll)
87
Test adding a socket to an epoll object.
89
server, client = self._connectedPair()
93
p._control(_epoll.CTL_ADD, server.fileno(), _epoll.IN | _epoll.OUT)
94
p._control(_epoll.CTL_ADD, client.fileno(), _epoll.IN | _epoll.OUT)
99
def test_controlAndWait(self):
101
Test waiting on an epoll object which has had some sockets added to
104
client, server = self._connectedPair()
107
p._control(_epoll.CTL_ADD, client.fileno(), _epoll.IN | _epoll.OUT |
109
p._control(_epoll.CTL_ADD, server.fileno(), _epoll.IN | _epoll.OUT |
113
events = p.wait(4, 1000)
115
self.failIf(then - now > 0.01)
118
expected = [(client.fileno(), _epoll.OUT),
119
(server.fileno(), _epoll.OUT)]
122
self.assertEquals(events, expected)
125
events = p.wait(4, 200)
127
self.failUnless(then - now > 0.1)
130
client.send("Hello!")
131
server.send("world!!!")
134
events = p.wait(4, 1000)
136
self.failIf(then - now > 0.01)
139
expected = [(client.fileno(), _epoll.IN | _epoll.OUT),
140
(server.fileno(), _epoll.IN | _epoll.OUT)]
143
self.assertEquals(events, expected)
146
EPoll.skip = "_epoll module unavailable"
151
if exc.errno == errno.ENOSYS:
153
EPoll.skip = "epoll support missing from platform"