Initial import to Tizen
[profile/ivi/python-twisted.git] / twisted / test / test_epoll.py
1 # Copyright (c) Twisted Matrix Laboratories.
2 # See LICENSE for details.
3
4 """
5 Tests for epoll wrapper.
6 """
7
8 import socket, errno, time
9
10 from twisted.trial import unittest
11 from twisted.python.util import untilConcludes
12
13 try:
14     from twisted.python import _epoll
15 except ImportError:
16     _epoll = None
17
18
19 class EPoll(unittest.TestCase):
20     """
21     Tests for the low-level epoll bindings.
22     """
23     def setUp(self):
24         """
25         Create a listening server port and a list with which to keep track
26         of created sockets.
27         """
28         self.serverSocket = socket.socket()
29         self.serverSocket.bind(('127.0.0.1', 0))
30         self.serverSocket.listen(1)
31         self.connections = [self.serverSocket]
32
33
34     def tearDown(self):
35         """
36         Close any sockets which were opened by the test.
37         """
38         for skt in self.connections:
39             skt.close()
40
41
42     def _connectedPair(self):
43         """
44         Return the two sockets which make up a new TCP connection.
45         """
46         client = socket.socket()
47         client.setblocking(False)
48         try:
49             client.connect(('127.0.0.1', self.serverSocket.getsockname()[1]))
50         except socket.error, e:
51             self.assertEqual(e.args[0], errno.EINPROGRESS)
52         else:
53             raise unittest.FailTest("Connect should have raised EINPROGRESS")
54         server, addr = self.serverSocket.accept()
55
56         self.connections.extend((client, server))
57         return client, server
58
59
60     def test_create(self):
61         """
62         Test the creation of an epoll object.
63         """
64         try:
65             p = _epoll.epoll(16)
66         except OSError, e:
67             raise unittest.FailTest(str(e))
68         else:
69             p.close()
70
71
72     def test_badCreate(self):
73         """
74         Test that attempting to create an epoll object with some random
75         objects raises a TypeError.
76         """
77         self.assertRaises(TypeError, _epoll.epoll, 1, 2, 3)
78         self.assertRaises(TypeError, _epoll.epoll, 'foo')
79         self.assertRaises(TypeError, _epoll.epoll, None)
80         self.assertRaises(TypeError, _epoll.epoll, ())
81         self.assertRaises(TypeError, _epoll.epoll, ['foo'])
82         self.assertRaises(TypeError, _epoll.epoll, {})
83
84
85     def test_add(self):
86         """
87         Test adding a socket to an epoll object.
88         """
89         server, client = self._connectedPair()
90
91         p = _epoll.epoll(2)
92         try:
93             p._control(_epoll.CTL_ADD, server.fileno(), _epoll.IN | _epoll.OUT)
94             p._control(_epoll.CTL_ADD, client.fileno(), _epoll.IN | _epoll.OUT)
95         finally:
96             p.close()
97
98
99     def test_controlAndWait(self):
100         """
101         Test waiting on an epoll object which has had some sockets added to
102         it.
103         """
104         client, server = self._connectedPair()
105
106         p = _epoll.epoll(16)
107         p._control(_epoll.CTL_ADD, client.fileno(), _epoll.IN | _epoll.OUT |
108                    _epoll.ET)
109         p._control(_epoll.CTL_ADD, server.fileno(), _epoll.IN | _epoll.OUT |
110                    _epoll.ET)
111
112         now = time.time()
113         events = untilConcludes(p.wait, 4, 1000)
114         then = time.time()
115         self.failIf(then - now > 0.01)
116
117         events.sort()
118         expected = [(client.fileno(), _epoll.OUT),
119                     (server.fileno(), _epoll.OUT)]
120         expected.sort()
121
122         self.assertEqual(events, expected)
123
124         now = time.time()
125         events = untilConcludes(p.wait, 4, 200)
126         then = time.time()
127         self.failUnless(then - now > 0.1)
128         self.failIf(events)
129
130         client.send("Hello!")
131         server.send("world!!!")
132
133         now = time.time()
134         events = untilConcludes(p.wait, 4, 1000)
135         then = time.time()
136         self.failIf(then - now > 0.01)
137
138         events.sort()
139         expected = [(client.fileno(), _epoll.IN | _epoll.OUT),
140                     (server.fileno(), _epoll.IN | _epoll.OUT)]
141         expected.sort()
142
143         self.assertEqual(events, expected)
144
145 if _epoll is None:
146     EPoll.skip = "_epoll module unavailable"
147 else:
148     try:
149         e = _epoll.epoll(16)
150     except IOError, exc:
151         if exc.errno == errno.ENOSYS:
152             del exc
153             EPoll.skip = "epoll support missing from platform"
154         else:
155             raise
156     else:
157         e.close()
158         del e