blob: 77e72e570512029c8f807dd4f68fe9364c5d3276 [file] [log] [blame]
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001"""Tests for selector_events.py"""
2
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07003import errno
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07004import socket
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07005import unittest
Victor Stinner24ba2032014-02-26 10:25:02 +01006from unittest import mock
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07007try:
8 import ssl
9except ImportError:
10 ssl = None
11
Victor Stinner8dffc452014-01-25 15:32:06 +010012import asyncio
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070013from asyncio import selectors
14from asyncio import test_utils
Victor Stinner128ee222014-01-25 22:22:18 +010015from asyncio.selector_events import BaseSelectorEventLoop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070016from asyncio.selector_events import _SelectorTransport
17from asyncio.selector_events import _SelectorSslTransport
18from asyncio.selector_events import _SelectorSocketTransport
19from asyncio.selector_events import _SelectorDatagramTransport
20
21
Victor Stinner24ba2032014-02-26 10:25:02 +010022MOCK_ANY = mock.ANY
Yury Selivanovff827f02014-02-18 18:02:19 -050023
24
Victor Stinner128ee222014-01-25 22:22:18 +010025class TestBaseSelectorEventLoop(BaseSelectorEventLoop):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070026
Victor Stinner33cb0392015-01-15 13:17:34 +010027 def close(self):
28 # Don't call the close() method of the parent class, because the
29 # selector is mocked
30 self._closed = True
31
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070032 def _make_self_pipe(self):
Victor Stinner24ba2032014-02-26 10:25:02 +010033 self._ssock = mock.Mock()
34 self._csock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070035 self._internal_fds += 1
36
37
Guido van Rossuma5062c52013-11-27 14:12:48 -080038def list_to_buffer(l=()):
39 return bytearray().join(l)
40
41
Victor Stinner02392c92015-01-15 13:18:32 +010042def close_transport(transport):
43 # Don't call transport.close() because the event loop and the selector
44 # are mocked
45 if transport._sock is None:
46 return
47 transport._sock.close()
48 transport._sock = None
49
50
Victor Stinnerc73701d2014-06-18 01:36:32 +020051class BaseSelectorEventLoopTests(test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070052
53 def setUp(self):
Victor Stinnerd5aeccf92014-08-31 15:07:57 +020054 self.selector = mock.Mock()
55 self.selector.select.return_value = []
56 self.loop = TestBaseSelectorEventLoop(self.selector)
Victor Stinner33cb0392015-01-15 13:17:34 +010057 self.set_event_loop(self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070058
59 def test_make_socket_transport(self):
Victor Stinner24ba2032014-02-26 10:25:02 +010060 m = mock.Mock()
61 self.loop.add_reader = mock.Mock()
Victor Stinnerfa737792015-01-29 00:36:51 +010062 self.loop.add_reader._is_coroutine = False
Victor Stinnera1254972014-02-11 11:34:30 +010063 transport = self.loop._make_socket_transport(m, asyncio.Protocol())
64 self.assertIsInstance(transport, _SelectorSocketTransport)
Victor Stinner79fd9622015-03-27 15:20:08 +010065
66 # Calling repr() must not fail when the event loop is closed
67 self.loop.close()
68 repr(transport)
69
Victor Stinner02392c92015-01-15 13:18:32 +010070 close_transport(transport)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070071
Guido van Rossum28dff0d2013-11-01 14:22:30 -070072 @unittest.skipIf(ssl is None, 'No ssl module')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070073 def test_make_ssl_transport(self):
Victor Stinner24ba2032014-02-26 10:25:02 +010074 m = mock.Mock()
75 self.loop.add_reader = mock.Mock()
Victor Stinnerfa737792015-01-29 00:36:51 +010076 self.loop.add_reader._is_coroutine = False
Victor Stinner24ba2032014-02-26 10:25:02 +010077 self.loop.add_writer = mock.Mock()
78 self.loop.remove_reader = mock.Mock()
79 self.loop.remove_writer = mock.Mock()
Victor Stinnera1254972014-02-11 11:34:30 +010080 waiter = asyncio.Future(loop=self.loop)
Victor Stinnerb2614752014-08-25 23:20:52 +020081 with test_utils.disable_logger():
82 transport = self.loop._make_ssl_transport(
83 m, asyncio.Protocol(), m, waiter)
Victor Stinner02392c92015-01-15 13:18:32 +010084 # execute the handshake while the logger is disabled
85 # to ignore SSL handshake failure
86 test_utils.run_briefly(self.loop)
87
Victor Stinner231b4042015-01-14 00:19:09 +010088 # Sanity check
89 class_name = transport.__class__.__name__
90 self.assertIn("ssl", class_name.lower())
91 self.assertIn("transport", class_name.lower())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070092
Victor Stinner02392c92015-01-15 13:18:32 +010093 transport.close()
94 # execute pending callbacks to close the socket transport
95 test_utils.run_briefly(self.loop)
96
Victor Stinner24ba2032014-02-26 10:25:02 +010097 @mock.patch('asyncio.selector_events.ssl', None)
Victor Stinner231b4042015-01-14 00:19:09 +010098 @mock.patch('asyncio.sslproto.ssl', None)
Guido van Rossum28dff0d2013-11-01 14:22:30 -070099 def test_make_ssl_transport_without_ssl_error(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100100 m = mock.Mock()
101 self.loop.add_reader = mock.Mock()
102 self.loop.add_writer = mock.Mock()
103 self.loop.remove_reader = mock.Mock()
104 self.loop.remove_writer = mock.Mock()
Guido van Rossum28dff0d2013-11-01 14:22:30 -0700105 with self.assertRaises(RuntimeError):
106 self.loop._make_ssl_transport(m, m, m, m)
107
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700108 def test_close(self):
Victor Stinner33cb0392015-01-15 13:17:34 +0100109 class EventLoop(BaseSelectorEventLoop):
110 def _make_self_pipe(self):
111 self._ssock = mock.Mock()
112 self._csock = mock.Mock()
113 self._internal_fds += 1
114
115 self.loop = EventLoop(self.selector)
116 self.set_event_loop(self.loop)
117
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700118 ssock = self.loop._ssock
119 ssock.fileno.return_value = 7
120 csock = self.loop._csock
121 csock.fileno.return_value = 1
Victor Stinner24ba2032014-02-26 10:25:02 +0100122 remove_reader = self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700123
124 self.loop._selector.close()
Victor Stinner24ba2032014-02-26 10:25:02 +0100125 self.loop._selector = selector = mock.Mock()
Victor Stinnerbb2fc5b2014-06-10 10:23:10 +0200126 self.assertFalse(self.loop.is_closed())
127
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700128 self.loop.close()
Victor Stinnerbb2fc5b2014-06-10 10:23:10 +0200129 self.assertTrue(self.loop.is_closed())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700130 self.assertIsNone(self.loop._selector)
131 self.assertIsNone(self.loop._csock)
132 self.assertIsNone(self.loop._ssock)
133 selector.close.assert_called_with()
134 ssock.close.assert_called_with()
135 csock.close.assert_called_with()
136 remove_reader.assert_called_with(7)
137
Victor Stinnerbb2fc5b2014-06-10 10:23:10 +0200138 # it should be possible to call close() more than once
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700139 self.loop.close()
140 self.loop.close()
141
Victor Stinnerbb2fc5b2014-06-10 10:23:10 +0200142 # operation blocked when the loop is closed
143 f = asyncio.Future(loop=self.loop)
144 self.assertRaises(RuntimeError, self.loop.run_forever)
145 self.assertRaises(RuntimeError, self.loop.run_until_complete, f)
146 fd = 0
147 def callback():
148 pass
149 self.assertRaises(RuntimeError, self.loop.add_reader, fd, callback)
150 self.assertRaises(RuntimeError, self.loop.add_writer, fd, callback)
151
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700152 def test_close_no_selector(self):
Victor Stinner64d750b2014-06-18 03:25:23 +0200153 self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700154 self.loop._selector.close()
155 self.loop._selector = None
156 self.loop.close()
157 self.assertIsNone(self.loop._selector)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700158
159 def test_socketpair(self):
160 self.assertRaises(NotImplementedError, self.loop._socketpair)
161
162 def test_read_from_self_tryagain(self):
163 self.loop._ssock.recv.side_effect = BlockingIOError
164 self.assertIsNone(self.loop._read_from_self())
165
166 def test_read_from_self_exception(self):
167 self.loop._ssock.recv.side_effect = OSError
168 self.assertRaises(OSError, self.loop._read_from_self)
169
170 def test_write_to_self_tryagain(self):
171 self.loop._csock.send.side_effect = BlockingIOError
Victor Stinnerb2614752014-08-25 23:20:52 +0200172 with test_utils.disable_logger():
173 self.assertIsNone(self.loop._write_to_self())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700174
175 def test_write_to_self_exception(self):
Guido van Rossum3d139d82014-05-06 14:42:40 -0700176 # _write_to_self() swallows OSError
177 self.loop._csock.send.side_effect = RuntimeError()
178 self.assertRaises(RuntimeError, self.loop._write_to_self)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700179
180 def test_sock_recv(self):
Victor Stinnerb2614752014-08-25 23:20:52 +0200181 sock = test_utils.mock_nonblocking_socket()
Victor Stinner24ba2032014-02-26 10:25:02 +0100182 self.loop._sock_recv = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700183
184 f = self.loop.sock_recv(sock, 1024)
Victor Stinner8dffc452014-01-25 15:32:06 +0100185 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700186 self.loop._sock_recv.assert_called_with(f, False, sock, 1024)
187
188 def test__sock_recv_canceled_fut(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100189 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700190
Victor Stinner8dffc452014-01-25 15:32:06 +0100191 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700192 f.cancel()
193
194 self.loop._sock_recv(f, False, sock, 1024)
195 self.assertFalse(sock.recv.called)
196
197 def test__sock_recv_unregister(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100198 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700199 sock.fileno.return_value = 10
200
Victor Stinner8dffc452014-01-25 15:32:06 +0100201 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700202 f.cancel()
203
Victor Stinner24ba2032014-02-26 10:25:02 +0100204 self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700205 self.loop._sock_recv(f, True, sock, 1024)
206 self.assertEqual((10,), self.loop.remove_reader.call_args[0])
207
208 def test__sock_recv_tryagain(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100209 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100210 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700211 sock.fileno.return_value = 10
212 sock.recv.side_effect = BlockingIOError
213
Victor Stinner24ba2032014-02-26 10:25:02 +0100214 self.loop.add_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700215 self.loop._sock_recv(f, False, sock, 1024)
216 self.assertEqual((10, self.loop._sock_recv, f, True, sock, 1024),
217 self.loop.add_reader.call_args[0])
218
219 def test__sock_recv_exception(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100220 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100221 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700222 sock.fileno.return_value = 10
223 err = sock.recv.side_effect = OSError()
224
225 self.loop._sock_recv(f, False, sock, 1024)
226 self.assertIs(err, f.exception())
227
228 def test_sock_sendall(self):
Victor Stinnerb2614752014-08-25 23:20:52 +0200229 sock = test_utils.mock_nonblocking_socket()
Victor Stinner24ba2032014-02-26 10:25:02 +0100230 self.loop._sock_sendall = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700231
232 f = self.loop.sock_sendall(sock, b'data')
Victor Stinner8dffc452014-01-25 15:32:06 +0100233 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700234 self.assertEqual(
235 (f, False, sock, b'data'),
236 self.loop._sock_sendall.call_args[0])
237
238 def test_sock_sendall_nodata(self):
Victor Stinnerb2614752014-08-25 23:20:52 +0200239 sock = test_utils.mock_nonblocking_socket()
Victor Stinner24ba2032014-02-26 10:25:02 +0100240 self.loop._sock_sendall = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700241
242 f = self.loop.sock_sendall(sock, b'')
Victor Stinner8dffc452014-01-25 15:32:06 +0100243 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700244 self.assertTrue(f.done())
245 self.assertIsNone(f.result())
246 self.assertFalse(self.loop._sock_sendall.called)
247
248 def test__sock_sendall_canceled_fut(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100249 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700250
Victor Stinner8dffc452014-01-25 15:32:06 +0100251 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700252 f.cancel()
253
254 self.loop._sock_sendall(f, False, sock, b'data')
255 self.assertFalse(sock.send.called)
256
257 def test__sock_sendall_unregister(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100258 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700259 sock.fileno.return_value = 10
260
Victor Stinner8dffc452014-01-25 15:32:06 +0100261 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700262 f.cancel()
263
Victor Stinner24ba2032014-02-26 10:25:02 +0100264 self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700265 self.loop._sock_sendall(f, True, sock, b'data')
266 self.assertEqual((10,), self.loop.remove_writer.call_args[0])
267
268 def test__sock_sendall_tryagain(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100269 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100270 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700271 sock.fileno.return_value = 10
272 sock.send.side_effect = BlockingIOError
273
Victor Stinner24ba2032014-02-26 10:25:02 +0100274 self.loop.add_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700275 self.loop._sock_sendall(f, False, sock, b'data')
276 self.assertEqual(
277 (10, self.loop._sock_sendall, f, True, sock, b'data'),
278 self.loop.add_writer.call_args[0])
279
280 def test__sock_sendall_interrupted(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100281 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100282 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700283 sock.fileno.return_value = 10
284 sock.send.side_effect = InterruptedError
285
Victor Stinner24ba2032014-02-26 10:25:02 +0100286 self.loop.add_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700287 self.loop._sock_sendall(f, False, sock, b'data')
288 self.assertEqual(
289 (10, self.loop._sock_sendall, f, True, sock, b'data'),
290 self.loop.add_writer.call_args[0])
291
292 def test__sock_sendall_exception(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100293 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100294 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700295 sock.fileno.return_value = 10
296 err = sock.send.side_effect = OSError()
297
298 self.loop._sock_sendall(f, False, sock, b'data')
299 self.assertIs(f.exception(), err)
300
301 def test__sock_sendall(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100302 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700303
Victor Stinner8dffc452014-01-25 15:32:06 +0100304 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700305 sock.fileno.return_value = 10
306 sock.send.return_value = 4
307
308 self.loop._sock_sendall(f, False, sock, b'data')
309 self.assertTrue(f.done())
310 self.assertIsNone(f.result())
311
312 def test__sock_sendall_partial(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100313 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700314
Victor Stinner8dffc452014-01-25 15:32:06 +0100315 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700316 sock.fileno.return_value = 10
317 sock.send.return_value = 2
318
Victor Stinner24ba2032014-02-26 10:25:02 +0100319 self.loop.add_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700320 self.loop._sock_sendall(f, False, sock, b'data')
321 self.assertFalse(f.done())
322 self.assertEqual(
323 (10, self.loop._sock_sendall, f, True, sock, b'ta'),
324 self.loop.add_writer.call_args[0])
325
326 def test__sock_sendall_none(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100327 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700328
Victor Stinner8dffc452014-01-25 15:32:06 +0100329 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700330 sock.fileno.return_value = 10
331 sock.send.return_value = 0
332
Victor Stinner24ba2032014-02-26 10:25:02 +0100333 self.loop.add_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700334 self.loop._sock_sendall(f, False, sock, b'data')
335 self.assertFalse(f.done())
336 self.assertEqual(
337 (10, self.loop._sock_sendall, f, True, sock, b'data'),
338 self.loop.add_writer.call_args[0])
339
340 def test_sock_connect(self):
Victor Stinnerb2614752014-08-25 23:20:52 +0200341 sock = test_utils.mock_nonblocking_socket()
Victor Stinner24ba2032014-02-26 10:25:02 +0100342 self.loop._sock_connect = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700343
344 f = self.loop.sock_connect(sock, ('127.0.0.1', 8080))
Victor Stinner8dffc452014-01-25 15:32:06 +0100345 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700346 self.assertEqual(
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200347 (f, sock, ('127.0.0.1', 8080)),
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700348 self.loop._sock_connect.call_args[0])
349
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200350 def test_sock_connect_timeout(self):
Victor Stinnere6ecea52015-07-09 23:13:50 +0200351 # asyncio issue #205: sock_connect() must unregister the socket on
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200352 # timeout error
353
354 # prepare mocks
355 self.loop.add_writer = mock.Mock()
356 self.loop.remove_writer = mock.Mock()
357 sock = test_utils.mock_nonblocking_socket()
358 sock.connect.side_effect = BlockingIOError
359
360 # first call to sock_connect() registers the socket
361 fut = self.loop.sock_connect(sock, ('127.0.0.1', 80))
362 self.assertTrue(sock.connect.called)
363 self.assertTrue(self.loop.add_writer.called)
364 self.assertEqual(len(fut._callbacks), 1)
365
366 # on timeout, the socket must be unregistered
367 sock.connect.reset_mock()
368 fut.set_exception(asyncio.TimeoutError)
369 with self.assertRaises(asyncio.TimeoutError):
370 self.loop.run_until_complete(fut)
371 self.assertTrue(self.loop.remove_writer.called)
372
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700373 def test__sock_connect(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100374 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700375
Victor Stinner24ba2032014-02-26 10:25:02 +0100376 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700377 sock.fileno.return_value = 10
378
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200379 self.loop._sock_connect(f, sock, ('127.0.0.1', 8080))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700380 self.assertTrue(f.done())
381 self.assertIsNone(f.result())
382 self.assertTrue(sock.connect.called)
383
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200384 def test__sock_connect_cb_cancelled_fut(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100385 sock = mock.Mock()
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200386 self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700387
Victor Stinner8dffc452014-01-25 15:32:06 +0100388 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700389 f.cancel()
390
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200391 self.loop._sock_connect_cb(f, sock, ('127.0.0.1', 8080))
392 self.assertFalse(sock.getsockopt.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700393
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200394 def test__sock_connect_writer(self):
395 # check that the fd is registered and then unregistered
396 self.loop._process_events = mock.Mock()
397 self.loop.add_writer = mock.Mock()
398 self.loop.remove_writer = mock.Mock()
399
Victor Stinner24ba2032014-02-26 10:25:02 +0100400 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700401 sock.fileno.return_value = 10
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200402 sock.connect.side_effect = BlockingIOError
403 sock.getsockopt.return_value = 0
404 address = ('127.0.0.1', 8080)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700405
Victor Stinner8dffc452014-01-25 15:32:06 +0100406 f = asyncio.Future(loop=self.loop)
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200407 self.loop._sock_connect(f, sock, address)
408 self.assertTrue(self.loop.add_writer.called)
409 self.assertEqual(10, self.loop.add_writer.call_args[0][0])
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700410
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200411 self.loop._sock_connect_cb(f, sock, address)
412 # need to run the event loop to execute _sock_connect_done() callback
413 self.loop.run_until_complete(f)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700414 self.assertEqual((10,), self.loop.remove_writer.call_args[0])
415
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200416 def test__sock_connect_cb_tryagain(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100417 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100418 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700419 sock.fileno.return_value = 10
420 sock.getsockopt.return_value = errno.EAGAIN
421
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200422 # check that the exception is handled
423 self.loop._sock_connect_cb(f, sock, ('127.0.0.1', 8080))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700424
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200425 def test__sock_connect_cb_exception(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100426 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100427 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700428 sock.fileno.return_value = 10
429 sock.getsockopt.return_value = errno.ENOTCONN
430
Victor Stinner24ba2032014-02-26 10:25:02 +0100431 self.loop.remove_writer = mock.Mock()
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200432 self.loop._sock_connect_cb(f, sock, ('127.0.0.1', 8080))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700433 self.assertIsInstance(f.exception(), OSError)
434
435 def test_sock_accept(self):
Victor Stinnerb2614752014-08-25 23:20:52 +0200436 sock = test_utils.mock_nonblocking_socket()
Victor Stinner24ba2032014-02-26 10:25:02 +0100437 self.loop._sock_accept = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700438
439 f = self.loop.sock_accept(sock)
Victor Stinner8dffc452014-01-25 15:32:06 +0100440 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700441 self.assertEqual(
442 (f, False, sock), self.loop._sock_accept.call_args[0])
443
444 def test__sock_accept(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100445 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700446
Victor Stinner24ba2032014-02-26 10:25:02 +0100447 conn = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700448
Victor Stinner24ba2032014-02-26 10:25:02 +0100449 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700450 sock.fileno.return_value = 10
451 sock.accept.return_value = conn, ('127.0.0.1', 1000)
452
453 self.loop._sock_accept(f, False, sock)
454 self.assertTrue(f.done())
455 self.assertEqual((conn, ('127.0.0.1', 1000)), f.result())
456 self.assertEqual((False,), conn.setblocking.call_args[0])
457
458 def test__sock_accept_canceled_fut(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100459 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700460
Victor Stinner8dffc452014-01-25 15:32:06 +0100461 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700462 f.cancel()
463
464 self.loop._sock_accept(f, False, sock)
465 self.assertFalse(sock.accept.called)
466
467 def test__sock_accept_unregister(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100468 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700469 sock.fileno.return_value = 10
470
Victor Stinner8dffc452014-01-25 15:32:06 +0100471 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700472 f.cancel()
473
Victor Stinner24ba2032014-02-26 10:25:02 +0100474 self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700475 self.loop._sock_accept(f, True, sock)
476 self.assertEqual((10,), self.loop.remove_reader.call_args[0])
477
478 def test__sock_accept_tryagain(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100479 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100480 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700481 sock.fileno.return_value = 10
482 sock.accept.side_effect = BlockingIOError
483
Victor Stinner24ba2032014-02-26 10:25:02 +0100484 self.loop.add_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700485 self.loop._sock_accept(f, False, sock)
486 self.assertEqual(
487 (10, self.loop._sock_accept, f, True, sock),
488 self.loop.add_reader.call_args[0])
489
490 def test__sock_accept_exception(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100491 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100492 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700493 sock.fileno.return_value = 10
494 err = sock.accept.side_effect = OSError()
495
496 self.loop._sock_accept(f, False, sock)
497 self.assertIs(err, f.exception())
498
499 def test_add_reader(self):
500 self.loop._selector.get_key.side_effect = KeyError
501 cb = lambda: True
502 self.loop.add_reader(1, cb)
503
504 self.assertTrue(self.loop._selector.register.called)
505 fd, mask, (r, w) = self.loop._selector.register.call_args[0]
506 self.assertEqual(1, fd)
507 self.assertEqual(selectors.EVENT_READ, mask)
508 self.assertEqual(cb, r._callback)
509 self.assertIsNone(w)
510
511 def test_add_reader_existing(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100512 reader = mock.Mock()
513 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700514 self.loop._selector.get_key.return_value = selectors.SelectorKey(
515 1, 1, selectors.EVENT_WRITE, (reader, writer))
516 cb = lambda: True
517 self.loop.add_reader(1, cb)
518
519 self.assertTrue(reader.cancel.called)
520 self.assertFalse(self.loop._selector.register.called)
521 self.assertTrue(self.loop._selector.modify.called)
522 fd, mask, (r, w) = self.loop._selector.modify.call_args[0]
523 self.assertEqual(1, fd)
524 self.assertEqual(selectors.EVENT_WRITE | selectors.EVENT_READ, mask)
525 self.assertEqual(cb, r._callback)
526 self.assertEqual(writer, w)
527
528 def test_add_reader_existing_writer(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100529 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700530 self.loop._selector.get_key.return_value = selectors.SelectorKey(
531 1, 1, selectors.EVENT_WRITE, (None, writer))
532 cb = lambda: True
533 self.loop.add_reader(1, cb)
534
535 self.assertFalse(self.loop._selector.register.called)
536 self.assertTrue(self.loop._selector.modify.called)
537 fd, mask, (r, w) = self.loop._selector.modify.call_args[0]
538 self.assertEqual(1, fd)
539 self.assertEqual(selectors.EVENT_WRITE | selectors.EVENT_READ, mask)
540 self.assertEqual(cb, r._callback)
541 self.assertEqual(writer, w)
542
543 def test_remove_reader(self):
544 self.loop._selector.get_key.return_value = selectors.SelectorKey(
545 1, 1, selectors.EVENT_READ, (None, None))
546 self.assertFalse(self.loop.remove_reader(1))
547
548 self.assertTrue(self.loop._selector.unregister.called)
549
550 def test_remove_reader_read_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100551 reader = mock.Mock()
552 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700553 self.loop._selector.get_key.return_value = selectors.SelectorKey(
554 1, 1, selectors.EVENT_READ | selectors.EVENT_WRITE,
555 (reader, writer))
556 self.assertTrue(
557 self.loop.remove_reader(1))
558
559 self.assertFalse(self.loop._selector.unregister.called)
560 self.assertEqual(
561 (1, selectors.EVENT_WRITE, (None, writer)),
562 self.loop._selector.modify.call_args[0])
563
564 def test_remove_reader_unknown(self):
565 self.loop._selector.get_key.side_effect = KeyError
566 self.assertFalse(
567 self.loop.remove_reader(1))
568
569 def test_add_writer(self):
570 self.loop._selector.get_key.side_effect = KeyError
571 cb = lambda: True
572 self.loop.add_writer(1, cb)
573
574 self.assertTrue(self.loop._selector.register.called)
575 fd, mask, (r, w) = self.loop._selector.register.call_args[0]
576 self.assertEqual(1, fd)
577 self.assertEqual(selectors.EVENT_WRITE, mask)
578 self.assertIsNone(r)
579 self.assertEqual(cb, w._callback)
580
581 def test_add_writer_existing(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100582 reader = mock.Mock()
583 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700584 self.loop._selector.get_key.return_value = selectors.SelectorKey(
585 1, 1, selectors.EVENT_READ, (reader, writer))
586 cb = lambda: True
587 self.loop.add_writer(1, cb)
588
589 self.assertTrue(writer.cancel.called)
590 self.assertFalse(self.loop._selector.register.called)
591 self.assertTrue(self.loop._selector.modify.called)
592 fd, mask, (r, w) = self.loop._selector.modify.call_args[0]
593 self.assertEqual(1, fd)
594 self.assertEqual(selectors.EVENT_WRITE | selectors.EVENT_READ, mask)
595 self.assertEqual(reader, r)
596 self.assertEqual(cb, w._callback)
597
598 def test_remove_writer(self):
599 self.loop._selector.get_key.return_value = selectors.SelectorKey(
600 1, 1, selectors.EVENT_WRITE, (None, None))
601 self.assertFalse(self.loop.remove_writer(1))
602
603 self.assertTrue(self.loop._selector.unregister.called)
604
605 def test_remove_writer_read_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100606 reader = mock.Mock()
607 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700608 self.loop._selector.get_key.return_value = selectors.SelectorKey(
609 1, 1, selectors.EVENT_READ | selectors.EVENT_WRITE,
610 (reader, writer))
611 self.assertTrue(
612 self.loop.remove_writer(1))
613
614 self.assertFalse(self.loop._selector.unregister.called)
615 self.assertEqual(
616 (1, selectors.EVENT_READ, (reader, None)),
617 self.loop._selector.modify.call_args[0])
618
619 def test_remove_writer_unknown(self):
620 self.loop._selector.get_key.side_effect = KeyError
621 self.assertFalse(
622 self.loop.remove_writer(1))
623
624 def test_process_events_read(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100625 reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700626 reader._cancelled = False
627
Victor Stinner24ba2032014-02-26 10:25:02 +0100628 self.loop._add_callback = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700629 self.loop._process_events(
630 [(selectors.SelectorKey(
631 1, 1, selectors.EVENT_READ, (reader, None)),
632 selectors.EVENT_READ)])
633 self.assertTrue(self.loop._add_callback.called)
634 self.loop._add_callback.assert_called_with(reader)
635
636 def test_process_events_read_cancelled(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100637 reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700638 reader.cancelled = True
639
Victor Stinner24ba2032014-02-26 10:25:02 +0100640 self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700641 self.loop._process_events(
642 [(selectors.SelectorKey(
643 1, 1, selectors.EVENT_READ, (reader, None)),
644 selectors.EVENT_READ)])
645 self.loop.remove_reader.assert_called_with(1)
646
647 def test_process_events_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100648 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700649 writer._cancelled = False
650
Victor Stinner24ba2032014-02-26 10:25:02 +0100651 self.loop._add_callback = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700652 self.loop._process_events(
653 [(selectors.SelectorKey(1, 1, selectors.EVENT_WRITE,
654 (None, writer)),
655 selectors.EVENT_WRITE)])
656 self.loop._add_callback.assert_called_with(writer)
657
658 def test_process_events_write_cancelled(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100659 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700660 writer.cancelled = True
Victor Stinner24ba2032014-02-26 10:25:02 +0100661 self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700662
663 self.loop._process_events(
664 [(selectors.SelectorKey(1, 1, selectors.EVENT_WRITE,
665 (None, writer)),
666 selectors.EVENT_WRITE)])
667 self.loop.remove_writer.assert_called_with(1)
668
669
Victor Stinnerc73701d2014-06-18 01:36:32 +0200670class SelectorTransportTests(test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700671
672 def setUp(self):
Victor Stinnerc73701d2014-06-18 01:36:32 +0200673 self.loop = self.new_test_loop()
Victor Stinner8dffc452014-01-25 15:32:06 +0100674 self.protocol = test_utils.make_test_protocol(asyncio.Protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100675 self.sock = mock.Mock(socket.socket)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700676 self.sock.fileno.return_value = 7
677
Victor Stinner02392c92015-01-15 13:18:32 +0100678 def create_transport(self):
679 transport = _SelectorTransport(self.loop, self.sock, self.protocol,
680 None)
681 self.addCleanup(close_transport, transport)
682 return transport
683
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700684 def test_ctor(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100685 tr = self.create_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700686 self.assertIs(tr._loop, self.loop)
687 self.assertIs(tr._sock, self.sock)
688 self.assertIs(tr._sock_fd, 7)
689
690 def test_abort(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100691 tr = self.create_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100692 tr._force_close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700693
694 tr.abort()
695 tr._force_close.assert_called_with(None)
696
697 def test_close(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100698 tr = self.create_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700699 tr.close()
700
Yury Selivanov5bb1afb2015-11-16 12:43:21 -0500701 self.assertTrue(tr.is_closing())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700702 self.assertEqual(1, self.loop.remove_reader_count[7])
703 self.protocol.connection_lost(None)
704 self.assertEqual(tr._conn_lost, 1)
705
706 tr.close()
707 self.assertEqual(tr._conn_lost, 1)
708 self.assertEqual(1, self.loop.remove_reader_count[7])
709
710 def test_close_write_buffer(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100711 tr = self.create_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800712 tr._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700713 tr.close()
714
715 self.assertFalse(self.loop.readers)
716 test_utils.run_briefly(self.loop)
717 self.assertFalse(self.protocol.connection_lost.called)
718
719 def test_force_close(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100720 tr = self.create_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800721 tr._buffer.extend(b'1')
Victor Stinner24ba2032014-02-26 10:25:02 +0100722 self.loop.add_reader(7, mock.sentinel)
723 self.loop.add_writer(7, mock.sentinel)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700724 tr._force_close(None)
725
Yury Selivanov5bb1afb2015-11-16 12:43:21 -0500726 self.assertTrue(tr.is_closing())
Guido van Rossuma5062c52013-11-27 14:12:48 -0800727 self.assertEqual(tr._buffer, list_to_buffer())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700728 self.assertFalse(self.loop.readers)
729 self.assertFalse(self.loop.writers)
730
731 # second close should not remove reader
732 tr._force_close(None)
733 self.assertFalse(self.loop.readers)
734 self.assertEqual(1, self.loop.remove_reader_count[7])
735
Victor Stinner24ba2032014-02-26 10:25:02 +0100736 @mock.patch('asyncio.log.logger.error')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700737 def test_fatal_error(self, m_exc):
738 exc = OSError()
Victor Stinner02392c92015-01-15 13:18:32 +0100739 tr = self.create_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100740 tr._force_close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700741 tr._fatal_error(exc)
742
Yury Selivanovff827f02014-02-18 18:02:19 -0500743 m_exc.assert_called_with(
744 test_utils.MockPattern(
Victor Stinner065ca252014-02-19 01:40:41 +0100745 'Fatal error on transport\nprotocol:.*\ntransport:.*'),
Yury Selivanovff827f02014-02-18 18:02:19 -0500746 exc_info=(OSError, MOCK_ANY, MOCK_ANY))
747
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700748 tr._force_close.assert_called_with(exc)
749
750 def test_connection_lost(self):
751 exc = OSError()
Victor Stinner02392c92015-01-15 13:18:32 +0100752 tr = self.create_transport()
Victor Stinnerc4c46492014-07-23 18:21:45 +0200753 self.assertIsNotNone(tr._protocol)
754 self.assertIsNotNone(tr._loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700755 tr._call_connection_lost(exc)
756
757 self.protocol.connection_lost.assert_called_with(exc)
758 self.sock.close.assert_called_with()
759 self.assertIsNone(tr._sock)
760
761 self.assertIsNone(tr._protocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700762 self.assertIsNone(tr._loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700763
764
Victor Stinnerc73701d2014-06-18 01:36:32 +0200765class SelectorSocketTransportTests(test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700766
767 def setUp(self):
Victor Stinnerc73701d2014-06-18 01:36:32 +0200768 self.loop = self.new_test_loop()
Victor Stinner8dffc452014-01-25 15:32:06 +0100769 self.protocol = test_utils.make_test_protocol(asyncio.Protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100770 self.sock = mock.Mock(socket.socket)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700771 self.sock_fd = self.sock.fileno.return_value = 7
772
Victor Stinner02392c92015-01-15 13:18:32 +0100773 def socket_transport(self, waiter=None):
774 transport = _SelectorSocketTransport(self.loop, self.sock,
775 self.protocol, waiter=waiter)
776 self.addCleanup(close_transport, transport)
777 return transport
778
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700779 def test_ctor(self):
Victor Stinnerfa737792015-01-29 00:36:51 +0100780 waiter = asyncio.Future(loop=self.loop)
781 tr = self.socket_transport(waiter=waiter)
782 self.loop.run_until_complete(waiter)
783
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700784 self.loop.assert_reader(7, tr._read_ready)
785 test_utils.run_briefly(self.loop)
786 self.protocol.connection_made.assert_called_with(tr)
787
788 def test_ctor_with_waiter(self):
Victor Stinnerfa737792015-01-29 00:36:51 +0100789 waiter = asyncio.Future(loop=self.loop)
790 self.socket_transport(waiter=waiter)
791 self.loop.run_until_complete(waiter)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700792
Victor Stinnerfa737792015-01-29 00:36:51 +0100793 self.assertIsNone(waiter.result())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700794
Guido van Rossum57497ad2013-10-18 07:58:20 -0700795 def test_pause_resume_reading(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100796 tr = self.socket_transport()
Victor Stinnerfa737792015-01-29 00:36:51 +0100797 test_utils.run_briefly(self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700798 self.assertFalse(tr._paused)
799 self.loop.assert_reader(7, tr._read_ready)
Guido van Rossum57497ad2013-10-18 07:58:20 -0700800 tr.pause_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700801 self.assertTrue(tr._paused)
802 self.assertFalse(7 in self.loop.readers)
Guido van Rossum57497ad2013-10-18 07:58:20 -0700803 tr.resume_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700804 self.assertFalse(tr._paused)
805 self.loop.assert_reader(7, tr._read_ready)
Andrew Svetlov3207a032014-05-27 21:24:43 +0300806 with self.assertRaises(RuntimeError):
807 tr.resume_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700808
809 def test_read_ready(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100810 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700811
812 self.sock.recv.return_value = b'data'
813 transport._read_ready()
814
815 self.protocol.data_received.assert_called_with(b'data')
816
817 def test_read_ready_eof(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100818 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100819 transport.close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700820
821 self.sock.recv.return_value = b''
822 transport._read_ready()
823
824 self.protocol.eof_received.assert_called_with()
825 transport.close.assert_called_with()
826
827 def test_read_ready_eof_keep_open(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100828 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100829 transport.close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700830
831 self.sock.recv.return_value = b''
832 self.protocol.eof_received.return_value = True
833 transport._read_ready()
834
835 self.protocol.eof_received.assert_called_with()
836 self.assertFalse(transport.close.called)
837
Victor Stinner24ba2032014-02-26 10:25:02 +0100838 @mock.patch('logging.exception')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700839 def test_read_ready_tryagain(self, m_exc):
840 self.sock.recv.side_effect = BlockingIOError
841
Victor Stinner02392c92015-01-15 13:18:32 +0100842 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100843 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700844 transport._read_ready()
845
846 self.assertFalse(transport._fatal_error.called)
847
Victor Stinner24ba2032014-02-26 10:25:02 +0100848 @mock.patch('logging.exception')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700849 def test_read_ready_tryagain_interrupted(self, m_exc):
850 self.sock.recv.side_effect = InterruptedError
851
Victor Stinner02392c92015-01-15 13:18:32 +0100852 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100853 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700854 transport._read_ready()
855
856 self.assertFalse(transport._fatal_error.called)
857
Victor Stinner24ba2032014-02-26 10:25:02 +0100858 @mock.patch('logging.exception')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700859 def test_read_ready_conn_reset(self, m_exc):
860 err = self.sock.recv.side_effect = ConnectionResetError()
861
Victor Stinner02392c92015-01-15 13:18:32 +0100862 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100863 transport._force_close = mock.Mock()
Victor Stinnerb2614752014-08-25 23:20:52 +0200864 with test_utils.disable_logger():
865 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700866 transport._force_close.assert_called_with(err)
867
Victor Stinner24ba2032014-02-26 10:25:02 +0100868 @mock.patch('logging.exception')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700869 def test_read_ready_err(self, m_exc):
870 err = self.sock.recv.side_effect = OSError()
871
Victor Stinner02392c92015-01-15 13:18:32 +0100872 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100873 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700874 transport._read_ready()
875
Victor Stinner065ca252014-02-19 01:40:41 +0100876 transport._fatal_error.assert_called_with(
877 err,
878 'Fatal read error on socket transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700879
880 def test_write(self):
881 data = b'data'
882 self.sock.send.return_value = len(data)
883
Victor Stinner02392c92015-01-15 13:18:32 +0100884 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700885 transport.write(data)
886 self.sock.send.assert_called_with(data)
887
Guido van Rossuma5062c52013-11-27 14:12:48 -0800888 def test_write_bytearray(self):
889 data = bytearray(b'data')
890 self.sock.send.return_value = len(data)
891
Victor Stinner02392c92015-01-15 13:18:32 +0100892 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800893 transport.write(data)
894 self.sock.send.assert_called_with(data)
895 self.assertEqual(data, bytearray(b'data')) # Hasn't been mutated.
896
897 def test_write_memoryview(self):
898 data = memoryview(b'data')
899 self.sock.send.return_value = len(data)
900
Victor Stinner02392c92015-01-15 13:18:32 +0100901 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800902 transport.write(data)
903 self.sock.send.assert_called_with(data)
904
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700905 def test_write_no_data(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100906 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800907 transport._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700908 transport.write(b'')
909 self.assertFalse(self.sock.send.called)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800910 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700911
912 def test_write_buffer(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100913 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800914 transport._buffer.extend(b'data1')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700915 transport.write(b'data2')
916 self.assertFalse(self.sock.send.called)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800917 self.assertEqual(list_to_buffer([b'data1', b'data2']),
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700918 transport._buffer)
919
920 def test_write_partial(self):
921 data = b'data'
922 self.sock.send.return_value = 2
923
Victor Stinner02392c92015-01-15 13:18:32 +0100924 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700925 transport.write(data)
926
927 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800928 self.assertEqual(list_to_buffer([b'ta']), transport._buffer)
929
930 def test_write_partial_bytearray(self):
931 data = bytearray(b'data')
932 self.sock.send.return_value = 2
933
Victor Stinner02392c92015-01-15 13:18:32 +0100934 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800935 transport.write(data)
936
937 self.loop.assert_writer(7, transport._write_ready)
938 self.assertEqual(list_to_buffer([b'ta']), transport._buffer)
939 self.assertEqual(data, bytearray(b'data')) # Hasn't been mutated.
940
941 def test_write_partial_memoryview(self):
942 data = memoryview(b'data')
943 self.sock.send.return_value = 2
944
Victor Stinner02392c92015-01-15 13:18:32 +0100945 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800946 transport.write(data)
947
948 self.loop.assert_writer(7, transport._write_ready)
949 self.assertEqual(list_to_buffer([b'ta']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700950
951 def test_write_partial_none(self):
952 data = b'data'
953 self.sock.send.return_value = 0
954 self.sock.fileno.return_value = 7
955
Victor Stinner02392c92015-01-15 13:18:32 +0100956 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700957 transport.write(data)
958
959 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800960 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700961
962 def test_write_tryagain(self):
963 self.sock.send.side_effect = BlockingIOError
964
965 data = b'data'
Victor Stinner02392c92015-01-15 13:18:32 +0100966 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700967 transport.write(data)
968
969 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800970 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700971
Victor Stinner24ba2032014-02-26 10:25:02 +0100972 @mock.patch('asyncio.selector_events.logger')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700973 def test_write_exception(self, m_log):
974 err = self.sock.send.side_effect = OSError()
975
976 data = b'data'
Victor Stinner02392c92015-01-15 13:18:32 +0100977 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100978 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700979 transport.write(data)
Victor Stinner065ca252014-02-19 01:40:41 +0100980 transport._fatal_error.assert_called_with(
981 err,
982 'Fatal write error on socket transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700983 transport._conn_lost = 1
984
985 self.sock.reset_mock()
986 transport.write(data)
987 self.assertFalse(self.sock.send.called)
988 self.assertEqual(transport._conn_lost, 2)
989 transport.write(data)
990 transport.write(data)
991 transport.write(data)
992 transport.write(data)
993 m_log.warning.assert_called_with('socket.send() raised exception.')
994
995 def test_write_str(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100996 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800997 self.assertRaises(TypeError, transport.write, 'str')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700998
999 def test_write_closing(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001000 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001001 transport.close()
1002 self.assertEqual(transport._conn_lost, 1)
1003 transport.write(b'data')
1004 self.assertEqual(transport._conn_lost, 2)
1005
1006 def test_write_ready(self):
1007 data = b'data'
1008 self.sock.send.return_value = len(data)
1009
Victor Stinner02392c92015-01-15 13:18:32 +01001010 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001011 transport._buffer.extend(data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001012 self.loop.add_writer(7, transport._write_ready)
1013 transport._write_ready()
1014 self.assertTrue(self.sock.send.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001015 self.assertFalse(self.loop.writers)
1016
1017 def test_write_ready_closing(self):
1018 data = b'data'
1019 self.sock.send.return_value = len(data)
1020
Victor Stinner02392c92015-01-15 13:18:32 +01001021 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001022 transport._closing = True
Guido van Rossuma5062c52013-11-27 14:12:48 -08001023 transport._buffer.extend(data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001024 self.loop.add_writer(7, transport._write_ready)
1025 transport._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001026 self.assertTrue(self.sock.send.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001027 self.assertFalse(self.loop.writers)
1028 self.sock.close.assert_called_with()
1029 self.protocol.connection_lost.assert_called_with(None)
1030
1031 def test_write_ready_no_data(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001032 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001033 # This is an internal error.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001034 self.assertRaises(AssertionError, transport._write_ready)
1035
1036 def test_write_ready_partial(self):
1037 data = b'data'
1038 self.sock.send.return_value = 2
1039
Victor Stinner02392c92015-01-15 13:18:32 +01001040 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001041 transport._buffer.extend(data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001042 self.loop.add_writer(7, transport._write_ready)
1043 transport._write_ready()
1044 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001045 self.assertEqual(list_to_buffer([b'ta']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001046
1047 def test_write_ready_partial_none(self):
1048 data = b'data'
1049 self.sock.send.return_value = 0
1050
Victor Stinner02392c92015-01-15 13:18:32 +01001051 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001052 transport._buffer.extend(data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001053 self.loop.add_writer(7, transport._write_ready)
1054 transport._write_ready()
1055 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001056 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001057
1058 def test_write_ready_tryagain(self):
1059 self.sock.send.side_effect = BlockingIOError
1060
Victor Stinner02392c92015-01-15 13:18:32 +01001061 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001062 transport._buffer = list_to_buffer([b'data1', b'data2'])
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001063 self.loop.add_writer(7, transport._write_ready)
1064 transport._write_ready()
1065
1066 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001067 self.assertEqual(list_to_buffer([b'data1data2']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001068
1069 def test_write_ready_exception(self):
1070 err = self.sock.send.side_effect = OSError()
1071
Victor Stinner02392c92015-01-15 13:18:32 +01001072 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +01001073 transport._fatal_error = mock.Mock()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001074 transport._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001075 transport._write_ready()
Victor Stinner065ca252014-02-19 01:40:41 +01001076 transport._fatal_error.assert_called_with(
1077 err,
1078 'Fatal write error on socket transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001079
Victor Stinner24ba2032014-02-26 10:25:02 +01001080 @mock.patch('asyncio.base_events.logger')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001081 def test_write_ready_exception_and_close(self, m_log):
1082 self.sock.send.side_effect = OSError()
Victor Stinner24ba2032014-02-26 10:25:02 +01001083 remove_writer = self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001084
Victor Stinner02392c92015-01-15 13:18:32 +01001085 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001086 transport.close()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001087 transport._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001088 transport._write_ready()
1089 remove_writer.assert_called_with(self.sock_fd)
1090
1091 def test_write_eof(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001092 tr = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001093 self.assertTrue(tr.can_write_eof())
1094 tr.write_eof()
1095 self.sock.shutdown.assert_called_with(socket.SHUT_WR)
1096 tr.write_eof()
1097 self.assertEqual(self.sock.shutdown.call_count, 1)
1098 tr.close()
1099
1100 def test_write_eof_buffer(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001101 tr = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001102 self.sock.send.side_effect = BlockingIOError
1103 tr.write(b'data')
1104 tr.write_eof()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001105 self.assertEqual(tr._buffer, list_to_buffer([b'data']))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001106 self.assertTrue(tr._eof)
1107 self.assertFalse(self.sock.shutdown.called)
1108 self.sock.send.side_effect = lambda _: 4
1109 tr._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001110 self.assertTrue(self.sock.send.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001111 self.sock.shutdown.assert_called_with(socket.SHUT_WR)
1112 tr.close()
1113
1114
1115@unittest.skipIf(ssl is None, 'No ssl module')
Victor Stinnerc73701d2014-06-18 01:36:32 +02001116class SelectorSslTransportTests(test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001117
1118 def setUp(self):
Victor Stinnerc73701d2014-06-18 01:36:32 +02001119 self.loop = self.new_test_loop()
Victor Stinner8dffc452014-01-25 15:32:06 +01001120 self.protocol = test_utils.make_test_protocol(asyncio.Protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +01001121 self.sock = mock.Mock(socket.socket)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001122 self.sock.fileno.return_value = 7
Victor Stinner24ba2032014-02-26 10:25:02 +01001123 self.sslsock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001124 self.sslsock.fileno.return_value = 1
Victor Stinner24ba2032014-02-26 10:25:02 +01001125 self.sslcontext = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001126 self.sslcontext.wrap_socket.return_value = self.sslsock
1127
Victor Stinner02392c92015-01-15 13:18:32 +01001128 def ssl_transport(self, waiter=None, server_hostname=None):
1129 transport = _SelectorSslTransport(self.loop, self.sock, self.protocol,
1130 self.sslcontext, waiter=waiter,
1131 server_hostname=server_hostname)
1132 self.addCleanup(close_transport, transport)
1133 return transport
1134
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001135 def _make_one(self, create_waiter=None):
Victor Stinner02392c92015-01-15 13:18:32 +01001136 transport = self.ssl_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001137 self.sock.reset_mock()
1138 self.sslsock.reset_mock()
1139 self.sslcontext.reset_mock()
1140 self.loop.reset_counters()
1141 return transport
1142
1143 def test_on_handshake(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01001144 waiter = asyncio.Future(loop=self.loop)
Victor Stinner02392c92015-01-15 13:18:32 +01001145 tr = self.ssl_transport(waiter=waiter)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001146 self.assertTrue(self.sslsock.do_handshake.called)
Guido van Rossum2b570162013-11-01 14:18:02 -07001147 self.loop.assert_reader(1, tr._read_ready)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001148 test_utils.run_briefly(self.loop)
1149 self.assertIsNone(waiter.result())
1150
1151 def test_on_handshake_reader_retry(self):
Victor Stinner1314f062014-07-16 18:02:10 +02001152 self.loop.set_debug(False)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001153 self.sslsock.do_handshake.side_effect = ssl.SSLWantReadError
Victor Stinner02392c92015-01-15 13:18:32 +01001154 transport = self.ssl_transport()
Victor Stinnere912e652014-07-12 03:11:53 +02001155 self.loop.assert_reader(1, transport._on_handshake, None)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001156
1157 def test_on_handshake_writer_retry(self):
Victor Stinner1314f062014-07-16 18:02:10 +02001158 self.loop.set_debug(False)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001159 self.sslsock.do_handshake.side_effect = ssl.SSLWantWriteError
Victor Stinner02392c92015-01-15 13:18:32 +01001160 transport = self.ssl_transport()
Victor Stinnere912e652014-07-12 03:11:53 +02001161 self.loop.assert_writer(1, transport._on_handshake, None)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001162
1163 def test_on_handshake_exc(self):
1164 exc = ValueError()
1165 self.sslsock.do_handshake.side_effect = exc
Victor Stinner1cae9ec2014-07-14 22:26:34 +02001166 with test_utils.disable_logger():
1167 waiter = asyncio.Future(loop=self.loop)
Victor Stinner02392c92015-01-15 13:18:32 +01001168 transport = self.ssl_transport(waiter=waiter)
Victor Stinner1cae9ec2014-07-14 22:26:34 +02001169 self.assertTrue(waiter.done())
1170 self.assertIs(exc, waiter.exception())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001171 self.assertTrue(self.sslsock.close.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001172
1173 def test_on_handshake_base_exc(self):
Victor Stinner177e9f02015-01-14 16:56:20 +01001174 waiter = asyncio.Future(loop=self.loop)
Victor Stinner02392c92015-01-15 13:18:32 +01001175 transport = self.ssl_transport(waiter=waiter)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001176 exc = BaseException()
1177 self.sslsock.do_handshake.side_effect = exc
Victor Stinner1cae9ec2014-07-14 22:26:34 +02001178 with test_utils.disable_logger():
Victor Stinner1314f062014-07-16 18:02:10 +02001179 self.assertRaises(BaseException, transport._on_handshake, 0)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001180 self.assertTrue(self.sslsock.close.called)
Victor Stinner177e9f02015-01-14 16:56:20 +01001181 self.assertTrue(waiter.done())
1182 self.assertIs(exc, waiter.exception())
1183
1184 def test_cancel_handshake(self):
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03001185 # Python issue #23197: cancelling a handshake must not raise an
Victor Stinner177e9f02015-01-14 16:56:20 +01001186 # exception or log an error, even if the handshake failed
1187 waiter = asyncio.Future(loop=self.loop)
Victor Stinner02392c92015-01-15 13:18:32 +01001188 transport = self.ssl_transport(waiter=waiter)
Victor Stinner177e9f02015-01-14 16:56:20 +01001189 waiter.cancel()
1190 exc = ValueError()
1191 self.sslsock.do_handshake.side_effect = exc
1192 with test_utils.disable_logger():
1193 transport._on_handshake(0)
Victor Stinnerab8848b2015-01-15 14:24:55 +01001194 transport.close()
1195 test_utils.run_briefly(self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001196
Guido van Rossum57497ad2013-10-18 07:58:20 -07001197 def test_pause_resume_reading(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001198 tr = self._make_one()
1199 self.assertFalse(tr._paused)
Guido van Rossum2b570162013-11-01 14:18:02 -07001200 self.loop.assert_reader(1, tr._read_ready)
Guido van Rossum57497ad2013-10-18 07:58:20 -07001201 tr.pause_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001202 self.assertTrue(tr._paused)
1203 self.assertFalse(1 in self.loop.readers)
Guido van Rossum57497ad2013-10-18 07:58:20 -07001204 tr.resume_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001205 self.assertFalse(tr._paused)
Guido van Rossum2b570162013-11-01 14:18:02 -07001206 self.loop.assert_reader(1, tr._read_ready)
Andrew Svetlov3207a032014-05-27 21:24:43 +03001207 with self.assertRaises(RuntimeError):
1208 tr.resume_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001209
Guido van Rossuma5062c52013-11-27 14:12:48 -08001210 def test_write(self):
1211 transport = self._make_one()
1212 transport.write(b'data')
1213 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
1214
1215 def test_write_bytearray(self):
1216 transport = self._make_one()
1217 data = bytearray(b'data')
1218 transport.write(data)
1219 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
1220 self.assertEqual(data, bytearray(b'data')) # Hasn't been mutated.
1221 self.assertIsNot(data, transport._buffer) # Hasn't been incorporated.
1222
1223 def test_write_memoryview(self):
1224 transport = self._make_one()
1225 data = memoryview(b'data')
1226 transport.write(data)
1227 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
1228
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001229 def test_write_no_data(self):
1230 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001231 transport._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001232 transport.write(b'')
Guido van Rossuma5062c52013-11-27 14:12:48 -08001233 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001234
1235 def test_write_str(self):
1236 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001237 self.assertRaises(TypeError, transport.write, 'str')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001238
1239 def test_write_closing(self):
1240 transport = self._make_one()
1241 transport.close()
1242 self.assertEqual(transport._conn_lost, 1)
1243 transport.write(b'data')
1244 self.assertEqual(transport._conn_lost, 2)
1245
Victor Stinner24ba2032014-02-26 10:25:02 +01001246 @mock.patch('asyncio.selector_events.logger')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001247 def test_write_exception(self, m_log):
1248 transport = self._make_one()
1249 transport._conn_lost = 1
1250 transport.write(b'data')
Guido van Rossuma5062c52013-11-27 14:12:48 -08001251 self.assertEqual(transport._buffer, list_to_buffer())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001252 transport.write(b'data')
1253 transport.write(b'data')
1254 transport.write(b'data')
1255 transport.write(b'data')
1256 m_log.warning.assert_called_with('socket.send() raised exception.')
1257
Guido van Rossum2b570162013-11-01 14:18:02 -07001258 def test_read_ready_recv(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001259 self.sslsock.recv.return_value = b'data'
1260 transport = self._make_one()
Guido van Rossum2b570162013-11-01 14:18:02 -07001261 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001262 self.assertTrue(self.sslsock.recv.called)
1263 self.assertEqual((b'data',), self.protocol.data_received.call_args[0])
1264
Guido van Rossum2b570162013-11-01 14:18:02 -07001265 def test_read_ready_write_wants_read(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01001266 self.loop.add_writer = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001267 self.sslsock.recv.side_effect = BlockingIOError
1268 transport = self._make_one()
1269 transport._write_wants_read = True
Victor Stinner24ba2032014-02-26 10:25:02 +01001270 transport._write_ready = mock.Mock()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001271 transport._buffer.extend(b'data')
Guido van Rossum2b570162013-11-01 14:18:02 -07001272 transport._read_ready()
1273
1274 self.assertFalse(transport._write_wants_read)
1275 transport._write_ready.assert_called_with()
1276 self.loop.add_writer.assert_called_with(
1277 transport._sock_fd, transport._write_ready)
1278
1279 def test_read_ready_recv_eof(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001280 self.sslsock.recv.return_value = b''
1281 transport = self._make_one()
Victor Stinner24ba2032014-02-26 10:25:02 +01001282 transport.close = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001283 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001284 transport.close.assert_called_with()
1285 self.protocol.eof_received.assert_called_with()
1286
Guido van Rossum2b570162013-11-01 14:18:02 -07001287 def test_read_ready_recv_conn_reset(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001288 err = self.sslsock.recv.side_effect = ConnectionResetError()
1289 transport = self._make_one()
Victor Stinner24ba2032014-02-26 10:25:02 +01001290 transport._force_close = mock.Mock()
Victor Stinnerb2614752014-08-25 23:20:52 +02001291 with test_utils.disable_logger():
1292 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001293 transport._force_close.assert_called_with(err)
1294
Guido van Rossum2b570162013-11-01 14:18:02 -07001295 def test_read_ready_recv_retry(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001296 self.sslsock.recv.side_effect = ssl.SSLWantReadError
1297 transport = self._make_one()
Guido van Rossum2b570162013-11-01 14:18:02 -07001298 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001299 self.assertTrue(self.sslsock.recv.called)
1300 self.assertFalse(self.protocol.data_received.called)
1301
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001302 self.sslsock.recv.side_effect = BlockingIOError
Guido van Rossum2b570162013-11-01 14:18:02 -07001303 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001304 self.assertFalse(self.protocol.data_received.called)
1305
1306 self.sslsock.recv.side_effect = InterruptedError
Guido van Rossum2b570162013-11-01 14:18:02 -07001307 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001308 self.assertFalse(self.protocol.data_received.called)
1309
Guido van Rossum2b570162013-11-01 14:18:02 -07001310 def test_read_ready_recv_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01001311 self.loop.remove_reader = mock.Mock()
1312 self.loop.add_writer = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001313 self.sslsock.recv.side_effect = ssl.SSLWantWriteError
1314 transport = self._make_one()
1315 transport._read_ready()
1316 self.assertFalse(self.protocol.data_received.called)
1317 self.assertTrue(transport._read_wants_write)
1318
1319 self.loop.remove_reader.assert_called_with(transport._sock_fd)
1320 self.loop.add_writer.assert_called_with(
1321 transport._sock_fd, transport._write_ready)
1322
1323 def test_read_ready_recv_exc(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001324 err = self.sslsock.recv.side_effect = OSError()
1325 transport = self._make_one()
Victor Stinner24ba2032014-02-26 10:25:02 +01001326 transport._fatal_error = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001327 transport._read_ready()
Victor Stinner065ca252014-02-19 01:40:41 +01001328 transport._fatal_error.assert_called_with(
1329 err,
1330 'Fatal read error on SSL transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001331
Guido van Rossum2b570162013-11-01 14:18:02 -07001332 def test_write_ready_send(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001333 self.sslsock.send.return_value = 4
1334 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001335 transport._buffer = list_to_buffer([b'data'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001336 transport._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001337 self.assertEqual(list_to_buffer(), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001338 self.assertTrue(self.sslsock.send.called)
1339
Guido van Rossum2b570162013-11-01 14:18:02 -07001340 def test_write_ready_send_none(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001341 self.sslsock.send.return_value = 0
1342 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001343 transport._buffer = list_to_buffer([b'data1', b'data2'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001344 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001345 self.assertTrue(self.sslsock.send.called)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001346 self.assertEqual(list_to_buffer([b'data1data2']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001347
Guido van Rossum2b570162013-11-01 14:18:02 -07001348 def test_write_ready_send_partial(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001349 self.sslsock.send.return_value = 2
1350 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001351 transport._buffer = list_to_buffer([b'data1', b'data2'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001352 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001353 self.assertTrue(self.sslsock.send.called)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001354 self.assertEqual(list_to_buffer([b'ta1data2']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001355
Guido van Rossum2b570162013-11-01 14:18:02 -07001356 def test_write_ready_send_closing_partial(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001357 self.sslsock.send.return_value = 2
1358 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001359 transport._buffer = list_to_buffer([b'data1', b'data2'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001360 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001361 self.assertTrue(self.sslsock.send.called)
1362 self.assertFalse(self.sslsock.close.called)
1363
Guido van Rossum2b570162013-11-01 14:18:02 -07001364 def test_write_ready_send_closing(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001365 self.sslsock.send.return_value = 4
1366 transport = self._make_one()
1367 transport.close()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001368 transport._buffer = list_to_buffer([b'data'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001369 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001370 self.assertFalse(self.loop.writers)
1371 self.protocol.connection_lost.assert_called_with(None)
1372
Guido van Rossum2b570162013-11-01 14:18:02 -07001373 def test_write_ready_send_closing_empty_buffer(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001374 self.sslsock.send.return_value = 4
1375 transport = self._make_one()
1376 transport.close()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001377 transport._buffer = list_to_buffer()
Guido van Rossum2b570162013-11-01 14:18:02 -07001378 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001379 self.assertFalse(self.loop.writers)
1380 self.protocol.connection_lost.assert_called_with(None)
1381
Guido van Rossum2b570162013-11-01 14:18:02 -07001382 def test_write_ready_send_retry(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001383 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001384 transport._buffer = list_to_buffer([b'data'])
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001385
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001386 self.sslsock.send.side_effect = ssl.SSLWantWriteError
Guido van Rossum2b570162013-11-01 14:18:02 -07001387 transport._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001388 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001389
1390 self.sslsock.send.side_effect = BlockingIOError()
Guido van Rossum2b570162013-11-01 14:18:02 -07001391 transport._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001392 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001393
Guido van Rossum2b570162013-11-01 14:18:02 -07001394 def test_write_ready_send_read(self):
1395 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001396 transport._buffer = list_to_buffer([b'data'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001397
Victor Stinner24ba2032014-02-26 10:25:02 +01001398 self.loop.remove_writer = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001399 self.sslsock.send.side_effect = ssl.SSLWantReadError
1400 transport._write_ready()
1401 self.assertFalse(self.protocol.data_received.called)
1402 self.assertTrue(transport._write_wants_read)
1403 self.loop.remove_writer.assert_called_with(transport._sock_fd)
1404
1405 def test_write_ready_send_exc(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001406 err = self.sslsock.send.side_effect = OSError()
1407
1408 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001409 transport._buffer = list_to_buffer([b'data'])
Victor Stinner24ba2032014-02-26 10:25:02 +01001410 transport._fatal_error = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001411 transport._write_ready()
Victor Stinner065ca252014-02-19 01:40:41 +01001412 transport._fatal_error.assert_called_with(
1413 err,
1414 'Fatal write error on SSL transport')
Guido van Rossuma5062c52013-11-27 14:12:48 -08001415 self.assertEqual(list_to_buffer(), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001416
Guido van Rossum2b570162013-11-01 14:18:02 -07001417 def test_write_ready_read_wants_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01001418 self.loop.add_reader = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001419 self.sslsock.send.side_effect = BlockingIOError
1420 transport = self._make_one()
1421 transport._read_wants_write = True
Victor Stinner24ba2032014-02-26 10:25:02 +01001422 transport._read_ready = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001423 transport._write_ready()
1424
1425 self.assertFalse(transport._read_wants_write)
1426 transport._read_ready.assert_called_with()
1427 self.loop.add_reader.assert_called_with(
1428 transport._sock_fd, transport._read_ready)
1429
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001430 def test_write_eof(self):
1431 tr = self._make_one()
1432 self.assertFalse(tr.can_write_eof())
1433 self.assertRaises(NotImplementedError, tr.write_eof)
1434
Victor Stinner47bbea72015-01-29 02:56:05 +01001435 def check_close(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001436 tr = self._make_one()
1437 tr.close()
1438
Yury Selivanov5bb1afb2015-11-16 12:43:21 -05001439 self.assertTrue(tr.is_closing())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001440 self.assertEqual(1, self.loop.remove_reader_count[1])
1441 self.assertEqual(tr._conn_lost, 1)
1442
1443 tr.close()
1444 self.assertEqual(tr._conn_lost, 1)
1445 self.assertEqual(1, self.loop.remove_reader_count[1])
1446
Victor Stinner47bbea72015-01-29 02:56:05 +01001447 test_utils.run_briefly(self.loop)
1448
1449 def test_close(self):
1450 self.check_close()
1451 self.assertTrue(self.protocol.connection_made.called)
1452 self.assertTrue(self.protocol.connection_lost.called)
1453
1454 def test_close_not_connected(self):
1455 self.sslsock.do_handshake.side_effect = ssl.SSLWantReadError
1456 self.check_close()
1457 self.assertFalse(self.protocol.connection_made.called)
1458 self.assertFalse(self.protocol.connection_lost.called)
1459
Benjamin Peterson7243b572014-11-23 17:04:34 -06001460 @unittest.skipIf(ssl is None, 'No SSL support')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001461 def test_server_hostname(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001462 self.ssl_transport(server_hostname='localhost')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001463 self.sslcontext.wrap_socket.assert_called_with(
1464 self.sock, do_handshake_on_connect=False, server_side=False,
1465 server_hostname='localhost')
1466
1467
Guido van Rossum28dff0d2013-11-01 14:22:30 -07001468class SelectorSslWithoutSslTransportTests(unittest.TestCase):
1469
Victor Stinner24ba2032014-02-26 10:25:02 +01001470 @mock.patch('asyncio.selector_events.ssl', None)
Guido van Rossum28dff0d2013-11-01 14:22:30 -07001471 def test_ssl_transport_requires_ssl_module(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01001472 Mock = mock.Mock
Guido van Rossum28dff0d2013-11-01 14:22:30 -07001473 with self.assertRaises(RuntimeError):
Victor Stinnerf5e37032014-02-26 11:07:42 +01001474 _SelectorSslTransport(Mock(), Mock(), Mock(), Mock())
Guido van Rossum28dff0d2013-11-01 14:22:30 -07001475
1476
Victor Stinnerc73701d2014-06-18 01:36:32 +02001477class SelectorDatagramTransportTests(test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001478
1479 def setUp(self):
Victor Stinnerc73701d2014-06-18 01:36:32 +02001480 self.loop = self.new_test_loop()
Victor Stinner8dffc452014-01-25 15:32:06 +01001481 self.protocol = test_utils.make_test_protocol(asyncio.DatagramProtocol)
Victor Stinner24ba2032014-02-26 10:25:02 +01001482 self.sock = mock.Mock(spec_set=socket.socket)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001483 self.sock.fileno.return_value = 7
1484
Victor Stinner02392c92015-01-15 13:18:32 +01001485 def datagram_transport(self, address=None):
1486 transport = _SelectorDatagramTransport(self.loop, self.sock,
1487 self.protocol,
1488 address=address)
1489 self.addCleanup(close_transport, transport)
1490 return transport
1491
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001492 def test_read_ready(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001493 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001494
1495 self.sock.recvfrom.return_value = (b'data', ('0.0.0.0', 1234))
1496 transport._read_ready()
1497
1498 self.protocol.datagram_received.assert_called_with(
1499 b'data', ('0.0.0.0', 1234))
1500
1501 def test_read_ready_tryagain(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001502 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001503
1504 self.sock.recvfrom.side_effect = BlockingIOError
Victor Stinner24ba2032014-02-26 10:25:02 +01001505 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001506 transport._read_ready()
1507
1508 self.assertFalse(transport._fatal_error.called)
1509
1510 def test_read_ready_err(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001511 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001512
Guido van Rossum2335de72013-11-15 16:51:48 -08001513 err = self.sock.recvfrom.side_effect = RuntimeError()
Victor Stinner24ba2032014-02-26 10:25:02 +01001514 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001515 transport._read_ready()
1516
Victor Stinner065ca252014-02-19 01:40:41 +01001517 transport._fatal_error.assert_called_with(
1518 err,
1519 'Fatal read error on datagram transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001520
Guido van Rossum2335de72013-11-15 16:51:48 -08001521 def test_read_ready_oserr(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001522 transport = self.datagram_transport()
Guido van Rossum2335de72013-11-15 16:51:48 -08001523
1524 err = self.sock.recvfrom.side_effect = OSError()
Victor Stinner24ba2032014-02-26 10:25:02 +01001525 transport._fatal_error = mock.Mock()
Guido van Rossum2335de72013-11-15 16:51:48 -08001526 transport._read_ready()
1527
1528 self.assertFalse(transport._fatal_error.called)
1529 self.protocol.error_received.assert_called_with(err)
1530
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001531 def test_sendto(self):
1532 data = b'data'
Victor Stinner02392c92015-01-15 13:18:32 +01001533 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001534 transport.sendto(data, ('0.0.0.0', 1234))
1535 self.assertTrue(self.sock.sendto.called)
1536 self.assertEqual(
1537 self.sock.sendto.call_args[0], (data, ('0.0.0.0', 1234)))
1538
Guido van Rossuma5062c52013-11-27 14:12:48 -08001539 def test_sendto_bytearray(self):
1540 data = bytearray(b'data')
Victor Stinner02392c92015-01-15 13:18:32 +01001541 transport = self.datagram_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001542 transport.sendto(data, ('0.0.0.0', 1234))
1543 self.assertTrue(self.sock.sendto.called)
1544 self.assertEqual(
1545 self.sock.sendto.call_args[0], (data, ('0.0.0.0', 1234)))
1546
1547 def test_sendto_memoryview(self):
1548 data = memoryview(b'data')
Victor Stinner02392c92015-01-15 13:18:32 +01001549 transport = self.datagram_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001550 transport.sendto(data, ('0.0.0.0', 1234))
1551 self.assertTrue(self.sock.sendto.called)
1552 self.assertEqual(
1553 self.sock.sendto.call_args[0], (data, ('0.0.0.0', 1234)))
1554
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001555 def test_sendto_no_data(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001556 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001557 transport._buffer.append((b'data', ('0.0.0.0', 12345)))
1558 transport.sendto(b'', ())
1559 self.assertFalse(self.sock.sendto.called)
1560 self.assertEqual(
1561 [(b'data', ('0.0.0.0', 12345))], list(transport._buffer))
1562
1563 def test_sendto_buffer(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001564 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001565 transport._buffer.append((b'data1', ('0.0.0.0', 12345)))
1566 transport.sendto(b'data2', ('0.0.0.0', 12345))
1567 self.assertFalse(self.sock.sendto.called)
1568 self.assertEqual(
1569 [(b'data1', ('0.0.0.0', 12345)),
1570 (b'data2', ('0.0.0.0', 12345))],
1571 list(transport._buffer))
1572
Guido van Rossuma5062c52013-11-27 14:12:48 -08001573 def test_sendto_buffer_bytearray(self):
1574 data2 = bytearray(b'data2')
Victor Stinner02392c92015-01-15 13:18:32 +01001575 transport = self.datagram_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001576 transport._buffer.append((b'data1', ('0.0.0.0', 12345)))
1577 transport.sendto(data2, ('0.0.0.0', 12345))
1578 self.assertFalse(self.sock.sendto.called)
1579 self.assertEqual(
1580 [(b'data1', ('0.0.0.0', 12345)),
1581 (b'data2', ('0.0.0.0', 12345))],
1582 list(transport._buffer))
1583 self.assertIsInstance(transport._buffer[1][0], bytes)
1584
1585 def test_sendto_buffer_memoryview(self):
1586 data2 = memoryview(b'data2')
Victor Stinner02392c92015-01-15 13:18:32 +01001587 transport = self.datagram_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001588 transport._buffer.append((b'data1', ('0.0.0.0', 12345)))
1589 transport.sendto(data2, ('0.0.0.0', 12345))
1590 self.assertFalse(self.sock.sendto.called)
1591 self.assertEqual(
1592 [(b'data1', ('0.0.0.0', 12345)),
1593 (b'data2', ('0.0.0.0', 12345))],
1594 list(transport._buffer))
1595 self.assertIsInstance(transport._buffer[1][0], bytes)
1596
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001597 def test_sendto_tryagain(self):
1598 data = b'data'
1599
1600 self.sock.sendto.side_effect = BlockingIOError
1601
Victor Stinner02392c92015-01-15 13:18:32 +01001602 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001603 transport.sendto(data, ('0.0.0.0', 12345))
1604
1605 self.loop.assert_writer(7, transport._sendto_ready)
1606 self.assertEqual(
1607 [(b'data', ('0.0.0.0', 12345))], list(transport._buffer))
1608
Victor Stinner24ba2032014-02-26 10:25:02 +01001609 @mock.patch('asyncio.selector_events.logger')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001610 def test_sendto_exception(self, m_log):
1611 data = b'data'
Guido van Rossum2335de72013-11-15 16:51:48 -08001612 err = self.sock.sendto.side_effect = RuntimeError()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001613
Victor Stinner02392c92015-01-15 13:18:32 +01001614 transport = self.datagram_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +01001615 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001616 transport.sendto(data, ())
1617
1618 self.assertTrue(transport._fatal_error.called)
Victor Stinner065ca252014-02-19 01:40:41 +01001619 transport._fatal_error.assert_called_with(
1620 err,
1621 'Fatal write error on datagram transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001622 transport._conn_lost = 1
1623
1624 transport._address = ('123',)
1625 transport.sendto(data)
1626 transport.sendto(data)
1627 transport.sendto(data)
1628 transport.sendto(data)
1629 transport.sendto(data)
1630 m_log.warning.assert_called_with('socket.send() raised exception.')
1631
Guido van Rossum2335de72013-11-15 16:51:48 -08001632 def test_sendto_error_received(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001633 data = b'data'
1634
1635 self.sock.sendto.side_effect = ConnectionRefusedError
1636
Victor Stinner02392c92015-01-15 13:18:32 +01001637 transport = self.datagram_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +01001638 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001639 transport.sendto(data, ())
1640
1641 self.assertEqual(transport._conn_lost, 0)
1642 self.assertFalse(transport._fatal_error.called)
1643
Guido van Rossum2335de72013-11-15 16:51:48 -08001644 def test_sendto_error_received_connected(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001645 data = b'data'
1646
1647 self.sock.send.side_effect = ConnectionRefusedError
1648
Victor Stinner02392c92015-01-15 13:18:32 +01001649 transport = self.datagram_transport(address=('0.0.0.0', 1))
Victor Stinner24ba2032014-02-26 10:25:02 +01001650 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001651 transport.sendto(data)
1652
Guido van Rossum2335de72013-11-15 16:51:48 -08001653 self.assertFalse(transport._fatal_error.called)
1654 self.assertTrue(self.protocol.error_received.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001655
1656 def test_sendto_str(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001657 transport = self.datagram_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001658 self.assertRaises(TypeError, transport.sendto, 'str', ())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001659
1660 def test_sendto_connected_addr(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001661 transport = self.datagram_transport(address=('0.0.0.0', 1))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001662 self.assertRaises(
Guido van Rossuma5062c52013-11-27 14:12:48 -08001663 ValueError, transport.sendto, b'str', ('0.0.0.0', 2))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001664
1665 def test_sendto_closing(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001666 transport = self.datagram_transport(address=(1,))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001667 transport.close()
1668 self.assertEqual(transport._conn_lost, 1)
1669 transport.sendto(b'data', (1,))
1670 self.assertEqual(transport._conn_lost, 2)
1671
1672 def test_sendto_ready(self):
1673 data = b'data'
1674 self.sock.sendto.return_value = len(data)
1675
Victor Stinner02392c92015-01-15 13:18:32 +01001676 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001677 transport._buffer.append((data, ('0.0.0.0', 12345)))
1678 self.loop.add_writer(7, transport._sendto_ready)
1679 transport._sendto_ready()
1680 self.assertTrue(self.sock.sendto.called)
1681 self.assertEqual(
1682 self.sock.sendto.call_args[0], (data, ('0.0.0.0', 12345)))
1683 self.assertFalse(self.loop.writers)
1684
1685 def test_sendto_ready_closing(self):
1686 data = b'data'
1687 self.sock.send.return_value = len(data)
1688
Victor Stinner02392c92015-01-15 13:18:32 +01001689 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001690 transport._closing = True
1691 transport._buffer.append((data, ()))
1692 self.loop.add_writer(7, transport._sendto_ready)
1693 transport._sendto_ready()
1694 self.sock.sendto.assert_called_with(data, ())
1695 self.assertFalse(self.loop.writers)
1696 self.sock.close.assert_called_with()
1697 self.protocol.connection_lost.assert_called_with(None)
1698
1699 def test_sendto_ready_no_data(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001700 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001701 self.loop.add_writer(7, transport._sendto_ready)
1702 transport._sendto_ready()
1703 self.assertFalse(self.sock.sendto.called)
1704 self.assertFalse(self.loop.writers)
1705
1706 def test_sendto_ready_tryagain(self):
1707 self.sock.sendto.side_effect = BlockingIOError
1708
Victor Stinner02392c92015-01-15 13:18:32 +01001709 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001710 transport._buffer.extend([(b'data1', ()), (b'data2', ())])
1711 self.loop.add_writer(7, transport._sendto_ready)
1712 transport._sendto_ready()
1713
1714 self.loop.assert_writer(7, transport._sendto_ready)
1715 self.assertEqual(
1716 [(b'data1', ()), (b'data2', ())],
1717 list(transport._buffer))
1718
1719 def test_sendto_ready_exception(self):
Guido van Rossum2335de72013-11-15 16:51:48 -08001720 err = self.sock.sendto.side_effect = RuntimeError()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001721
Victor Stinner02392c92015-01-15 13:18:32 +01001722 transport = self.datagram_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +01001723 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001724 transport._buffer.append((b'data', ()))
1725 transport._sendto_ready()
1726
Victor Stinner065ca252014-02-19 01:40:41 +01001727 transport._fatal_error.assert_called_with(
1728 err,
1729 'Fatal write error on datagram transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001730
Guido van Rossum2335de72013-11-15 16:51:48 -08001731 def test_sendto_ready_error_received(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001732 self.sock.sendto.side_effect = ConnectionRefusedError
1733
Victor Stinner02392c92015-01-15 13:18:32 +01001734 transport = self.datagram_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +01001735 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001736 transport._buffer.append((b'data', ()))
1737 transport._sendto_ready()
1738
1739 self.assertFalse(transport._fatal_error.called)
1740
Guido van Rossum2335de72013-11-15 16:51:48 -08001741 def test_sendto_ready_error_received_connection(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001742 self.sock.send.side_effect = ConnectionRefusedError
1743
Victor Stinner02392c92015-01-15 13:18:32 +01001744 transport = self.datagram_transport(address=('0.0.0.0', 1))
Victor Stinner24ba2032014-02-26 10:25:02 +01001745 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001746 transport._buffer.append((b'data', ()))
1747 transport._sendto_ready()
1748
Guido van Rossum2335de72013-11-15 16:51:48 -08001749 self.assertFalse(transport._fatal_error.called)
1750 self.assertTrue(self.protocol.error_received.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001751
Victor Stinner24ba2032014-02-26 10:25:02 +01001752 @mock.patch('asyncio.base_events.logger.error')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001753 def test_fatal_error_connected(self, m_exc):
Victor Stinner02392c92015-01-15 13:18:32 +01001754 transport = self.datagram_transport(address=('0.0.0.0', 1))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001755 err = ConnectionRefusedError()
1756 transport._fatal_error(err)
Guido van Rossum2335de72013-11-15 16:51:48 -08001757 self.assertFalse(self.protocol.error_received.called)
Yury Selivanovff827f02014-02-18 18:02:19 -05001758 m_exc.assert_called_with(
1759 test_utils.MockPattern(
Victor Stinner065ca252014-02-19 01:40:41 +01001760 'Fatal error on transport\nprotocol:.*\ntransport:.*'),
Yury Selivanovff827f02014-02-18 18:02:19 -05001761 exc_info=(ConnectionRefusedError, MOCK_ANY, MOCK_ANY))
Antoine Pitroucb1fe982013-10-20 21:02:53 +02001762
1763
1764if __name__ == '__main__':
1765 unittest.main()