blob: f99d04d44ce8f696821f65361c92baa67cd3e7c9 [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 Stinnera1254972014-02-11 11:34:30 +010062 transport = self.loop._make_socket_transport(m, asyncio.Protocol())
63 self.assertIsInstance(transport, _SelectorSocketTransport)
Victor Stinner02392c92015-01-15 13:18:32 +010064 close_transport(transport)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070065
Guido van Rossum28dff0d2013-11-01 14:22:30 -070066 @unittest.skipIf(ssl is None, 'No ssl module')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070067 def test_make_ssl_transport(self):
Victor Stinner24ba2032014-02-26 10:25:02 +010068 m = mock.Mock()
69 self.loop.add_reader = mock.Mock()
70 self.loop.add_writer = mock.Mock()
71 self.loop.remove_reader = mock.Mock()
72 self.loop.remove_writer = mock.Mock()
Victor Stinnera1254972014-02-11 11:34:30 +010073 waiter = asyncio.Future(loop=self.loop)
Victor Stinnerb2614752014-08-25 23:20:52 +020074 with test_utils.disable_logger():
75 transport = self.loop._make_ssl_transport(
76 m, asyncio.Protocol(), m, waiter)
Victor Stinner02392c92015-01-15 13:18:32 +010077 # execute the handshake while the logger is disabled
78 # to ignore SSL handshake failure
79 test_utils.run_briefly(self.loop)
80
Victor Stinner231b4042015-01-14 00:19:09 +010081 # Sanity check
82 class_name = transport.__class__.__name__
83 self.assertIn("ssl", class_name.lower())
84 self.assertIn("transport", class_name.lower())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070085
Victor Stinner02392c92015-01-15 13:18:32 +010086 transport.close()
87 # execute pending callbacks to close the socket transport
88 test_utils.run_briefly(self.loop)
89
Victor Stinner24ba2032014-02-26 10:25:02 +010090 @mock.patch('asyncio.selector_events.ssl', None)
Victor Stinner231b4042015-01-14 00:19:09 +010091 @mock.patch('asyncio.sslproto.ssl', None)
Guido van Rossum28dff0d2013-11-01 14:22:30 -070092 def test_make_ssl_transport_without_ssl_error(self):
Victor Stinner24ba2032014-02-26 10:25:02 +010093 m = mock.Mock()
94 self.loop.add_reader = mock.Mock()
95 self.loop.add_writer = mock.Mock()
96 self.loop.remove_reader = mock.Mock()
97 self.loop.remove_writer = mock.Mock()
Guido van Rossum28dff0d2013-11-01 14:22:30 -070098 with self.assertRaises(RuntimeError):
99 self.loop._make_ssl_transport(m, m, m, m)
100
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700101 def test_close(self):
Victor Stinner33cb0392015-01-15 13:17:34 +0100102 class EventLoop(BaseSelectorEventLoop):
103 def _make_self_pipe(self):
104 self._ssock = mock.Mock()
105 self._csock = mock.Mock()
106 self._internal_fds += 1
107
108 self.loop = EventLoop(self.selector)
109 self.set_event_loop(self.loop)
110
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700111 ssock = self.loop._ssock
112 ssock.fileno.return_value = 7
113 csock = self.loop._csock
114 csock.fileno.return_value = 1
Victor Stinner24ba2032014-02-26 10:25:02 +0100115 remove_reader = self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700116
117 self.loop._selector.close()
Victor Stinner24ba2032014-02-26 10:25:02 +0100118 self.loop._selector = selector = mock.Mock()
Victor Stinnerbb2fc5b2014-06-10 10:23:10 +0200119 self.assertFalse(self.loop.is_closed())
120
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700121 self.loop.close()
Victor Stinnerbb2fc5b2014-06-10 10:23:10 +0200122 self.assertTrue(self.loop.is_closed())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700123 self.assertIsNone(self.loop._selector)
124 self.assertIsNone(self.loop._csock)
125 self.assertIsNone(self.loop._ssock)
126 selector.close.assert_called_with()
127 ssock.close.assert_called_with()
128 csock.close.assert_called_with()
129 remove_reader.assert_called_with(7)
130
Victor Stinnerbb2fc5b2014-06-10 10:23:10 +0200131 # it should be possible to call close() more than once
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700132 self.loop.close()
133 self.loop.close()
134
Victor Stinnerbb2fc5b2014-06-10 10:23:10 +0200135 # operation blocked when the loop is closed
136 f = asyncio.Future(loop=self.loop)
137 self.assertRaises(RuntimeError, self.loop.run_forever)
138 self.assertRaises(RuntimeError, self.loop.run_until_complete, f)
139 fd = 0
140 def callback():
141 pass
142 self.assertRaises(RuntimeError, self.loop.add_reader, fd, callback)
143 self.assertRaises(RuntimeError, self.loop.add_writer, fd, callback)
144
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700145 def test_close_no_selector(self):
Victor Stinner64d750b2014-06-18 03:25:23 +0200146 self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700147 self.loop._selector.close()
148 self.loop._selector = None
149 self.loop.close()
150 self.assertIsNone(self.loop._selector)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700151
152 def test_socketpair(self):
153 self.assertRaises(NotImplementedError, self.loop._socketpair)
154
155 def test_read_from_self_tryagain(self):
156 self.loop._ssock.recv.side_effect = BlockingIOError
157 self.assertIsNone(self.loop._read_from_self())
158
159 def test_read_from_self_exception(self):
160 self.loop._ssock.recv.side_effect = OSError
161 self.assertRaises(OSError, self.loop._read_from_self)
162
163 def test_write_to_self_tryagain(self):
164 self.loop._csock.send.side_effect = BlockingIOError
Victor Stinnerb2614752014-08-25 23:20:52 +0200165 with test_utils.disable_logger():
166 self.assertIsNone(self.loop._write_to_self())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700167
168 def test_write_to_self_exception(self):
Guido van Rossum3d139d82014-05-06 14:42:40 -0700169 # _write_to_self() swallows OSError
170 self.loop._csock.send.side_effect = RuntimeError()
171 self.assertRaises(RuntimeError, self.loop._write_to_self)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700172
173 def test_sock_recv(self):
Victor Stinnerb2614752014-08-25 23:20:52 +0200174 sock = test_utils.mock_nonblocking_socket()
Victor Stinner24ba2032014-02-26 10:25:02 +0100175 self.loop._sock_recv = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700176
177 f = self.loop.sock_recv(sock, 1024)
Victor Stinner8dffc452014-01-25 15:32:06 +0100178 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700179 self.loop._sock_recv.assert_called_with(f, False, sock, 1024)
180
181 def test__sock_recv_canceled_fut(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100182 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700183
Victor Stinner8dffc452014-01-25 15:32:06 +0100184 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700185 f.cancel()
186
187 self.loop._sock_recv(f, False, sock, 1024)
188 self.assertFalse(sock.recv.called)
189
190 def test__sock_recv_unregister(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100191 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700192 sock.fileno.return_value = 10
193
Victor Stinner8dffc452014-01-25 15:32:06 +0100194 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700195 f.cancel()
196
Victor Stinner24ba2032014-02-26 10:25:02 +0100197 self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700198 self.loop._sock_recv(f, True, sock, 1024)
199 self.assertEqual((10,), self.loop.remove_reader.call_args[0])
200
201 def test__sock_recv_tryagain(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100202 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100203 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700204 sock.fileno.return_value = 10
205 sock.recv.side_effect = BlockingIOError
206
Victor Stinner24ba2032014-02-26 10:25:02 +0100207 self.loop.add_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700208 self.loop._sock_recv(f, False, sock, 1024)
209 self.assertEqual((10, self.loop._sock_recv, f, True, sock, 1024),
210 self.loop.add_reader.call_args[0])
211
212 def test__sock_recv_exception(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100213 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100214 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700215 sock.fileno.return_value = 10
216 err = sock.recv.side_effect = OSError()
217
218 self.loop._sock_recv(f, False, sock, 1024)
219 self.assertIs(err, f.exception())
220
221 def test_sock_sendall(self):
Victor Stinnerb2614752014-08-25 23:20:52 +0200222 sock = test_utils.mock_nonblocking_socket()
Victor Stinner24ba2032014-02-26 10:25:02 +0100223 self.loop._sock_sendall = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700224
225 f = self.loop.sock_sendall(sock, b'data')
Victor Stinner8dffc452014-01-25 15:32:06 +0100226 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700227 self.assertEqual(
228 (f, False, sock, b'data'),
229 self.loop._sock_sendall.call_args[0])
230
231 def test_sock_sendall_nodata(self):
Victor Stinnerb2614752014-08-25 23:20:52 +0200232 sock = test_utils.mock_nonblocking_socket()
Victor Stinner24ba2032014-02-26 10:25:02 +0100233 self.loop._sock_sendall = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700234
235 f = self.loop.sock_sendall(sock, b'')
Victor Stinner8dffc452014-01-25 15:32:06 +0100236 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700237 self.assertTrue(f.done())
238 self.assertIsNone(f.result())
239 self.assertFalse(self.loop._sock_sendall.called)
240
241 def test__sock_sendall_canceled_fut(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100242 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700243
Victor Stinner8dffc452014-01-25 15:32:06 +0100244 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700245 f.cancel()
246
247 self.loop._sock_sendall(f, False, sock, b'data')
248 self.assertFalse(sock.send.called)
249
250 def test__sock_sendall_unregister(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100251 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700252 sock.fileno.return_value = 10
253
Victor Stinner8dffc452014-01-25 15:32:06 +0100254 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700255 f.cancel()
256
Victor Stinner24ba2032014-02-26 10:25:02 +0100257 self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700258 self.loop._sock_sendall(f, True, sock, b'data')
259 self.assertEqual((10,), self.loop.remove_writer.call_args[0])
260
261 def test__sock_sendall_tryagain(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100262 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100263 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700264 sock.fileno.return_value = 10
265 sock.send.side_effect = BlockingIOError
266
Victor Stinner24ba2032014-02-26 10:25:02 +0100267 self.loop.add_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700268 self.loop._sock_sendall(f, False, sock, b'data')
269 self.assertEqual(
270 (10, self.loop._sock_sendall, f, True, sock, b'data'),
271 self.loop.add_writer.call_args[0])
272
273 def test__sock_sendall_interrupted(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100274 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100275 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700276 sock.fileno.return_value = 10
277 sock.send.side_effect = InterruptedError
278
Victor Stinner24ba2032014-02-26 10:25:02 +0100279 self.loop.add_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700280 self.loop._sock_sendall(f, False, sock, b'data')
281 self.assertEqual(
282 (10, self.loop._sock_sendall, f, True, sock, b'data'),
283 self.loop.add_writer.call_args[0])
284
285 def test__sock_sendall_exception(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100286 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100287 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700288 sock.fileno.return_value = 10
289 err = sock.send.side_effect = OSError()
290
291 self.loop._sock_sendall(f, False, sock, b'data')
292 self.assertIs(f.exception(), err)
293
294 def test__sock_sendall(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100295 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700296
Victor Stinner8dffc452014-01-25 15:32:06 +0100297 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700298 sock.fileno.return_value = 10
299 sock.send.return_value = 4
300
301 self.loop._sock_sendall(f, False, sock, b'data')
302 self.assertTrue(f.done())
303 self.assertIsNone(f.result())
304
305 def test__sock_sendall_partial(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100306 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700307
Victor Stinner8dffc452014-01-25 15:32:06 +0100308 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700309 sock.fileno.return_value = 10
310 sock.send.return_value = 2
311
Victor Stinner24ba2032014-02-26 10:25:02 +0100312 self.loop.add_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700313 self.loop._sock_sendall(f, False, sock, b'data')
314 self.assertFalse(f.done())
315 self.assertEqual(
316 (10, self.loop._sock_sendall, f, True, sock, b'ta'),
317 self.loop.add_writer.call_args[0])
318
319 def test__sock_sendall_none(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100320 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700321
Victor Stinner8dffc452014-01-25 15:32:06 +0100322 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700323 sock.fileno.return_value = 10
324 sock.send.return_value = 0
325
Victor Stinner24ba2032014-02-26 10:25:02 +0100326 self.loop.add_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700327 self.loop._sock_sendall(f, False, sock, b'data')
328 self.assertFalse(f.done())
329 self.assertEqual(
330 (10, self.loop._sock_sendall, f, True, sock, b'data'),
331 self.loop.add_writer.call_args[0])
332
333 def test_sock_connect(self):
Victor Stinnerb2614752014-08-25 23:20:52 +0200334 sock = test_utils.mock_nonblocking_socket()
Victor Stinner24ba2032014-02-26 10:25:02 +0100335 self.loop._sock_connect = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700336
337 f = self.loop.sock_connect(sock, ('127.0.0.1', 8080))
Victor Stinner8dffc452014-01-25 15:32:06 +0100338 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700339 self.assertEqual(
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200340 (f, sock, ('127.0.0.1', 8080)),
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700341 self.loop._sock_connect.call_args[0])
342
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200343 def test_sock_connect_timeout(self):
344 # Tulip issue #205: sock_connect() must unregister the socket on
345 # timeout error
346
347 # prepare mocks
348 self.loop.add_writer = mock.Mock()
349 self.loop.remove_writer = mock.Mock()
350 sock = test_utils.mock_nonblocking_socket()
351 sock.connect.side_effect = BlockingIOError
352
353 # first call to sock_connect() registers the socket
354 fut = self.loop.sock_connect(sock, ('127.0.0.1', 80))
355 self.assertTrue(sock.connect.called)
356 self.assertTrue(self.loop.add_writer.called)
357 self.assertEqual(len(fut._callbacks), 1)
358
359 # on timeout, the socket must be unregistered
360 sock.connect.reset_mock()
361 fut.set_exception(asyncio.TimeoutError)
362 with self.assertRaises(asyncio.TimeoutError):
363 self.loop.run_until_complete(fut)
364 self.assertTrue(self.loop.remove_writer.called)
365
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700366 def test__sock_connect(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100367 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700368
Victor Stinner24ba2032014-02-26 10:25:02 +0100369 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700370 sock.fileno.return_value = 10
371
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200372 self.loop._sock_connect(f, sock, ('127.0.0.1', 8080))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700373 self.assertTrue(f.done())
374 self.assertIsNone(f.result())
375 self.assertTrue(sock.connect.called)
376
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200377 def test__sock_connect_cb_cancelled_fut(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100378 sock = mock.Mock()
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200379 self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700380
Victor Stinner8dffc452014-01-25 15:32:06 +0100381 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700382 f.cancel()
383
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200384 self.loop._sock_connect_cb(f, sock, ('127.0.0.1', 8080))
385 self.assertFalse(sock.getsockopt.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700386
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200387 def test__sock_connect_writer(self):
388 # check that the fd is registered and then unregistered
389 self.loop._process_events = mock.Mock()
390 self.loop.add_writer = mock.Mock()
391 self.loop.remove_writer = mock.Mock()
392
Victor Stinner24ba2032014-02-26 10:25:02 +0100393 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700394 sock.fileno.return_value = 10
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200395 sock.connect.side_effect = BlockingIOError
396 sock.getsockopt.return_value = 0
397 address = ('127.0.0.1', 8080)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700398
Victor Stinner8dffc452014-01-25 15:32:06 +0100399 f = asyncio.Future(loop=self.loop)
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200400 self.loop._sock_connect(f, sock, address)
401 self.assertTrue(self.loop.add_writer.called)
402 self.assertEqual(10, self.loop.add_writer.call_args[0][0])
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700403
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200404 self.loop._sock_connect_cb(f, sock, address)
405 # need to run the event loop to execute _sock_connect_done() callback
406 self.loop.run_until_complete(f)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700407 self.assertEqual((10,), self.loop.remove_writer.call_args[0])
408
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200409 def test__sock_connect_cb_tryagain(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100410 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100411 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700412 sock.fileno.return_value = 10
413 sock.getsockopt.return_value = errno.EAGAIN
414
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200415 # check that the exception is handled
416 self.loop._sock_connect_cb(f, sock, ('127.0.0.1', 8080))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700417
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200418 def test__sock_connect_cb_exception(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100419 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100420 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700421 sock.fileno.return_value = 10
422 sock.getsockopt.return_value = errno.ENOTCONN
423
Victor Stinner24ba2032014-02-26 10:25:02 +0100424 self.loop.remove_writer = mock.Mock()
Victor Stinnerd5aeccf92014-08-31 15:07:57 +0200425 self.loop._sock_connect_cb(f, sock, ('127.0.0.1', 8080))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700426 self.assertIsInstance(f.exception(), OSError)
427
428 def test_sock_accept(self):
Victor Stinnerb2614752014-08-25 23:20:52 +0200429 sock = test_utils.mock_nonblocking_socket()
Victor Stinner24ba2032014-02-26 10:25:02 +0100430 self.loop._sock_accept = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700431
432 f = self.loop.sock_accept(sock)
Victor Stinner8dffc452014-01-25 15:32:06 +0100433 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700434 self.assertEqual(
435 (f, False, sock), self.loop._sock_accept.call_args[0])
436
437 def test__sock_accept(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100438 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700439
Victor Stinner24ba2032014-02-26 10:25:02 +0100440 conn = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700441
Victor Stinner24ba2032014-02-26 10:25:02 +0100442 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700443 sock.fileno.return_value = 10
444 sock.accept.return_value = conn, ('127.0.0.1', 1000)
445
446 self.loop._sock_accept(f, False, sock)
447 self.assertTrue(f.done())
448 self.assertEqual((conn, ('127.0.0.1', 1000)), f.result())
449 self.assertEqual((False,), conn.setblocking.call_args[0])
450
451 def test__sock_accept_canceled_fut(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100452 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700453
Victor Stinner8dffc452014-01-25 15:32:06 +0100454 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700455 f.cancel()
456
457 self.loop._sock_accept(f, False, sock)
458 self.assertFalse(sock.accept.called)
459
460 def test__sock_accept_unregister(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100461 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700462 sock.fileno.return_value = 10
463
Victor Stinner8dffc452014-01-25 15:32:06 +0100464 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700465 f.cancel()
466
Victor Stinner24ba2032014-02-26 10:25:02 +0100467 self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700468 self.loop._sock_accept(f, True, sock)
469 self.assertEqual((10,), self.loop.remove_reader.call_args[0])
470
471 def test__sock_accept_tryagain(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100472 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100473 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700474 sock.fileno.return_value = 10
475 sock.accept.side_effect = BlockingIOError
476
Victor Stinner24ba2032014-02-26 10:25:02 +0100477 self.loop.add_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700478 self.loop._sock_accept(f, False, sock)
479 self.assertEqual(
480 (10, self.loop._sock_accept, f, True, sock),
481 self.loop.add_reader.call_args[0])
482
483 def test__sock_accept_exception(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100484 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100485 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700486 sock.fileno.return_value = 10
487 err = sock.accept.side_effect = OSError()
488
489 self.loop._sock_accept(f, False, sock)
490 self.assertIs(err, f.exception())
491
492 def test_add_reader(self):
493 self.loop._selector.get_key.side_effect = KeyError
494 cb = lambda: True
495 self.loop.add_reader(1, cb)
496
497 self.assertTrue(self.loop._selector.register.called)
498 fd, mask, (r, w) = self.loop._selector.register.call_args[0]
499 self.assertEqual(1, fd)
500 self.assertEqual(selectors.EVENT_READ, mask)
501 self.assertEqual(cb, r._callback)
502 self.assertIsNone(w)
503
504 def test_add_reader_existing(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100505 reader = mock.Mock()
506 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700507 self.loop._selector.get_key.return_value = selectors.SelectorKey(
508 1, 1, selectors.EVENT_WRITE, (reader, writer))
509 cb = lambda: True
510 self.loop.add_reader(1, cb)
511
512 self.assertTrue(reader.cancel.called)
513 self.assertFalse(self.loop._selector.register.called)
514 self.assertTrue(self.loop._selector.modify.called)
515 fd, mask, (r, w) = self.loop._selector.modify.call_args[0]
516 self.assertEqual(1, fd)
517 self.assertEqual(selectors.EVENT_WRITE | selectors.EVENT_READ, mask)
518 self.assertEqual(cb, r._callback)
519 self.assertEqual(writer, w)
520
521 def test_add_reader_existing_writer(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100522 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700523 self.loop._selector.get_key.return_value = selectors.SelectorKey(
524 1, 1, selectors.EVENT_WRITE, (None, writer))
525 cb = lambda: True
526 self.loop.add_reader(1, cb)
527
528 self.assertFalse(self.loop._selector.register.called)
529 self.assertTrue(self.loop._selector.modify.called)
530 fd, mask, (r, w) = self.loop._selector.modify.call_args[0]
531 self.assertEqual(1, fd)
532 self.assertEqual(selectors.EVENT_WRITE | selectors.EVENT_READ, mask)
533 self.assertEqual(cb, r._callback)
534 self.assertEqual(writer, w)
535
536 def test_remove_reader(self):
537 self.loop._selector.get_key.return_value = selectors.SelectorKey(
538 1, 1, selectors.EVENT_READ, (None, None))
539 self.assertFalse(self.loop.remove_reader(1))
540
541 self.assertTrue(self.loop._selector.unregister.called)
542
543 def test_remove_reader_read_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100544 reader = mock.Mock()
545 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700546 self.loop._selector.get_key.return_value = selectors.SelectorKey(
547 1, 1, selectors.EVENT_READ | selectors.EVENT_WRITE,
548 (reader, writer))
549 self.assertTrue(
550 self.loop.remove_reader(1))
551
552 self.assertFalse(self.loop._selector.unregister.called)
553 self.assertEqual(
554 (1, selectors.EVENT_WRITE, (None, writer)),
555 self.loop._selector.modify.call_args[0])
556
557 def test_remove_reader_unknown(self):
558 self.loop._selector.get_key.side_effect = KeyError
559 self.assertFalse(
560 self.loop.remove_reader(1))
561
562 def test_add_writer(self):
563 self.loop._selector.get_key.side_effect = KeyError
564 cb = lambda: True
565 self.loop.add_writer(1, cb)
566
567 self.assertTrue(self.loop._selector.register.called)
568 fd, mask, (r, w) = self.loop._selector.register.call_args[0]
569 self.assertEqual(1, fd)
570 self.assertEqual(selectors.EVENT_WRITE, mask)
571 self.assertIsNone(r)
572 self.assertEqual(cb, w._callback)
573
574 def test_add_writer_existing(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100575 reader = mock.Mock()
576 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700577 self.loop._selector.get_key.return_value = selectors.SelectorKey(
578 1, 1, selectors.EVENT_READ, (reader, writer))
579 cb = lambda: True
580 self.loop.add_writer(1, cb)
581
582 self.assertTrue(writer.cancel.called)
583 self.assertFalse(self.loop._selector.register.called)
584 self.assertTrue(self.loop._selector.modify.called)
585 fd, mask, (r, w) = self.loop._selector.modify.call_args[0]
586 self.assertEqual(1, fd)
587 self.assertEqual(selectors.EVENT_WRITE | selectors.EVENT_READ, mask)
588 self.assertEqual(reader, r)
589 self.assertEqual(cb, w._callback)
590
591 def test_remove_writer(self):
592 self.loop._selector.get_key.return_value = selectors.SelectorKey(
593 1, 1, selectors.EVENT_WRITE, (None, None))
594 self.assertFalse(self.loop.remove_writer(1))
595
596 self.assertTrue(self.loop._selector.unregister.called)
597
598 def test_remove_writer_read_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100599 reader = mock.Mock()
600 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700601 self.loop._selector.get_key.return_value = selectors.SelectorKey(
602 1, 1, selectors.EVENT_READ | selectors.EVENT_WRITE,
603 (reader, writer))
604 self.assertTrue(
605 self.loop.remove_writer(1))
606
607 self.assertFalse(self.loop._selector.unregister.called)
608 self.assertEqual(
609 (1, selectors.EVENT_READ, (reader, None)),
610 self.loop._selector.modify.call_args[0])
611
612 def test_remove_writer_unknown(self):
613 self.loop._selector.get_key.side_effect = KeyError
614 self.assertFalse(
615 self.loop.remove_writer(1))
616
617 def test_process_events_read(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100618 reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700619 reader._cancelled = False
620
Victor Stinner24ba2032014-02-26 10:25:02 +0100621 self.loop._add_callback = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700622 self.loop._process_events(
623 [(selectors.SelectorKey(
624 1, 1, selectors.EVENT_READ, (reader, None)),
625 selectors.EVENT_READ)])
626 self.assertTrue(self.loop._add_callback.called)
627 self.loop._add_callback.assert_called_with(reader)
628
629 def test_process_events_read_cancelled(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100630 reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700631 reader.cancelled = True
632
Victor Stinner24ba2032014-02-26 10:25:02 +0100633 self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700634 self.loop._process_events(
635 [(selectors.SelectorKey(
636 1, 1, selectors.EVENT_READ, (reader, None)),
637 selectors.EVENT_READ)])
638 self.loop.remove_reader.assert_called_with(1)
639
640 def test_process_events_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100641 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700642 writer._cancelled = False
643
Victor Stinner24ba2032014-02-26 10:25:02 +0100644 self.loop._add_callback = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700645 self.loop._process_events(
646 [(selectors.SelectorKey(1, 1, selectors.EVENT_WRITE,
647 (None, writer)),
648 selectors.EVENT_WRITE)])
649 self.loop._add_callback.assert_called_with(writer)
650
651 def test_process_events_write_cancelled(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100652 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700653 writer.cancelled = True
Victor Stinner24ba2032014-02-26 10:25:02 +0100654 self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700655
656 self.loop._process_events(
657 [(selectors.SelectorKey(1, 1, selectors.EVENT_WRITE,
658 (None, writer)),
659 selectors.EVENT_WRITE)])
660 self.loop.remove_writer.assert_called_with(1)
661
662
Victor Stinnerc73701d2014-06-18 01:36:32 +0200663class SelectorTransportTests(test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700664
665 def setUp(self):
Victor Stinnerc73701d2014-06-18 01:36:32 +0200666 self.loop = self.new_test_loop()
Victor Stinner8dffc452014-01-25 15:32:06 +0100667 self.protocol = test_utils.make_test_protocol(asyncio.Protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100668 self.sock = mock.Mock(socket.socket)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700669 self.sock.fileno.return_value = 7
670
Victor Stinner02392c92015-01-15 13:18:32 +0100671 def create_transport(self):
672 transport = _SelectorTransport(self.loop, self.sock, self.protocol,
673 None)
674 self.addCleanup(close_transport, transport)
675 return transport
676
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700677 def test_ctor(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100678 tr = self.create_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700679 self.assertIs(tr._loop, self.loop)
680 self.assertIs(tr._sock, self.sock)
681 self.assertIs(tr._sock_fd, 7)
682
683 def test_abort(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100684 tr = self.create_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100685 tr._force_close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700686
687 tr.abort()
688 tr._force_close.assert_called_with(None)
689
690 def test_close(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100691 tr = self.create_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700692 tr.close()
693
694 self.assertTrue(tr._closing)
695 self.assertEqual(1, self.loop.remove_reader_count[7])
696 self.protocol.connection_lost(None)
697 self.assertEqual(tr._conn_lost, 1)
698
699 tr.close()
700 self.assertEqual(tr._conn_lost, 1)
701 self.assertEqual(1, self.loop.remove_reader_count[7])
702
703 def test_close_write_buffer(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100704 tr = self.create_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800705 tr._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700706 tr.close()
707
708 self.assertFalse(self.loop.readers)
709 test_utils.run_briefly(self.loop)
710 self.assertFalse(self.protocol.connection_lost.called)
711
712 def test_force_close(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100713 tr = self.create_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800714 tr._buffer.extend(b'1')
Victor Stinner24ba2032014-02-26 10:25:02 +0100715 self.loop.add_reader(7, mock.sentinel)
716 self.loop.add_writer(7, mock.sentinel)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700717 tr._force_close(None)
718
719 self.assertTrue(tr._closing)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800720 self.assertEqual(tr._buffer, list_to_buffer())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700721 self.assertFalse(self.loop.readers)
722 self.assertFalse(self.loop.writers)
723
724 # second close should not remove reader
725 tr._force_close(None)
726 self.assertFalse(self.loop.readers)
727 self.assertEqual(1, self.loop.remove_reader_count[7])
728
Victor Stinner24ba2032014-02-26 10:25:02 +0100729 @mock.patch('asyncio.log.logger.error')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700730 def test_fatal_error(self, m_exc):
731 exc = OSError()
Victor Stinner02392c92015-01-15 13:18:32 +0100732 tr = self.create_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100733 tr._force_close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700734 tr._fatal_error(exc)
735
Yury Selivanovff827f02014-02-18 18:02:19 -0500736 m_exc.assert_called_with(
737 test_utils.MockPattern(
Victor Stinner065ca252014-02-19 01:40:41 +0100738 'Fatal error on transport\nprotocol:.*\ntransport:.*'),
Yury Selivanovff827f02014-02-18 18:02:19 -0500739 exc_info=(OSError, MOCK_ANY, MOCK_ANY))
740
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700741 tr._force_close.assert_called_with(exc)
742
743 def test_connection_lost(self):
744 exc = OSError()
Victor Stinner02392c92015-01-15 13:18:32 +0100745 tr = self.create_transport()
Victor Stinnerc4c46492014-07-23 18:21:45 +0200746 self.assertIsNotNone(tr._protocol)
747 self.assertIsNotNone(tr._loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700748 tr._call_connection_lost(exc)
749
750 self.protocol.connection_lost.assert_called_with(exc)
751 self.sock.close.assert_called_with()
752 self.assertIsNone(tr._sock)
753
754 self.assertIsNone(tr._protocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700755 self.assertIsNone(tr._loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700756
757
Victor Stinnerc73701d2014-06-18 01:36:32 +0200758class SelectorSocketTransportTests(test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700759
760 def setUp(self):
Victor Stinnerc73701d2014-06-18 01:36:32 +0200761 self.loop = self.new_test_loop()
Victor Stinner8dffc452014-01-25 15:32:06 +0100762 self.protocol = test_utils.make_test_protocol(asyncio.Protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100763 self.sock = mock.Mock(socket.socket)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700764 self.sock_fd = self.sock.fileno.return_value = 7
765
Victor Stinner02392c92015-01-15 13:18:32 +0100766 def socket_transport(self, waiter=None):
767 transport = _SelectorSocketTransport(self.loop, self.sock,
768 self.protocol, waiter=waiter)
769 self.addCleanup(close_transport, transport)
770 return transport
771
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700772 def test_ctor(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100773 tr = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700774 self.loop.assert_reader(7, tr._read_ready)
775 test_utils.run_briefly(self.loop)
776 self.protocol.connection_made.assert_called_with(tr)
777
778 def test_ctor_with_waiter(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100779 fut = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700780
Victor Stinner02392c92015-01-15 13:18:32 +0100781 self.socket_transport(waiter=fut)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700782 test_utils.run_briefly(self.loop)
783 self.assertIsNone(fut.result())
784
Guido van Rossum57497ad2013-10-18 07:58:20 -0700785 def test_pause_resume_reading(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100786 tr = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700787 self.assertFalse(tr._paused)
788 self.loop.assert_reader(7, tr._read_ready)
Guido van Rossum57497ad2013-10-18 07:58:20 -0700789 tr.pause_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700790 self.assertTrue(tr._paused)
791 self.assertFalse(7 in self.loop.readers)
Guido van Rossum57497ad2013-10-18 07:58:20 -0700792 tr.resume_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700793 self.assertFalse(tr._paused)
794 self.loop.assert_reader(7, tr._read_ready)
Andrew Svetlov3207a032014-05-27 21:24:43 +0300795 with self.assertRaises(RuntimeError):
796 tr.resume_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700797
798 def test_read_ready(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100799 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700800
801 self.sock.recv.return_value = b'data'
802 transport._read_ready()
803
804 self.protocol.data_received.assert_called_with(b'data')
805
806 def test_read_ready_eof(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100807 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100808 transport.close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700809
810 self.sock.recv.return_value = b''
811 transport._read_ready()
812
813 self.protocol.eof_received.assert_called_with()
814 transport.close.assert_called_with()
815
816 def test_read_ready_eof_keep_open(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100817 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100818 transport.close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700819
820 self.sock.recv.return_value = b''
821 self.protocol.eof_received.return_value = True
822 transport._read_ready()
823
824 self.protocol.eof_received.assert_called_with()
825 self.assertFalse(transport.close.called)
826
Victor Stinner24ba2032014-02-26 10:25:02 +0100827 @mock.patch('logging.exception')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700828 def test_read_ready_tryagain(self, m_exc):
829 self.sock.recv.side_effect = BlockingIOError
830
Victor Stinner02392c92015-01-15 13:18:32 +0100831 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100832 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700833 transport._read_ready()
834
835 self.assertFalse(transport._fatal_error.called)
836
Victor Stinner24ba2032014-02-26 10:25:02 +0100837 @mock.patch('logging.exception')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700838 def test_read_ready_tryagain_interrupted(self, m_exc):
839 self.sock.recv.side_effect = InterruptedError
840
Victor Stinner02392c92015-01-15 13:18:32 +0100841 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100842 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700843 transport._read_ready()
844
845 self.assertFalse(transport._fatal_error.called)
846
Victor Stinner24ba2032014-02-26 10:25:02 +0100847 @mock.patch('logging.exception')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700848 def test_read_ready_conn_reset(self, m_exc):
849 err = self.sock.recv.side_effect = ConnectionResetError()
850
Victor Stinner02392c92015-01-15 13:18:32 +0100851 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100852 transport._force_close = mock.Mock()
Victor Stinnerb2614752014-08-25 23:20:52 +0200853 with test_utils.disable_logger():
854 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700855 transport._force_close.assert_called_with(err)
856
Victor Stinner24ba2032014-02-26 10:25:02 +0100857 @mock.patch('logging.exception')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700858 def test_read_ready_err(self, m_exc):
859 err = self.sock.recv.side_effect = OSError()
860
Victor Stinner02392c92015-01-15 13:18:32 +0100861 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100862 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700863 transport._read_ready()
864
Victor Stinner065ca252014-02-19 01:40:41 +0100865 transport._fatal_error.assert_called_with(
866 err,
867 'Fatal read error on socket transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700868
869 def test_write(self):
870 data = b'data'
871 self.sock.send.return_value = len(data)
872
Victor Stinner02392c92015-01-15 13:18:32 +0100873 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700874 transport.write(data)
875 self.sock.send.assert_called_with(data)
876
Guido van Rossuma5062c52013-11-27 14:12:48 -0800877 def test_write_bytearray(self):
878 data = bytearray(b'data')
879 self.sock.send.return_value = len(data)
880
Victor Stinner02392c92015-01-15 13:18:32 +0100881 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800882 transport.write(data)
883 self.sock.send.assert_called_with(data)
884 self.assertEqual(data, bytearray(b'data')) # Hasn't been mutated.
885
886 def test_write_memoryview(self):
887 data = memoryview(b'data')
888 self.sock.send.return_value = len(data)
889
Victor Stinner02392c92015-01-15 13:18:32 +0100890 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800891 transport.write(data)
892 self.sock.send.assert_called_with(data)
893
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700894 def test_write_no_data(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100895 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800896 transport._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700897 transport.write(b'')
898 self.assertFalse(self.sock.send.called)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800899 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700900
901 def test_write_buffer(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100902 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800903 transport._buffer.extend(b'data1')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700904 transport.write(b'data2')
905 self.assertFalse(self.sock.send.called)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800906 self.assertEqual(list_to_buffer([b'data1', b'data2']),
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700907 transport._buffer)
908
909 def test_write_partial(self):
910 data = b'data'
911 self.sock.send.return_value = 2
912
Victor Stinner02392c92015-01-15 13:18:32 +0100913 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700914 transport.write(data)
915
916 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800917 self.assertEqual(list_to_buffer([b'ta']), transport._buffer)
918
919 def test_write_partial_bytearray(self):
920 data = bytearray(b'data')
921 self.sock.send.return_value = 2
922
Victor Stinner02392c92015-01-15 13:18:32 +0100923 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800924 transport.write(data)
925
926 self.loop.assert_writer(7, transport._write_ready)
927 self.assertEqual(list_to_buffer([b'ta']), transport._buffer)
928 self.assertEqual(data, bytearray(b'data')) # Hasn't been mutated.
929
930 def test_write_partial_memoryview(self):
931 data = memoryview(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)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700939
940 def test_write_partial_none(self):
941 data = b'data'
942 self.sock.send.return_value = 0
943 self.sock.fileno.return_value = 7
944
Victor Stinner02392c92015-01-15 13:18:32 +0100945 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700946 transport.write(data)
947
948 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800949 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700950
951 def test_write_tryagain(self):
952 self.sock.send.side_effect = BlockingIOError
953
954 data = b'data'
Victor Stinner02392c92015-01-15 13:18:32 +0100955 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700956 transport.write(data)
957
958 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800959 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700960
Victor Stinner24ba2032014-02-26 10:25:02 +0100961 @mock.patch('asyncio.selector_events.logger')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700962 def test_write_exception(self, m_log):
963 err = self.sock.send.side_effect = OSError()
964
965 data = b'data'
Victor Stinner02392c92015-01-15 13:18:32 +0100966 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +0100967 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700968 transport.write(data)
Victor Stinner065ca252014-02-19 01:40:41 +0100969 transport._fatal_error.assert_called_with(
970 err,
971 'Fatal write error on socket transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700972 transport._conn_lost = 1
973
974 self.sock.reset_mock()
975 transport.write(data)
976 self.assertFalse(self.sock.send.called)
977 self.assertEqual(transport._conn_lost, 2)
978 transport.write(data)
979 transport.write(data)
980 transport.write(data)
981 transport.write(data)
982 m_log.warning.assert_called_with('socket.send() raised exception.')
983
984 def test_write_str(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100985 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800986 self.assertRaises(TypeError, transport.write, 'str')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700987
988 def test_write_closing(self):
Victor Stinner02392c92015-01-15 13:18:32 +0100989 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700990 transport.close()
991 self.assertEqual(transport._conn_lost, 1)
992 transport.write(b'data')
993 self.assertEqual(transport._conn_lost, 2)
994
995 def test_write_ready(self):
996 data = b'data'
997 self.sock.send.return_value = len(data)
998
Victor Stinner02392c92015-01-15 13:18:32 +0100999 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001000 transport._buffer.extend(data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001001 self.loop.add_writer(7, transport._write_ready)
1002 transport._write_ready()
1003 self.assertTrue(self.sock.send.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001004 self.assertFalse(self.loop.writers)
1005
1006 def test_write_ready_closing(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 Rossum27b7c7e2013-10-17 13:40:50 -07001011 transport._closing = True
Guido van Rossuma5062c52013-11-27 14:12:48 -08001012 transport._buffer.extend(data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001013 self.loop.add_writer(7, transport._write_ready)
1014 transport._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001015 self.assertTrue(self.sock.send.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001016 self.assertFalse(self.loop.writers)
1017 self.sock.close.assert_called_with()
1018 self.protocol.connection_lost.assert_called_with(None)
1019
1020 def test_write_ready_no_data(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001021 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001022 # This is an internal error.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001023 self.assertRaises(AssertionError, transport._write_ready)
1024
1025 def test_write_ready_partial(self):
1026 data = b'data'
1027 self.sock.send.return_value = 2
1028
Victor Stinner02392c92015-01-15 13:18:32 +01001029 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001030 transport._buffer.extend(data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001031 self.loop.add_writer(7, transport._write_ready)
1032 transport._write_ready()
1033 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001034 self.assertEqual(list_to_buffer([b'ta']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001035
1036 def test_write_ready_partial_none(self):
1037 data = b'data'
1038 self.sock.send.return_value = 0
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'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001046
1047 def test_write_ready_tryagain(self):
1048 self.sock.send.side_effect = BlockingIOError
1049
Victor Stinner02392c92015-01-15 13:18:32 +01001050 transport = self.socket_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001051 transport._buffer = list_to_buffer([b'data1', b'data2'])
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001052 self.loop.add_writer(7, transport._write_ready)
1053 transport._write_ready()
1054
1055 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001056 self.assertEqual(list_to_buffer([b'data1data2']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001057
1058 def test_write_ready_exception(self):
1059 err = self.sock.send.side_effect = OSError()
1060
Victor Stinner02392c92015-01-15 13:18:32 +01001061 transport = self.socket_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +01001062 transport._fatal_error = mock.Mock()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001063 transport._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001064 transport._write_ready()
Victor Stinner065ca252014-02-19 01:40:41 +01001065 transport._fatal_error.assert_called_with(
1066 err,
1067 'Fatal write error on socket transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001068
Victor Stinner24ba2032014-02-26 10:25:02 +01001069 @mock.patch('asyncio.base_events.logger')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001070 def test_write_ready_exception_and_close(self, m_log):
1071 self.sock.send.side_effect = OSError()
Victor Stinner24ba2032014-02-26 10:25:02 +01001072 remove_writer = self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001073
Victor Stinner02392c92015-01-15 13:18:32 +01001074 transport = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001075 transport.close()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001076 transport._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001077 transport._write_ready()
1078 remove_writer.assert_called_with(self.sock_fd)
1079
1080 def test_write_eof(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001081 tr = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001082 self.assertTrue(tr.can_write_eof())
1083 tr.write_eof()
1084 self.sock.shutdown.assert_called_with(socket.SHUT_WR)
1085 tr.write_eof()
1086 self.assertEqual(self.sock.shutdown.call_count, 1)
1087 tr.close()
1088
1089 def test_write_eof_buffer(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001090 tr = self.socket_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001091 self.sock.send.side_effect = BlockingIOError
1092 tr.write(b'data')
1093 tr.write_eof()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001094 self.assertEqual(tr._buffer, list_to_buffer([b'data']))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001095 self.assertTrue(tr._eof)
1096 self.assertFalse(self.sock.shutdown.called)
1097 self.sock.send.side_effect = lambda _: 4
1098 tr._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001099 self.assertTrue(self.sock.send.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001100 self.sock.shutdown.assert_called_with(socket.SHUT_WR)
1101 tr.close()
1102
1103
1104@unittest.skipIf(ssl is None, 'No ssl module')
Victor Stinnerc73701d2014-06-18 01:36:32 +02001105class SelectorSslTransportTests(test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001106
1107 def setUp(self):
Victor Stinnerc73701d2014-06-18 01:36:32 +02001108 self.loop = self.new_test_loop()
Victor Stinner8dffc452014-01-25 15:32:06 +01001109 self.protocol = test_utils.make_test_protocol(asyncio.Protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +01001110 self.sock = mock.Mock(socket.socket)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001111 self.sock.fileno.return_value = 7
Victor Stinner24ba2032014-02-26 10:25:02 +01001112 self.sslsock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001113 self.sslsock.fileno.return_value = 1
Victor Stinner24ba2032014-02-26 10:25:02 +01001114 self.sslcontext = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001115 self.sslcontext.wrap_socket.return_value = self.sslsock
1116
Victor Stinner02392c92015-01-15 13:18:32 +01001117 def ssl_transport(self, waiter=None, server_hostname=None):
1118 transport = _SelectorSslTransport(self.loop, self.sock, self.protocol,
1119 self.sslcontext, waiter=waiter,
1120 server_hostname=server_hostname)
1121 self.addCleanup(close_transport, transport)
1122 return transport
1123
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001124 def _make_one(self, create_waiter=None):
Victor Stinner02392c92015-01-15 13:18:32 +01001125 transport = self.ssl_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001126 self.sock.reset_mock()
1127 self.sslsock.reset_mock()
1128 self.sslcontext.reset_mock()
1129 self.loop.reset_counters()
1130 return transport
1131
1132 def test_on_handshake(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01001133 waiter = asyncio.Future(loop=self.loop)
Victor Stinner02392c92015-01-15 13:18:32 +01001134 tr = self.ssl_transport(waiter=waiter)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001135 self.assertTrue(self.sslsock.do_handshake.called)
Guido van Rossum2b570162013-11-01 14:18:02 -07001136 self.loop.assert_reader(1, tr._read_ready)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001137 test_utils.run_briefly(self.loop)
1138 self.assertIsNone(waiter.result())
1139
1140 def test_on_handshake_reader_retry(self):
Victor Stinner1314f062014-07-16 18:02:10 +02001141 self.loop.set_debug(False)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001142 self.sslsock.do_handshake.side_effect = ssl.SSLWantReadError
Victor Stinner02392c92015-01-15 13:18:32 +01001143 transport = self.ssl_transport()
Victor Stinnere912e652014-07-12 03:11:53 +02001144 self.loop.assert_reader(1, transport._on_handshake, None)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001145
1146 def test_on_handshake_writer_retry(self):
Victor Stinner1314f062014-07-16 18:02:10 +02001147 self.loop.set_debug(False)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001148 self.sslsock.do_handshake.side_effect = ssl.SSLWantWriteError
Victor Stinner02392c92015-01-15 13:18:32 +01001149 transport = self.ssl_transport()
Victor Stinnere912e652014-07-12 03:11:53 +02001150 self.loop.assert_writer(1, transport._on_handshake, None)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001151
1152 def test_on_handshake_exc(self):
1153 exc = ValueError()
1154 self.sslsock.do_handshake.side_effect = exc
Victor Stinner1cae9ec2014-07-14 22:26:34 +02001155 with test_utils.disable_logger():
1156 waiter = asyncio.Future(loop=self.loop)
Victor Stinner02392c92015-01-15 13:18:32 +01001157 transport = self.ssl_transport(waiter=waiter)
Victor Stinner1cae9ec2014-07-14 22:26:34 +02001158 self.assertTrue(waiter.done())
1159 self.assertIs(exc, waiter.exception())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001160 self.assertTrue(self.sslsock.close.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001161
1162 def test_on_handshake_base_exc(self):
Victor Stinner177e9f02015-01-14 16:56:20 +01001163 waiter = asyncio.Future(loop=self.loop)
Victor Stinner02392c92015-01-15 13:18:32 +01001164 transport = self.ssl_transport(waiter=waiter)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001165 exc = BaseException()
1166 self.sslsock.do_handshake.side_effect = exc
Victor Stinner1cae9ec2014-07-14 22:26:34 +02001167 with test_utils.disable_logger():
Victor Stinner1314f062014-07-16 18:02:10 +02001168 self.assertRaises(BaseException, transport._on_handshake, 0)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001169 self.assertTrue(self.sslsock.close.called)
Victor Stinner177e9f02015-01-14 16:56:20 +01001170 self.assertTrue(waiter.done())
1171 self.assertIs(exc, waiter.exception())
1172
1173 def test_cancel_handshake(self):
1174 # Python issue #23197: cancelling an handshake must not raise an
1175 # exception or log an error, even if the handshake failed
1176 waiter = asyncio.Future(loop=self.loop)
Victor Stinner02392c92015-01-15 13:18:32 +01001177 transport = self.ssl_transport(waiter=waiter)
Victor Stinner177e9f02015-01-14 16:56:20 +01001178 waiter.cancel()
1179 exc = ValueError()
1180 self.sslsock.do_handshake.side_effect = exc
1181 with test_utils.disable_logger():
1182 transport._on_handshake(0)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001183
Guido van Rossum57497ad2013-10-18 07:58:20 -07001184 def test_pause_resume_reading(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001185 tr = self._make_one()
1186 self.assertFalse(tr._paused)
Guido van Rossum2b570162013-11-01 14:18:02 -07001187 self.loop.assert_reader(1, tr._read_ready)
Guido van Rossum57497ad2013-10-18 07:58:20 -07001188 tr.pause_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001189 self.assertTrue(tr._paused)
1190 self.assertFalse(1 in self.loop.readers)
Guido van Rossum57497ad2013-10-18 07:58:20 -07001191 tr.resume_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001192 self.assertFalse(tr._paused)
Guido van Rossum2b570162013-11-01 14:18:02 -07001193 self.loop.assert_reader(1, tr._read_ready)
Andrew Svetlov3207a032014-05-27 21:24:43 +03001194 with self.assertRaises(RuntimeError):
1195 tr.resume_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001196
Guido van Rossuma5062c52013-11-27 14:12:48 -08001197 def test_write(self):
1198 transport = self._make_one()
1199 transport.write(b'data')
1200 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
1201
1202 def test_write_bytearray(self):
1203 transport = self._make_one()
1204 data = bytearray(b'data')
1205 transport.write(data)
1206 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
1207 self.assertEqual(data, bytearray(b'data')) # Hasn't been mutated.
1208 self.assertIsNot(data, transport._buffer) # Hasn't been incorporated.
1209
1210 def test_write_memoryview(self):
1211 transport = self._make_one()
1212 data = memoryview(b'data')
1213 transport.write(data)
1214 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
1215
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001216 def test_write_no_data(self):
1217 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001218 transport._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001219 transport.write(b'')
Guido van Rossuma5062c52013-11-27 14:12:48 -08001220 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001221
1222 def test_write_str(self):
1223 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001224 self.assertRaises(TypeError, transport.write, 'str')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001225
1226 def test_write_closing(self):
1227 transport = self._make_one()
1228 transport.close()
1229 self.assertEqual(transport._conn_lost, 1)
1230 transport.write(b'data')
1231 self.assertEqual(transport._conn_lost, 2)
1232
Victor Stinner24ba2032014-02-26 10:25:02 +01001233 @mock.patch('asyncio.selector_events.logger')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001234 def test_write_exception(self, m_log):
1235 transport = self._make_one()
1236 transport._conn_lost = 1
1237 transport.write(b'data')
Guido van Rossuma5062c52013-11-27 14:12:48 -08001238 self.assertEqual(transport._buffer, list_to_buffer())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001239 transport.write(b'data')
1240 transport.write(b'data')
1241 transport.write(b'data')
1242 transport.write(b'data')
1243 m_log.warning.assert_called_with('socket.send() raised exception.')
1244
Guido van Rossum2b570162013-11-01 14:18:02 -07001245 def test_read_ready_recv(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001246 self.sslsock.recv.return_value = b'data'
1247 transport = self._make_one()
Guido van Rossum2b570162013-11-01 14:18:02 -07001248 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001249 self.assertTrue(self.sslsock.recv.called)
1250 self.assertEqual((b'data',), self.protocol.data_received.call_args[0])
1251
Guido van Rossum2b570162013-11-01 14:18:02 -07001252 def test_read_ready_write_wants_read(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01001253 self.loop.add_writer = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001254 self.sslsock.recv.side_effect = BlockingIOError
1255 transport = self._make_one()
1256 transport._write_wants_read = True
Victor Stinner24ba2032014-02-26 10:25:02 +01001257 transport._write_ready = mock.Mock()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001258 transport._buffer.extend(b'data')
Guido van Rossum2b570162013-11-01 14:18:02 -07001259 transport._read_ready()
1260
1261 self.assertFalse(transport._write_wants_read)
1262 transport._write_ready.assert_called_with()
1263 self.loop.add_writer.assert_called_with(
1264 transport._sock_fd, transport._write_ready)
1265
1266 def test_read_ready_recv_eof(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001267 self.sslsock.recv.return_value = b''
1268 transport = self._make_one()
Victor Stinner24ba2032014-02-26 10:25:02 +01001269 transport.close = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001270 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001271 transport.close.assert_called_with()
1272 self.protocol.eof_received.assert_called_with()
1273
Guido van Rossum2b570162013-11-01 14:18:02 -07001274 def test_read_ready_recv_conn_reset(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001275 err = self.sslsock.recv.side_effect = ConnectionResetError()
1276 transport = self._make_one()
Victor Stinner24ba2032014-02-26 10:25:02 +01001277 transport._force_close = mock.Mock()
Victor Stinnerb2614752014-08-25 23:20:52 +02001278 with test_utils.disable_logger():
1279 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001280 transport._force_close.assert_called_with(err)
1281
Guido van Rossum2b570162013-11-01 14:18:02 -07001282 def test_read_ready_recv_retry(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001283 self.sslsock.recv.side_effect = ssl.SSLWantReadError
1284 transport = self._make_one()
Guido van Rossum2b570162013-11-01 14:18:02 -07001285 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001286 self.assertTrue(self.sslsock.recv.called)
1287 self.assertFalse(self.protocol.data_received.called)
1288
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001289 self.sslsock.recv.side_effect = BlockingIOError
Guido van Rossum2b570162013-11-01 14:18:02 -07001290 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001291 self.assertFalse(self.protocol.data_received.called)
1292
1293 self.sslsock.recv.side_effect = InterruptedError
Guido van Rossum2b570162013-11-01 14:18:02 -07001294 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001295 self.assertFalse(self.protocol.data_received.called)
1296
Guido van Rossum2b570162013-11-01 14:18:02 -07001297 def test_read_ready_recv_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01001298 self.loop.remove_reader = mock.Mock()
1299 self.loop.add_writer = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001300 self.sslsock.recv.side_effect = ssl.SSLWantWriteError
1301 transport = self._make_one()
1302 transport._read_ready()
1303 self.assertFalse(self.protocol.data_received.called)
1304 self.assertTrue(transport._read_wants_write)
1305
1306 self.loop.remove_reader.assert_called_with(transport._sock_fd)
1307 self.loop.add_writer.assert_called_with(
1308 transport._sock_fd, transport._write_ready)
1309
1310 def test_read_ready_recv_exc(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001311 err = self.sslsock.recv.side_effect = OSError()
1312 transport = self._make_one()
Victor Stinner24ba2032014-02-26 10:25:02 +01001313 transport._fatal_error = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001314 transport._read_ready()
Victor Stinner065ca252014-02-19 01:40:41 +01001315 transport._fatal_error.assert_called_with(
1316 err,
1317 'Fatal read error on SSL transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001318
Guido van Rossum2b570162013-11-01 14:18:02 -07001319 def test_write_ready_send(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001320 self.sslsock.send.return_value = 4
1321 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001322 transport._buffer = list_to_buffer([b'data'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001323 transport._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001324 self.assertEqual(list_to_buffer(), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001325 self.assertTrue(self.sslsock.send.called)
1326
Guido van Rossum2b570162013-11-01 14:18:02 -07001327 def test_write_ready_send_none(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001328 self.sslsock.send.return_value = 0
1329 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001330 transport._buffer = list_to_buffer([b'data1', b'data2'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001331 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001332 self.assertTrue(self.sslsock.send.called)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001333 self.assertEqual(list_to_buffer([b'data1data2']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001334
Guido van Rossum2b570162013-11-01 14:18:02 -07001335 def test_write_ready_send_partial(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001336 self.sslsock.send.return_value = 2
1337 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001338 transport._buffer = list_to_buffer([b'data1', b'data2'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001339 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001340 self.assertTrue(self.sslsock.send.called)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001341 self.assertEqual(list_to_buffer([b'ta1data2']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001342
Guido van Rossum2b570162013-11-01 14:18:02 -07001343 def test_write_ready_send_closing_partial(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001344 self.sslsock.send.return_value = 2
1345 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001346 transport._buffer = list_to_buffer([b'data1', b'data2'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001347 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001348 self.assertTrue(self.sslsock.send.called)
1349 self.assertFalse(self.sslsock.close.called)
1350
Guido van Rossum2b570162013-11-01 14:18:02 -07001351 def test_write_ready_send_closing(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001352 self.sslsock.send.return_value = 4
1353 transport = self._make_one()
1354 transport.close()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001355 transport._buffer = list_to_buffer([b'data'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001356 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001357 self.assertFalse(self.loop.writers)
1358 self.protocol.connection_lost.assert_called_with(None)
1359
Guido van Rossum2b570162013-11-01 14:18:02 -07001360 def test_write_ready_send_closing_empty_buffer(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001361 self.sslsock.send.return_value = 4
1362 transport = self._make_one()
1363 transport.close()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001364 transport._buffer = list_to_buffer()
Guido van Rossum2b570162013-11-01 14:18:02 -07001365 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001366 self.assertFalse(self.loop.writers)
1367 self.protocol.connection_lost.assert_called_with(None)
1368
Guido van Rossum2b570162013-11-01 14:18:02 -07001369 def test_write_ready_send_retry(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001370 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001371 transport._buffer = list_to_buffer([b'data'])
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001372
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001373 self.sslsock.send.side_effect = ssl.SSLWantWriteError
Guido van Rossum2b570162013-11-01 14:18:02 -07001374 transport._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001375 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001376
1377 self.sslsock.send.side_effect = BlockingIOError()
Guido van Rossum2b570162013-11-01 14:18:02 -07001378 transport._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001379 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001380
Guido van Rossum2b570162013-11-01 14:18:02 -07001381 def test_write_ready_send_read(self):
1382 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001383 transport._buffer = list_to_buffer([b'data'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001384
Victor Stinner24ba2032014-02-26 10:25:02 +01001385 self.loop.remove_writer = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001386 self.sslsock.send.side_effect = ssl.SSLWantReadError
1387 transport._write_ready()
1388 self.assertFalse(self.protocol.data_received.called)
1389 self.assertTrue(transport._write_wants_read)
1390 self.loop.remove_writer.assert_called_with(transport._sock_fd)
1391
1392 def test_write_ready_send_exc(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001393 err = self.sslsock.send.side_effect = OSError()
1394
1395 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001396 transport._buffer = list_to_buffer([b'data'])
Victor Stinner24ba2032014-02-26 10:25:02 +01001397 transport._fatal_error = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001398 transport._write_ready()
Victor Stinner065ca252014-02-19 01:40:41 +01001399 transport._fatal_error.assert_called_with(
1400 err,
1401 'Fatal write error on SSL transport')
Guido van Rossuma5062c52013-11-27 14:12:48 -08001402 self.assertEqual(list_to_buffer(), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001403
Guido van Rossum2b570162013-11-01 14:18:02 -07001404 def test_write_ready_read_wants_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01001405 self.loop.add_reader = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001406 self.sslsock.send.side_effect = BlockingIOError
1407 transport = self._make_one()
1408 transport._read_wants_write = True
Victor Stinner24ba2032014-02-26 10:25:02 +01001409 transport._read_ready = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001410 transport._write_ready()
1411
1412 self.assertFalse(transport._read_wants_write)
1413 transport._read_ready.assert_called_with()
1414 self.loop.add_reader.assert_called_with(
1415 transport._sock_fd, transport._read_ready)
1416
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001417 def test_write_eof(self):
1418 tr = self._make_one()
1419 self.assertFalse(tr.can_write_eof())
1420 self.assertRaises(NotImplementedError, tr.write_eof)
1421
1422 def test_close(self):
1423 tr = self._make_one()
1424 tr.close()
1425
1426 self.assertTrue(tr._closing)
1427 self.assertEqual(1, self.loop.remove_reader_count[1])
1428 self.assertEqual(tr._conn_lost, 1)
1429
1430 tr.close()
1431 self.assertEqual(tr._conn_lost, 1)
1432 self.assertEqual(1, self.loop.remove_reader_count[1])
1433
Benjamin Peterson7243b572014-11-23 17:04:34 -06001434 @unittest.skipIf(ssl is None, 'No SSL support')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001435 def test_server_hostname(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001436 self.ssl_transport(server_hostname='localhost')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001437 self.sslcontext.wrap_socket.assert_called_with(
1438 self.sock, do_handshake_on_connect=False, server_side=False,
1439 server_hostname='localhost')
1440
1441
Guido van Rossum28dff0d2013-11-01 14:22:30 -07001442class SelectorSslWithoutSslTransportTests(unittest.TestCase):
1443
Victor Stinner24ba2032014-02-26 10:25:02 +01001444 @mock.patch('asyncio.selector_events.ssl', None)
Guido van Rossum28dff0d2013-11-01 14:22:30 -07001445 def test_ssl_transport_requires_ssl_module(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01001446 Mock = mock.Mock
Guido van Rossum28dff0d2013-11-01 14:22:30 -07001447 with self.assertRaises(RuntimeError):
Victor Stinnerf5e37032014-02-26 11:07:42 +01001448 _SelectorSslTransport(Mock(), Mock(), Mock(), Mock())
Guido van Rossum28dff0d2013-11-01 14:22:30 -07001449
1450
Victor Stinnerc73701d2014-06-18 01:36:32 +02001451class SelectorDatagramTransportTests(test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001452
1453 def setUp(self):
Victor Stinnerc73701d2014-06-18 01:36:32 +02001454 self.loop = self.new_test_loop()
Victor Stinner8dffc452014-01-25 15:32:06 +01001455 self.protocol = test_utils.make_test_protocol(asyncio.DatagramProtocol)
Victor Stinner24ba2032014-02-26 10:25:02 +01001456 self.sock = mock.Mock(spec_set=socket.socket)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001457 self.sock.fileno.return_value = 7
1458
Victor Stinner02392c92015-01-15 13:18:32 +01001459 def datagram_transport(self, address=None):
1460 transport = _SelectorDatagramTransport(self.loop, self.sock,
1461 self.protocol,
1462 address=address)
1463 self.addCleanup(close_transport, transport)
1464 return transport
1465
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001466 def test_read_ready(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001467 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001468
1469 self.sock.recvfrom.return_value = (b'data', ('0.0.0.0', 1234))
1470 transport._read_ready()
1471
1472 self.protocol.datagram_received.assert_called_with(
1473 b'data', ('0.0.0.0', 1234))
1474
1475 def test_read_ready_tryagain(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001476 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001477
1478 self.sock.recvfrom.side_effect = BlockingIOError
Victor Stinner24ba2032014-02-26 10:25:02 +01001479 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001480 transport._read_ready()
1481
1482 self.assertFalse(transport._fatal_error.called)
1483
1484 def test_read_ready_err(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001485 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001486
Guido van Rossum2335de72013-11-15 16:51:48 -08001487 err = self.sock.recvfrom.side_effect = RuntimeError()
Victor Stinner24ba2032014-02-26 10:25:02 +01001488 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001489 transport._read_ready()
1490
Victor Stinner065ca252014-02-19 01:40:41 +01001491 transport._fatal_error.assert_called_with(
1492 err,
1493 'Fatal read error on datagram transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001494
Guido van Rossum2335de72013-11-15 16:51:48 -08001495 def test_read_ready_oserr(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001496 transport = self.datagram_transport()
Guido van Rossum2335de72013-11-15 16:51:48 -08001497
1498 err = self.sock.recvfrom.side_effect = OSError()
Victor Stinner24ba2032014-02-26 10:25:02 +01001499 transport._fatal_error = mock.Mock()
Guido van Rossum2335de72013-11-15 16:51:48 -08001500 transport._read_ready()
1501
1502 self.assertFalse(transport._fatal_error.called)
1503 self.protocol.error_received.assert_called_with(err)
1504
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001505 def test_sendto(self):
1506 data = b'data'
Victor Stinner02392c92015-01-15 13:18:32 +01001507 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001508 transport.sendto(data, ('0.0.0.0', 1234))
1509 self.assertTrue(self.sock.sendto.called)
1510 self.assertEqual(
1511 self.sock.sendto.call_args[0], (data, ('0.0.0.0', 1234)))
1512
Guido van Rossuma5062c52013-11-27 14:12:48 -08001513 def test_sendto_bytearray(self):
1514 data = bytearray(b'data')
Victor Stinner02392c92015-01-15 13:18:32 +01001515 transport = self.datagram_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001516 transport.sendto(data, ('0.0.0.0', 1234))
1517 self.assertTrue(self.sock.sendto.called)
1518 self.assertEqual(
1519 self.sock.sendto.call_args[0], (data, ('0.0.0.0', 1234)))
1520
1521 def test_sendto_memoryview(self):
1522 data = memoryview(b'data')
Victor Stinner02392c92015-01-15 13:18:32 +01001523 transport = self.datagram_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001524 transport.sendto(data, ('0.0.0.0', 1234))
1525 self.assertTrue(self.sock.sendto.called)
1526 self.assertEqual(
1527 self.sock.sendto.call_args[0], (data, ('0.0.0.0', 1234)))
1528
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001529 def test_sendto_no_data(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001530 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001531 transport._buffer.append((b'data', ('0.0.0.0', 12345)))
1532 transport.sendto(b'', ())
1533 self.assertFalse(self.sock.sendto.called)
1534 self.assertEqual(
1535 [(b'data', ('0.0.0.0', 12345))], list(transport._buffer))
1536
1537 def test_sendto_buffer(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001538 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001539 transport._buffer.append((b'data1', ('0.0.0.0', 12345)))
1540 transport.sendto(b'data2', ('0.0.0.0', 12345))
1541 self.assertFalse(self.sock.sendto.called)
1542 self.assertEqual(
1543 [(b'data1', ('0.0.0.0', 12345)),
1544 (b'data2', ('0.0.0.0', 12345))],
1545 list(transport._buffer))
1546
Guido van Rossuma5062c52013-11-27 14:12:48 -08001547 def test_sendto_buffer_bytearray(self):
1548 data2 = bytearray(b'data2')
Victor Stinner02392c92015-01-15 13:18:32 +01001549 transport = self.datagram_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001550 transport._buffer.append((b'data1', ('0.0.0.0', 12345)))
1551 transport.sendto(data2, ('0.0.0.0', 12345))
1552 self.assertFalse(self.sock.sendto.called)
1553 self.assertEqual(
1554 [(b'data1', ('0.0.0.0', 12345)),
1555 (b'data2', ('0.0.0.0', 12345))],
1556 list(transport._buffer))
1557 self.assertIsInstance(transport._buffer[1][0], bytes)
1558
1559 def test_sendto_buffer_memoryview(self):
1560 data2 = memoryview(b'data2')
Victor Stinner02392c92015-01-15 13:18:32 +01001561 transport = self.datagram_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001562 transport._buffer.append((b'data1', ('0.0.0.0', 12345)))
1563 transport.sendto(data2, ('0.0.0.0', 12345))
1564 self.assertFalse(self.sock.sendto.called)
1565 self.assertEqual(
1566 [(b'data1', ('0.0.0.0', 12345)),
1567 (b'data2', ('0.0.0.0', 12345))],
1568 list(transport._buffer))
1569 self.assertIsInstance(transport._buffer[1][0], bytes)
1570
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001571 def test_sendto_tryagain(self):
1572 data = b'data'
1573
1574 self.sock.sendto.side_effect = BlockingIOError
1575
Victor Stinner02392c92015-01-15 13:18:32 +01001576 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001577 transport.sendto(data, ('0.0.0.0', 12345))
1578
1579 self.loop.assert_writer(7, transport._sendto_ready)
1580 self.assertEqual(
1581 [(b'data', ('0.0.0.0', 12345))], list(transport._buffer))
1582
Victor Stinner24ba2032014-02-26 10:25:02 +01001583 @mock.patch('asyncio.selector_events.logger')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001584 def test_sendto_exception(self, m_log):
1585 data = b'data'
Guido van Rossum2335de72013-11-15 16:51:48 -08001586 err = self.sock.sendto.side_effect = RuntimeError()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001587
Victor Stinner02392c92015-01-15 13:18:32 +01001588 transport = self.datagram_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +01001589 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001590 transport.sendto(data, ())
1591
1592 self.assertTrue(transport._fatal_error.called)
Victor Stinner065ca252014-02-19 01:40:41 +01001593 transport._fatal_error.assert_called_with(
1594 err,
1595 'Fatal write error on datagram transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001596 transport._conn_lost = 1
1597
1598 transport._address = ('123',)
1599 transport.sendto(data)
1600 transport.sendto(data)
1601 transport.sendto(data)
1602 transport.sendto(data)
1603 transport.sendto(data)
1604 m_log.warning.assert_called_with('socket.send() raised exception.')
1605
Guido van Rossum2335de72013-11-15 16:51:48 -08001606 def test_sendto_error_received(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001607 data = b'data'
1608
1609 self.sock.sendto.side_effect = ConnectionRefusedError
1610
Victor Stinner02392c92015-01-15 13:18:32 +01001611 transport = self.datagram_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +01001612 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001613 transport.sendto(data, ())
1614
1615 self.assertEqual(transport._conn_lost, 0)
1616 self.assertFalse(transport._fatal_error.called)
1617
Guido van Rossum2335de72013-11-15 16:51:48 -08001618 def test_sendto_error_received_connected(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001619 data = b'data'
1620
1621 self.sock.send.side_effect = ConnectionRefusedError
1622
Victor Stinner02392c92015-01-15 13:18:32 +01001623 transport = self.datagram_transport(address=('0.0.0.0', 1))
Victor Stinner24ba2032014-02-26 10:25:02 +01001624 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001625 transport.sendto(data)
1626
Guido van Rossum2335de72013-11-15 16:51:48 -08001627 self.assertFalse(transport._fatal_error.called)
1628 self.assertTrue(self.protocol.error_received.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001629
1630 def test_sendto_str(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001631 transport = self.datagram_transport()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001632 self.assertRaises(TypeError, transport.sendto, 'str', ())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001633
1634 def test_sendto_connected_addr(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001635 transport = self.datagram_transport(address=('0.0.0.0', 1))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001636 self.assertRaises(
Guido van Rossuma5062c52013-11-27 14:12:48 -08001637 ValueError, transport.sendto, b'str', ('0.0.0.0', 2))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001638
1639 def test_sendto_closing(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001640 transport = self.datagram_transport(address=(1,))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001641 transport.close()
1642 self.assertEqual(transport._conn_lost, 1)
1643 transport.sendto(b'data', (1,))
1644 self.assertEqual(transport._conn_lost, 2)
1645
1646 def test_sendto_ready(self):
1647 data = b'data'
1648 self.sock.sendto.return_value = len(data)
1649
Victor Stinner02392c92015-01-15 13:18:32 +01001650 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001651 transport._buffer.append((data, ('0.0.0.0', 12345)))
1652 self.loop.add_writer(7, transport._sendto_ready)
1653 transport._sendto_ready()
1654 self.assertTrue(self.sock.sendto.called)
1655 self.assertEqual(
1656 self.sock.sendto.call_args[0], (data, ('0.0.0.0', 12345)))
1657 self.assertFalse(self.loop.writers)
1658
1659 def test_sendto_ready_closing(self):
1660 data = b'data'
1661 self.sock.send.return_value = len(data)
1662
Victor Stinner02392c92015-01-15 13:18:32 +01001663 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001664 transport._closing = True
1665 transport._buffer.append((data, ()))
1666 self.loop.add_writer(7, transport._sendto_ready)
1667 transport._sendto_ready()
1668 self.sock.sendto.assert_called_with(data, ())
1669 self.assertFalse(self.loop.writers)
1670 self.sock.close.assert_called_with()
1671 self.protocol.connection_lost.assert_called_with(None)
1672
1673 def test_sendto_ready_no_data(self):
Victor Stinner02392c92015-01-15 13:18:32 +01001674 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001675 self.loop.add_writer(7, transport._sendto_ready)
1676 transport._sendto_ready()
1677 self.assertFalse(self.sock.sendto.called)
1678 self.assertFalse(self.loop.writers)
1679
1680 def test_sendto_ready_tryagain(self):
1681 self.sock.sendto.side_effect = BlockingIOError
1682
Victor Stinner02392c92015-01-15 13:18:32 +01001683 transport = self.datagram_transport()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001684 transport._buffer.extend([(b'data1', ()), (b'data2', ())])
1685 self.loop.add_writer(7, transport._sendto_ready)
1686 transport._sendto_ready()
1687
1688 self.loop.assert_writer(7, transport._sendto_ready)
1689 self.assertEqual(
1690 [(b'data1', ()), (b'data2', ())],
1691 list(transport._buffer))
1692
1693 def test_sendto_ready_exception(self):
Guido van Rossum2335de72013-11-15 16:51:48 -08001694 err = self.sock.sendto.side_effect = RuntimeError()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001695
Victor Stinner02392c92015-01-15 13:18:32 +01001696 transport = self.datagram_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +01001697 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001698 transport._buffer.append((b'data', ()))
1699 transport._sendto_ready()
1700
Victor Stinner065ca252014-02-19 01:40:41 +01001701 transport._fatal_error.assert_called_with(
1702 err,
1703 'Fatal write error on datagram transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001704
Guido van Rossum2335de72013-11-15 16:51:48 -08001705 def test_sendto_ready_error_received(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001706 self.sock.sendto.side_effect = ConnectionRefusedError
1707
Victor Stinner02392c92015-01-15 13:18:32 +01001708 transport = self.datagram_transport()
Victor Stinner24ba2032014-02-26 10:25:02 +01001709 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001710 transport._buffer.append((b'data', ()))
1711 transport._sendto_ready()
1712
1713 self.assertFalse(transport._fatal_error.called)
1714
Guido van Rossum2335de72013-11-15 16:51:48 -08001715 def test_sendto_ready_error_received_connection(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001716 self.sock.send.side_effect = ConnectionRefusedError
1717
Victor Stinner02392c92015-01-15 13:18:32 +01001718 transport = self.datagram_transport(address=('0.0.0.0', 1))
Victor Stinner24ba2032014-02-26 10:25:02 +01001719 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001720 transport._buffer.append((b'data', ()))
1721 transport._sendto_ready()
1722
Guido van Rossum2335de72013-11-15 16:51:48 -08001723 self.assertFalse(transport._fatal_error.called)
1724 self.assertTrue(self.protocol.error_received.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001725
Victor Stinner24ba2032014-02-26 10:25:02 +01001726 @mock.patch('asyncio.base_events.logger.error')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001727 def test_fatal_error_connected(self, m_exc):
Victor Stinner02392c92015-01-15 13:18:32 +01001728 transport = self.datagram_transport(address=('0.0.0.0', 1))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001729 err = ConnectionRefusedError()
1730 transport._fatal_error(err)
Guido van Rossum2335de72013-11-15 16:51:48 -08001731 self.assertFalse(self.protocol.error_received.called)
Yury Selivanovff827f02014-02-18 18:02:19 -05001732 m_exc.assert_called_with(
1733 test_utils.MockPattern(
Victor Stinner065ca252014-02-19 01:40:41 +01001734 'Fatal error on transport\nprotocol:.*\ntransport:.*'),
Yury Selivanovff827f02014-02-18 18:02:19 -05001735 exc_info=(ConnectionRefusedError, MOCK_ANY, MOCK_ANY))
Antoine Pitroucb1fe982013-10-20 21:02:53 +02001736
1737
1738if __name__ == '__main__':
1739 unittest.main()