blob: d7fafab691718eda28030903a93853a81078b16b [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
4import gc
5import pprint
6import socket
7import sys
8import unittest
Victor Stinner24ba2032014-02-26 10:25:02 +01009from unittest import mock
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070010try:
11 import ssl
12except ImportError:
13 ssl = None
14
Victor Stinner8dffc452014-01-25 15:32:06 +010015import asyncio
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070016from asyncio import selectors
17from asyncio import test_utils
Victor Stinner128ee222014-01-25 22:22:18 +010018from asyncio.selector_events import BaseSelectorEventLoop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070019from asyncio.selector_events import _SelectorTransport
20from asyncio.selector_events import _SelectorSslTransport
21from asyncio.selector_events import _SelectorSocketTransport
22from asyncio.selector_events import _SelectorDatagramTransport
23
24
Victor Stinner24ba2032014-02-26 10:25:02 +010025MOCK_ANY = mock.ANY
Yury Selivanovff827f02014-02-18 18:02:19 -050026
27
Victor Stinner128ee222014-01-25 22:22:18 +010028class TestBaseSelectorEventLoop(BaseSelectorEventLoop):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070029
30 def _make_self_pipe(self):
Victor Stinner24ba2032014-02-26 10:25:02 +010031 self._ssock = mock.Mock()
32 self._csock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070033 self._internal_fds += 1
34
35
Guido van Rossuma5062c52013-11-27 14:12:48 -080036def list_to_buffer(l=()):
37 return bytearray().join(l)
38
39
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070040class BaseSelectorEventLoopTests(unittest.TestCase):
41
42 def setUp(self):
Victor Stinner24ba2032014-02-26 10:25:02 +010043 selector = mock.Mock()
Victor Stinnerf67255a2014-01-25 15:01:33 +010044 self.loop = TestBaseSelectorEventLoop(selector)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070045
46 def test_make_socket_transport(self):
Victor Stinner24ba2032014-02-26 10:25:02 +010047 m = mock.Mock()
48 self.loop.add_reader = mock.Mock()
Victor Stinnera1254972014-02-11 11:34:30 +010049 transport = self.loop._make_socket_transport(m, asyncio.Protocol())
50 self.assertIsInstance(transport, _SelectorSocketTransport)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070051
Guido van Rossum28dff0d2013-11-01 14:22:30 -070052 @unittest.skipIf(ssl is None, 'No ssl module')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070053 def test_make_ssl_transport(self):
Victor Stinner24ba2032014-02-26 10:25:02 +010054 m = mock.Mock()
55 self.loop.add_reader = mock.Mock()
56 self.loop.add_writer = mock.Mock()
57 self.loop.remove_reader = mock.Mock()
58 self.loop.remove_writer = mock.Mock()
Victor Stinnera1254972014-02-11 11:34:30 +010059 waiter = asyncio.Future(loop=self.loop)
Yury Selivanov88a5bf02014-02-18 12:15:06 -050060 transport = self.loop._make_ssl_transport(
61 m, asyncio.Protocol(), m, waiter)
Victor Stinnera1254972014-02-11 11:34:30 +010062 self.assertIsInstance(transport, _SelectorSslTransport)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070063
Victor Stinner24ba2032014-02-26 10:25:02 +010064 @mock.patch('asyncio.selector_events.ssl', None)
Guido van Rossum28dff0d2013-11-01 14:22:30 -070065 def test_make_ssl_transport_without_ssl_error(self):
Victor Stinner24ba2032014-02-26 10:25:02 +010066 m = mock.Mock()
67 self.loop.add_reader = mock.Mock()
68 self.loop.add_writer = mock.Mock()
69 self.loop.remove_reader = mock.Mock()
70 self.loop.remove_writer = mock.Mock()
Guido van Rossum28dff0d2013-11-01 14:22:30 -070071 with self.assertRaises(RuntimeError):
72 self.loop._make_ssl_transport(m, m, m, m)
73
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070074 def test_close(self):
75 ssock = self.loop._ssock
76 ssock.fileno.return_value = 7
77 csock = self.loop._csock
78 csock.fileno.return_value = 1
Victor Stinner24ba2032014-02-26 10:25:02 +010079 remove_reader = self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070080
81 self.loop._selector.close()
Victor Stinner24ba2032014-02-26 10:25:02 +010082 self.loop._selector = selector = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070083 self.loop.close()
84 self.assertIsNone(self.loop._selector)
85 self.assertIsNone(self.loop._csock)
86 self.assertIsNone(self.loop._ssock)
87 selector.close.assert_called_with()
88 ssock.close.assert_called_with()
89 csock.close.assert_called_with()
90 remove_reader.assert_called_with(7)
91
92 self.loop.close()
93 self.loop.close()
94
95 def test_close_no_selector(self):
96 ssock = self.loop._ssock
97 csock = self.loop._csock
Victor Stinner24ba2032014-02-26 10:25:02 +010098 remove_reader = self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070099
100 self.loop._selector.close()
101 self.loop._selector = None
102 self.loop.close()
103 self.assertIsNone(self.loop._selector)
104 self.assertFalse(ssock.close.called)
105 self.assertFalse(csock.close.called)
106 self.assertFalse(remove_reader.called)
107
108 def test_socketpair(self):
109 self.assertRaises(NotImplementedError, self.loop._socketpair)
110
111 def test_read_from_self_tryagain(self):
112 self.loop._ssock.recv.side_effect = BlockingIOError
113 self.assertIsNone(self.loop._read_from_self())
114
115 def test_read_from_self_exception(self):
116 self.loop._ssock.recv.side_effect = OSError
117 self.assertRaises(OSError, self.loop._read_from_self)
118
119 def test_write_to_self_tryagain(self):
120 self.loop._csock.send.side_effect = BlockingIOError
121 self.assertIsNone(self.loop._write_to_self())
122
123 def test_write_to_self_exception(self):
Guido van Rossum3d139d82014-05-06 14:42:40 -0700124 # _write_to_self() swallows OSError
125 self.loop._csock.send.side_effect = RuntimeError()
126 self.assertRaises(RuntimeError, self.loop._write_to_self)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700127
128 def test_sock_recv(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100129 sock = mock.Mock()
130 self.loop._sock_recv = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700131
132 f = self.loop.sock_recv(sock, 1024)
Victor Stinner8dffc452014-01-25 15:32:06 +0100133 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700134 self.loop._sock_recv.assert_called_with(f, False, sock, 1024)
135
136 def test__sock_recv_canceled_fut(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100137 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700138
Victor Stinner8dffc452014-01-25 15:32:06 +0100139 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700140 f.cancel()
141
142 self.loop._sock_recv(f, False, sock, 1024)
143 self.assertFalse(sock.recv.called)
144
145 def test__sock_recv_unregister(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100146 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700147 sock.fileno.return_value = 10
148
Victor Stinner8dffc452014-01-25 15:32:06 +0100149 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700150 f.cancel()
151
Victor Stinner24ba2032014-02-26 10:25:02 +0100152 self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700153 self.loop._sock_recv(f, True, sock, 1024)
154 self.assertEqual((10,), self.loop.remove_reader.call_args[0])
155
156 def test__sock_recv_tryagain(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100157 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100158 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700159 sock.fileno.return_value = 10
160 sock.recv.side_effect = BlockingIOError
161
Victor Stinner24ba2032014-02-26 10:25:02 +0100162 self.loop.add_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700163 self.loop._sock_recv(f, False, sock, 1024)
164 self.assertEqual((10, self.loop._sock_recv, f, True, sock, 1024),
165 self.loop.add_reader.call_args[0])
166
167 def test__sock_recv_exception(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100168 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100169 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700170 sock.fileno.return_value = 10
171 err = sock.recv.side_effect = OSError()
172
173 self.loop._sock_recv(f, False, sock, 1024)
174 self.assertIs(err, f.exception())
175
176 def test_sock_sendall(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100177 sock = mock.Mock()
178 self.loop._sock_sendall = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700179
180 f = self.loop.sock_sendall(sock, b'data')
Victor Stinner8dffc452014-01-25 15:32:06 +0100181 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700182 self.assertEqual(
183 (f, False, sock, b'data'),
184 self.loop._sock_sendall.call_args[0])
185
186 def test_sock_sendall_nodata(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100187 sock = mock.Mock()
188 self.loop._sock_sendall = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700189
190 f = self.loop.sock_sendall(sock, b'')
Victor Stinner8dffc452014-01-25 15:32:06 +0100191 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700192 self.assertTrue(f.done())
193 self.assertIsNone(f.result())
194 self.assertFalse(self.loop._sock_sendall.called)
195
196 def test__sock_sendall_canceled_fut(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100197 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700198
Victor Stinner8dffc452014-01-25 15:32:06 +0100199 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700200 f.cancel()
201
202 self.loop._sock_sendall(f, False, sock, b'data')
203 self.assertFalse(sock.send.called)
204
205 def test__sock_sendall_unregister(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100206 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700207 sock.fileno.return_value = 10
208
Victor Stinner8dffc452014-01-25 15:32:06 +0100209 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700210 f.cancel()
211
Victor Stinner24ba2032014-02-26 10:25:02 +0100212 self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700213 self.loop._sock_sendall(f, True, sock, b'data')
214 self.assertEqual((10,), self.loop.remove_writer.call_args[0])
215
216 def test__sock_sendall_tryagain(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100217 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100218 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700219 sock.fileno.return_value = 10
220 sock.send.side_effect = BlockingIOError
221
Victor Stinner24ba2032014-02-26 10:25:02 +0100222 self.loop.add_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700223 self.loop._sock_sendall(f, False, sock, b'data')
224 self.assertEqual(
225 (10, self.loop._sock_sendall, f, True, sock, b'data'),
226 self.loop.add_writer.call_args[0])
227
228 def test__sock_sendall_interrupted(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100229 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100230 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700231 sock.fileno.return_value = 10
232 sock.send.side_effect = InterruptedError
233
Victor Stinner24ba2032014-02-26 10:25:02 +0100234 self.loop.add_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700235 self.loop._sock_sendall(f, False, sock, b'data')
236 self.assertEqual(
237 (10, self.loop._sock_sendall, f, True, sock, b'data'),
238 self.loop.add_writer.call_args[0])
239
240 def test__sock_sendall_exception(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100241 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100242 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700243 sock.fileno.return_value = 10
244 err = sock.send.side_effect = OSError()
245
246 self.loop._sock_sendall(f, False, sock, b'data')
247 self.assertIs(f.exception(), err)
248
249 def test__sock_sendall(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100250 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700251
Victor Stinner8dffc452014-01-25 15:32:06 +0100252 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700253 sock.fileno.return_value = 10
254 sock.send.return_value = 4
255
256 self.loop._sock_sendall(f, False, sock, b'data')
257 self.assertTrue(f.done())
258 self.assertIsNone(f.result())
259
260 def test__sock_sendall_partial(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100261 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700262
Victor Stinner8dffc452014-01-25 15:32:06 +0100263 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700264 sock.fileno.return_value = 10
265 sock.send.return_value = 2
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.assertFalse(f.done())
270 self.assertEqual(
271 (10, self.loop._sock_sendall, f, True, sock, b'ta'),
272 self.loop.add_writer.call_args[0])
273
274 def test__sock_sendall_none(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100275 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700276
Victor Stinner8dffc452014-01-25 15:32:06 +0100277 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700278 sock.fileno.return_value = 10
279 sock.send.return_value = 0
280
Victor Stinner24ba2032014-02-26 10:25:02 +0100281 self.loop.add_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700282 self.loop._sock_sendall(f, False, sock, b'data')
283 self.assertFalse(f.done())
284 self.assertEqual(
285 (10, self.loop._sock_sendall, f, True, sock, b'data'),
286 self.loop.add_writer.call_args[0])
287
288 def test_sock_connect(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100289 sock = mock.Mock()
290 self.loop._sock_connect = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700291
292 f = self.loop.sock_connect(sock, ('127.0.0.1', 8080))
Victor Stinner8dffc452014-01-25 15:32:06 +0100293 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700294 self.assertEqual(
295 (f, False, sock, ('127.0.0.1', 8080)),
296 self.loop._sock_connect.call_args[0])
297
298 def test__sock_connect(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100299 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700300
Victor Stinner24ba2032014-02-26 10:25:02 +0100301 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700302 sock.fileno.return_value = 10
303
304 self.loop._sock_connect(f, False, sock, ('127.0.0.1', 8080))
305 self.assertTrue(f.done())
306 self.assertIsNone(f.result())
307 self.assertTrue(sock.connect.called)
308
309 def test__sock_connect_canceled_fut(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100310 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700311
Victor Stinner8dffc452014-01-25 15:32:06 +0100312 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700313 f.cancel()
314
315 self.loop._sock_connect(f, False, sock, ('127.0.0.1', 8080))
316 self.assertFalse(sock.connect.called)
317
318 def test__sock_connect_unregister(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100319 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700320 sock.fileno.return_value = 10
321
Victor Stinner8dffc452014-01-25 15:32:06 +0100322 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700323 f.cancel()
324
Victor Stinner24ba2032014-02-26 10:25:02 +0100325 self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700326 self.loop._sock_connect(f, True, sock, ('127.0.0.1', 8080))
327 self.assertEqual((10,), self.loop.remove_writer.call_args[0])
328
329 def test__sock_connect_tryagain(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100330 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100331 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700332 sock.fileno.return_value = 10
333 sock.getsockopt.return_value = errno.EAGAIN
334
Victor Stinner24ba2032014-02-26 10:25:02 +0100335 self.loop.add_writer = mock.Mock()
336 self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700337
338 self.loop._sock_connect(f, True, sock, ('127.0.0.1', 8080))
339 self.assertEqual(
340 (10, self.loop._sock_connect, f,
341 True, sock, ('127.0.0.1', 8080)),
342 self.loop.add_writer.call_args[0])
343
344 def test__sock_connect_exception(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100345 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100346 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700347 sock.fileno.return_value = 10
348 sock.getsockopt.return_value = errno.ENOTCONN
349
Victor Stinner24ba2032014-02-26 10:25:02 +0100350 self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700351 self.loop._sock_connect(f, True, sock, ('127.0.0.1', 8080))
352 self.assertIsInstance(f.exception(), OSError)
353
354 def test_sock_accept(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100355 sock = mock.Mock()
356 self.loop._sock_accept = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700357
358 f = self.loop.sock_accept(sock)
Victor Stinner8dffc452014-01-25 15:32:06 +0100359 self.assertIsInstance(f, asyncio.Future)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700360 self.assertEqual(
361 (f, False, sock), self.loop._sock_accept.call_args[0])
362
363 def test__sock_accept(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100364 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700365
Victor Stinner24ba2032014-02-26 10:25:02 +0100366 conn = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700367
Victor Stinner24ba2032014-02-26 10:25:02 +0100368 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700369 sock.fileno.return_value = 10
370 sock.accept.return_value = conn, ('127.0.0.1', 1000)
371
372 self.loop._sock_accept(f, False, sock)
373 self.assertTrue(f.done())
374 self.assertEqual((conn, ('127.0.0.1', 1000)), f.result())
375 self.assertEqual((False,), conn.setblocking.call_args[0])
376
377 def test__sock_accept_canceled_fut(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100378 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700379
Victor Stinner8dffc452014-01-25 15:32:06 +0100380 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700381 f.cancel()
382
383 self.loop._sock_accept(f, False, sock)
384 self.assertFalse(sock.accept.called)
385
386 def test__sock_accept_unregister(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100387 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700388 sock.fileno.return_value = 10
389
Victor Stinner8dffc452014-01-25 15:32:06 +0100390 f = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700391 f.cancel()
392
Victor Stinner24ba2032014-02-26 10:25:02 +0100393 self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700394 self.loop._sock_accept(f, True, sock)
395 self.assertEqual((10,), self.loop.remove_reader.call_args[0])
396
397 def test__sock_accept_tryagain(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100398 f = asyncio.Future(loop=self.loop)
Victor Stinner24ba2032014-02-26 10:25:02 +0100399 sock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700400 sock.fileno.return_value = 10
401 sock.accept.side_effect = BlockingIOError
402
Victor Stinner24ba2032014-02-26 10:25:02 +0100403 self.loop.add_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700404 self.loop._sock_accept(f, False, sock)
405 self.assertEqual(
406 (10, self.loop._sock_accept, f, True, sock),
407 self.loop.add_reader.call_args[0])
408
409 def test__sock_accept_exception(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 err = sock.accept.side_effect = OSError()
414
415 self.loop._sock_accept(f, False, sock)
416 self.assertIs(err, f.exception())
417
418 def test_add_reader(self):
419 self.loop._selector.get_key.side_effect = KeyError
420 cb = lambda: True
421 self.loop.add_reader(1, cb)
422
423 self.assertTrue(self.loop._selector.register.called)
424 fd, mask, (r, w) = self.loop._selector.register.call_args[0]
425 self.assertEqual(1, fd)
426 self.assertEqual(selectors.EVENT_READ, mask)
427 self.assertEqual(cb, r._callback)
428 self.assertIsNone(w)
429
430 def test_add_reader_existing(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100431 reader = mock.Mock()
432 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700433 self.loop._selector.get_key.return_value = selectors.SelectorKey(
434 1, 1, selectors.EVENT_WRITE, (reader, writer))
435 cb = lambda: True
436 self.loop.add_reader(1, cb)
437
438 self.assertTrue(reader.cancel.called)
439 self.assertFalse(self.loop._selector.register.called)
440 self.assertTrue(self.loop._selector.modify.called)
441 fd, mask, (r, w) = self.loop._selector.modify.call_args[0]
442 self.assertEqual(1, fd)
443 self.assertEqual(selectors.EVENT_WRITE | selectors.EVENT_READ, mask)
444 self.assertEqual(cb, r._callback)
445 self.assertEqual(writer, w)
446
447 def test_add_reader_existing_writer(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100448 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700449 self.loop._selector.get_key.return_value = selectors.SelectorKey(
450 1, 1, selectors.EVENT_WRITE, (None, writer))
451 cb = lambda: True
452 self.loop.add_reader(1, cb)
453
454 self.assertFalse(self.loop._selector.register.called)
455 self.assertTrue(self.loop._selector.modify.called)
456 fd, mask, (r, w) = self.loop._selector.modify.call_args[0]
457 self.assertEqual(1, fd)
458 self.assertEqual(selectors.EVENT_WRITE | selectors.EVENT_READ, mask)
459 self.assertEqual(cb, r._callback)
460 self.assertEqual(writer, w)
461
462 def test_remove_reader(self):
463 self.loop._selector.get_key.return_value = selectors.SelectorKey(
464 1, 1, selectors.EVENT_READ, (None, None))
465 self.assertFalse(self.loop.remove_reader(1))
466
467 self.assertTrue(self.loop._selector.unregister.called)
468
469 def test_remove_reader_read_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100470 reader = mock.Mock()
471 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700472 self.loop._selector.get_key.return_value = selectors.SelectorKey(
473 1, 1, selectors.EVENT_READ | selectors.EVENT_WRITE,
474 (reader, writer))
475 self.assertTrue(
476 self.loop.remove_reader(1))
477
478 self.assertFalse(self.loop._selector.unregister.called)
479 self.assertEqual(
480 (1, selectors.EVENT_WRITE, (None, writer)),
481 self.loop._selector.modify.call_args[0])
482
483 def test_remove_reader_unknown(self):
484 self.loop._selector.get_key.side_effect = KeyError
485 self.assertFalse(
486 self.loop.remove_reader(1))
487
488 def test_add_writer(self):
489 self.loop._selector.get_key.side_effect = KeyError
490 cb = lambda: True
491 self.loop.add_writer(1, cb)
492
493 self.assertTrue(self.loop._selector.register.called)
494 fd, mask, (r, w) = self.loop._selector.register.call_args[0]
495 self.assertEqual(1, fd)
496 self.assertEqual(selectors.EVENT_WRITE, mask)
497 self.assertIsNone(r)
498 self.assertEqual(cb, w._callback)
499
500 def test_add_writer_existing(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100501 reader = mock.Mock()
502 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700503 self.loop._selector.get_key.return_value = selectors.SelectorKey(
504 1, 1, selectors.EVENT_READ, (reader, writer))
505 cb = lambda: True
506 self.loop.add_writer(1, cb)
507
508 self.assertTrue(writer.cancel.called)
509 self.assertFalse(self.loop._selector.register.called)
510 self.assertTrue(self.loop._selector.modify.called)
511 fd, mask, (r, w) = self.loop._selector.modify.call_args[0]
512 self.assertEqual(1, fd)
513 self.assertEqual(selectors.EVENT_WRITE | selectors.EVENT_READ, mask)
514 self.assertEqual(reader, r)
515 self.assertEqual(cb, w._callback)
516
517 def test_remove_writer(self):
518 self.loop._selector.get_key.return_value = selectors.SelectorKey(
519 1, 1, selectors.EVENT_WRITE, (None, None))
520 self.assertFalse(self.loop.remove_writer(1))
521
522 self.assertTrue(self.loop._selector.unregister.called)
523
524 def test_remove_writer_read_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100525 reader = mock.Mock()
526 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700527 self.loop._selector.get_key.return_value = selectors.SelectorKey(
528 1, 1, selectors.EVENT_READ | selectors.EVENT_WRITE,
529 (reader, writer))
530 self.assertTrue(
531 self.loop.remove_writer(1))
532
533 self.assertFalse(self.loop._selector.unregister.called)
534 self.assertEqual(
535 (1, selectors.EVENT_READ, (reader, None)),
536 self.loop._selector.modify.call_args[0])
537
538 def test_remove_writer_unknown(self):
539 self.loop._selector.get_key.side_effect = KeyError
540 self.assertFalse(
541 self.loop.remove_writer(1))
542
543 def test_process_events_read(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100544 reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700545 reader._cancelled = False
546
Victor Stinner24ba2032014-02-26 10:25:02 +0100547 self.loop._add_callback = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700548 self.loop._process_events(
549 [(selectors.SelectorKey(
550 1, 1, selectors.EVENT_READ, (reader, None)),
551 selectors.EVENT_READ)])
552 self.assertTrue(self.loop._add_callback.called)
553 self.loop._add_callback.assert_called_with(reader)
554
555 def test_process_events_read_cancelled(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100556 reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700557 reader.cancelled = True
558
Victor Stinner24ba2032014-02-26 10:25:02 +0100559 self.loop.remove_reader = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700560 self.loop._process_events(
561 [(selectors.SelectorKey(
562 1, 1, selectors.EVENT_READ, (reader, None)),
563 selectors.EVENT_READ)])
564 self.loop.remove_reader.assert_called_with(1)
565
566 def test_process_events_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100567 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700568 writer._cancelled = False
569
Victor Stinner24ba2032014-02-26 10:25:02 +0100570 self.loop._add_callback = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700571 self.loop._process_events(
572 [(selectors.SelectorKey(1, 1, selectors.EVENT_WRITE,
573 (None, writer)),
574 selectors.EVENT_WRITE)])
575 self.loop._add_callback.assert_called_with(writer)
576
577 def test_process_events_write_cancelled(self):
Victor Stinner24ba2032014-02-26 10:25:02 +0100578 writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700579 writer.cancelled = True
Victor Stinner24ba2032014-02-26 10:25:02 +0100580 self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700581
582 self.loop._process_events(
583 [(selectors.SelectorKey(1, 1, selectors.EVENT_WRITE,
584 (None, writer)),
585 selectors.EVENT_WRITE)])
586 self.loop.remove_writer.assert_called_with(1)
587
588
589class SelectorTransportTests(unittest.TestCase):
590
591 def setUp(self):
592 self.loop = test_utils.TestLoop()
Victor Stinner8dffc452014-01-25 15:32:06 +0100593 self.protocol = test_utils.make_test_protocol(asyncio.Protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100594 self.sock = mock.Mock(socket.socket)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700595 self.sock.fileno.return_value = 7
596
597 def test_ctor(self):
598 tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
599 self.assertIs(tr._loop, self.loop)
600 self.assertIs(tr._sock, self.sock)
601 self.assertIs(tr._sock_fd, 7)
602
603 def test_abort(self):
604 tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
Victor Stinner24ba2032014-02-26 10:25:02 +0100605 tr._force_close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700606
607 tr.abort()
608 tr._force_close.assert_called_with(None)
609
610 def test_close(self):
611 tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
612 tr.close()
613
614 self.assertTrue(tr._closing)
615 self.assertEqual(1, self.loop.remove_reader_count[7])
616 self.protocol.connection_lost(None)
617 self.assertEqual(tr._conn_lost, 1)
618
619 tr.close()
620 self.assertEqual(tr._conn_lost, 1)
621 self.assertEqual(1, self.loop.remove_reader_count[7])
622
623 def test_close_write_buffer(self):
624 tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800625 tr._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700626 tr.close()
627
628 self.assertFalse(self.loop.readers)
629 test_utils.run_briefly(self.loop)
630 self.assertFalse(self.protocol.connection_lost.called)
631
632 def test_force_close(self):
633 tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800634 tr._buffer.extend(b'1')
Victor Stinner24ba2032014-02-26 10:25:02 +0100635 self.loop.add_reader(7, mock.sentinel)
636 self.loop.add_writer(7, mock.sentinel)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700637 tr._force_close(None)
638
639 self.assertTrue(tr._closing)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800640 self.assertEqual(tr._buffer, list_to_buffer())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700641 self.assertFalse(self.loop.readers)
642 self.assertFalse(self.loop.writers)
643
644 # second close should not remove reader
645 tr._force_close(None)
646 self.assertFalse(self.loop.readers)
647 self.assertEqual(1, self.loop.remove_reader_count[7])
648
Victor Stinner24ba2032014-02-26 10:25:02 +0100649 @mock.patch('asyncio.log.logger.error')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700650 def test_fatal_error(self, m_exc):
651 exc = OSError()
652 tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
Victor Stinner24ba2032014-02-26 10:25:02 +0100653 tr._force_close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700654 tr._fatal_error(exc)
655
Yury Selivanovff827f02014-02-18 18:02:19 -0500656 m_exc.assert_called_with(
657 test_utils.MockPattern(
Victor Stinner065ca252014-02-19 01:40:41 +0100658 'Fatal error on transport\nprotocol:.*\ntransport:.*'),
Yury Selivanovff827f02014-02-18 18:02:19 -0500659 exc_info=(OSError, MOCK_ANY, MOCK_ANY))
660
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700661 tr._force_close.assert_called_with(exc)
662
663 def test_connection_lost(self):
664 exc = OSError()
665 tr = _SelectorTransport(self.loop, self.sock, self.protocol, None)
666 tr._call_connection_lost(exc)
667
668 self.protocol.connection_lost.assert_called_with(exc)
669 self.sock.close.assert_called_with()
670 self.assertIsNone(tr._sock)
671
672 self.assertIsNone(tr._protocol)
673 self.assertEqual(2, sys.getrefcount(self.protocol),
674 pprint.pformat(gc.get_referrers(self.protocol)))
675 self.assertIsNone(tr._loop)
676 self.assertEqual(2, sys.getrefcount(self.loop),
677 pprint.pformat(gc.get_referrers(self.loop)))
678
679
680class SelectorSocketTransportTests(unittest.TestCase):
681
682 def setUp(self):
683 self.loop = test_utils.TestLoop()
Victor Stinner8dffc452014-01-25 15:32:06 +0100684 self.protocol = test_utils.make_test_protocol(asyncio.Protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100685 self.sock = mock.Mock(socket.socket)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700686 self.sock_fd = self.sock.fileno.return_value = 7
687
688 def test_ctor(self):
689 tr = _SelectorSocketTransport(
690 self.loop, self.sock, self.protocol)
691 self.loop.assert_reader(7, tr._read_ready)
692 test_utils.run_briefly(self.loop)
693 self.protocol.connection_made.assert_called_with(tr)
694
695 def test_ctor_with_waiter(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100696 fut = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700697
698 _SelectorSocketTransport(
699 self.loop, self.sock, self.protocol, fut)
700 test_utils.run_briefly(self.loop)
701 self.assertIsNone(fut.result())
702
Guido van Rossum57497ad2013-10-18 07:58:20 -0700703 def test_pause_resume_reading(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700704 tr = _SelectorSocketTransport(
705 self.loop, self.sock, self.protocol)
706 self.assertFalse(tr._paused)
707 self.loop.assert_reader(7, tr._read_ready)
Guido van Rossum57497ad2013-10-18 07:58:20 -0700708 tr.pause_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700709 self.assertTrue(tr._paused)
710 self.assertFalse(7 in self.loop.readers)
Guido van Rossum57497ad2013-10-18 07:58:20 -0700711 tr.resume_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700712 self.assertFalse(tr._paused)
713 self.loop.assert_reader(7, tr._read_ready)
Andrew Svetlov3207a032014-05-27 21:24:43 +0300714 with self.assertRaises(RuntimeError):
715 tr.resume_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700716
717 def test_read_ready(self):
718 transport = _SelectorSocketTransport(
719 self.loop, self.sock, self.protocol)
720
721 self.sock.recv.return_value = b'data'
722 transport._read_ready()
723
724 self.protocol.data_received.assert_called_with(b'data')
725
726 def test_read_ready_eof(self):
727 transport = _SelectorSocketTransport(
728 self.loop, self.sock, self.protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100729 transport.close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700730
731 self.sock.recv.return_value = b''
732 transport._read_ready()
733
734 self.protocol.eof_received.assert_called_with()
735 transport.close.assert_called_with()
736
737 def test_read_ready_eof_keep_open(self):
738 transport = _SelectorSocketTransport(
739 self.loop, self.sock, self.protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100740 transport.close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700741
742 self.sock.recv.return_value = b''
743 self.protocol.eof_received.return_value = True
744 transport._read_ready()
745
746 self.protocol.eof_received.assert_called_with()
747 self.assertFalse(transport.close.called)
748
Victor Stinner24ba2032014-02-26 10:25:02 +0100749 @mock.patch('logging.exception')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700750 def test_read_ready_tryagain(self, m_exc):
751 self.sock.recv.side_effect = BlockingIOError
752
753 transport = _SelectorSocketTransport(
754 self.loop, self.sock, self.protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100755 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700756 transport._read_ready()
757
758 self.assertFalse(transport._fatal_error.called)
759
Victor Stinner24ba2032014-02-26 10:25:02 +0100760 @mock.patch('logging.exception')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700761 def test_read_ready_tryagain_interrupted(self, m_exc):
762 self.sock.recv.side_effect = InterruptedError
763
764 transport = _SelectorSocketTransport(
765 self.loop, self.sock, self.protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100766 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700767 transport._read_ready()
768
769 self.assertFalse(transport._fatal_error.called)
770
Victor Stinner24ba2032014-02-26 10:25:02 +0100771 @mock.patch('logging.exception')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700772 def test_read_ready_conn_reset(self, m_exc):
773 err = self.sock.recv.side_effect = ConnectionResetError()
774
775 transport = _SelectorSocketTransport(
776 self.loop, self.sock, self.protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100777 transport._force_close = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700778 transport._read_ready()
779 transport._force_close.assert_called_with(err)
780
Victor Stinner24ba2032014-02-26 10:25:02 +0100781 @mock.patch('logging.exception')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700782 def test_read_ready_err(self, m_exc):
783 err = self.sock.recv.side_effect = OSError()
784
785 transport = _SelectorSocketTransport(
786 self.loop, self.sock, self.protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100787 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700788 transport._read_ready()
789
Victor Stinner065ca252014-02-19 01:40:41 +0100790 transport._fatal_error.assert_called_with(
791 err,
792 'Fatal read error on socket transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700793
794 def test_write(self):
795 data = b'data'
796 self.sock.send.return_value = len(data)
797
798 transport = _SelectorSocketTransport(
799 self.loop, self.sock, self.protocol)
800 transport.write(data)
801 self.sock.send.assert_called_with(data)
802
Guido van Rossuma5062c52013-11-27 14:12:48 -0800803 def test_write_bytearray(self):
804 data = bytearray(b'data')
805 self.sock.send.return_value = len(data)
806
807 transport = _SelectorSocketTransport(
808 self.loop, self.sock, self.protocol)
809 transport.write(data)
810 self.sock.send.assert_called_with(data)
811 self.assertEqual(data, bytearray(b'data')) # Hasn't been mutated.
812
813 def test_write_memoryview(self):
814 data = memoryview(b'data')
815 self.sock.send.return_value = len(data)
816
817 transport = _SelectorSocketTransport(
818 self.loop, self.sock, self.protocol)
819 transport.write(data)
820 self.sock.send.assert_called_with(data)
821
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700822 def test_write_no_data(self):
823 transport = _SelectorSocketTransport(
824 self.loop, self.sock, self.protocol)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800825 transport._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700826 transport.write(b'')
827 self.assertFalse(self.sock.send.called)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800828 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700829
830 def test_write_buffer(self):
831 transport = _SelectorSocketTransport(
832 self.loop, self.sock, self.protocol)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800833 transport._buffer.extend(b'data1')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700834 transport.write(b'data2')
835 self.assertFalse(self.sock.send.called)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800836 self.assertEqual(list_to_buffer([b'data1', b'data2']),
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700837 transport._buffer)
838
839 def test_write_partial(self):
840 data = b'data'
841 self.sock.send.return_value = 2
842
843 transport = _SelectorSocketTransport(
844 self.loop, self.sock, self.protocol)
845 transport.write(data)
846
847 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800848 self.assertEqual(list_to_buffer([b'ta']), transport._buffer)
849
850 def test_write_partial_bytearray(self):
851 data = bytearray(b'data')
852 self.sock.send.return_value = 2
853
854 transport = _SelectorSocketTransport(
855 self.loop, self.sock, self.protocol)
856 transport.write(data)
857
858 self.loop.assert_writer(7, transport._write_ready)
859 self.assertEqual(list_to_buffer([b'ta']), transport._buffer)
860 self.assertEqual(data, bytearray(b'data')) # Hasn't been mutated.
861
862 def test_write_partial_memoryview(self):
863 data = memoryview(b'data')
864 self.sock.send.return_value = 2
865
866 transport = _SelectorSocketTransport(
867 self.loop, self.sock, self.protocol)
868 transport.write(data)
869
870 self.loop.assert_writer(7, transport._write_ready)
871 self.assertEqual(list_to_buffer([b'ta']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700872
873 def test_write_partial_none(self):
874 data = b'data'
875 self.sock.send.return_value = 0
876 self.sock.fileno.return_value = 7
877
878 transport = _SelectorSocketTransport(
879 self.loop, self.sock, self.protocol)
880 transport.write(data)
881
882 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800883 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700884
885 def test_write_tryagain(self):
886 self.sock.send.side_effect = BlockingIOError
887
888 data = b'data'
889 transport = _SelectorSocketTransport(
890 self.loop, self.sock, self.protocol)
891 transport.write(data)
892
893 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800894 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700895
Victor Stinner24ba2032014-02-26 10:25:02 +0100896 @mock.patch('asyncio.selector_events.logger')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700897 def test_write_exception(self, m_log):
898 err = self.sock.send.side_effect = OSError()
899
900 data = b'data'
901 transport = _SelectorSocketTransport(
902 self.loop, self.sock, self.protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +0100903 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700904 transport.write(data)
Victor Stinner065ca252014-02-19 01:40:41 +0100905 transport._fatal_error.assert_called_with(
906 err,
907 'Fatal write error on socket transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700908 transport._conn_lost = 1
909
910 self.sock.reset_mock()
911 transport.write(data)
912 self.assertFalse(self.sock.send.called)
913 self.assertEqual(transport._conn_lost, 2)
914 transport.write(data)
915 transport.write(data)
916 transport.write(data)
917 transport.write(data)
918 m_log.warning.assert_called_with('socket.send() raised exception.')
919
920 def test_write_str(self):
921 transport = _SelectorSocketTransport(
922 self.loop, self.sock, self.protocol)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800923 self.assertRaises(TypeError, transport.write, 'str')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700924
925 def test_write_closing(self):
926 transport = _SelectorSocketTransport(
927 self.loop, self.sock, self.protocol)
928 transport.close()
929 self.assertEqual(transport._conn_lost, 1)
930 transport.write(b'data')
931 self.assertEqual(transport._conn_lost, 2)
932
933 def test_write_ready(self):
934 data = b'data'
935 self.sock.send.return_value = len(data)
936
937 transport = _SelectorSocketTransport(
938 self.loop, self.sock, self.protocol)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800939 transport._buffer.extend(data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700940 self.loop.add_writer(7, transport._write_ready)
941 transport._write_ready()
942 self.assertTrue(self.sock.send.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700943 self.assertFalse(self.loop.writers)
944
945 def test_write_ready_closing(self):
946 data = b'data'
947 self.sock.send.return_value = len(data)
948
949 transport = _SelectorSocketTransport(
950 self.loop, self.sock, self.protocol)
951 transport._closing = True
Guido van Rossuma5062c52013-11-27 14:12:48 -0800952 transport._buffer.extend(data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700953 self.loop.add_writer(7, transport._write_ready)
954 transport._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -0800955 self.assertTrue(self.sock.send.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700956 self.assertFalse(self.loop.writers)
957 self.sock.close.assert_called_with()
958 self.protocol.connection_lost.assert_called_with(None)
959
960 def test_write_ready_no_data(self):
961 transport = _SelectorSocketTransport(
962 self.loop, self.sock, self.protocol)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800963 # This is an internal error.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700964 self.assertRaises(AssertionError, transport._write_ready)
965
966 def test_write_ready_partial(self):
967 data = b'data'
968 self.sock.send.return_value = 2
969
970 transport = _SelectorSocketTransport(
971 self.loop, self.sock, self.protocol)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800972 transport._buffer.extend(data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700973 self.loop.add_writer(7, transport._write_ready)
974 transport._write_ready()
975 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800976 self.assertEqual(list_to_buffer([b'ta']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700977
978 def test_write_ready_partial_none(self):
979 data = b'data'
980 self.sock.send.return_value = 0
981
982 transport = _SelectorSocketTransport(
983 self.loop, self.sock, self.protocol)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800984 transport._buffer.extend(data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700985 self.loop.add_writer(7, transport._write_ready)
986 transport._write_ready()
987 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800988 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700989
990 def test_write_ready_tryagain(self):
991 self.sock.send.side_effect = BlockingIOError
992
993 transport = _SelectorSocketTransport(
994 self.loop, self.sock, self.protocol)
Guido van Rossuma5062c52013-11-27 14:12:48 -0800995 transport._buffer = list_to_buffer([b'data1', b'data2'])
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700996 self.loop.add_writer(7, transport._write_ready)
997 transport._write_ready()
998
999 self.loop.assert_writer(7, transport._write_ready)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001000 self.assertEqual(list_to_buffer([b'data1data2']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001001
1002 def test_write_ready_exception(self):
1003 err = self.sock.send.side_effect = OSError()
1004
1005 transport = _SelectorSocketTransport(
1006 self.loop, self.sock, self.protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +01001007 transport._fatal_error = mock.Mock()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001008 transport._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001009 transport._write_ready()
Victor Stinner065ca252014-02-19 01:40:41 +01001010 transport._fatal_error.assert_called_with(
1011 err,
1012 'Fatal write error on socket transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001013
Victor Stinner24ba2032014-02-26 10:25:02 +01001014 @mock.patch('asyncio.base_events.logger')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001015 def test_write_ready_exception_and_close(self, m_log):
1016 self.sock.send.side_effect = OSError()
Victor Stinner24ba2032014-02-26 10:25:02 +01001017 remove_writer = self.loop.remove_writer = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001018
1019 transport = _SelectorSocketTransport(
1020 self.loop, self.sock, self.protocol)
1021 transport.close()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001022 transport._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001023 transport._write_ready()
1024 remove_writer.assert_called_with(self.sock_fd)
1025
1026 def test_write_eof(self):
1027 tr = _SelectorSocketTransport(
1028 self.loop, self.sock, self.protocol)
1029 self.assertTrue(tr.can_write_eof())
1030 tr.write_eof()
1031 self.sock.shutdown.assert_called_with(socket.SHUT_WR)
1032 tr.write_eof()
1033 self.assertEqual(self.sock.shutdown.call_count, 1)
1034 tr.close()
1035
1036 def test_write_eof_buffer(self):
1037 tr = _SelectorSocketTransport(
1038 self.loop, self.sock, self.protocol)
1039 self.sock.send.side_effect = BlockingIOError
1040 tr.write(b'data')
1041 tr.write_eof()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001042 self.assertEqual(tr._buffer, list_to_buffer([b'data']))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001043 self.assertTrue(tr._eof)
1044 self.assertFalse(self.sock.shutdown.called)
1045 self.sock.send.side_effect = lambda _: 4
1046 tr._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001047 self.assertTrue(self.sock.send.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001048 self.sock.shutdown.assert_called_with(socket.SHUT_WR)
1049 tr.close()
1050
1051
1052@unittest.skipIf(ssl is None, 'No ssl module')
1053class SelectorSslTransportTests(unittest.TestCase):
1054
1055 def setUp(self):
1056 self.loop = test_utils.TestLoop()
Victor Stinner8dffc452014-01-25 15:32:06 +01001057 self.protocol = test_utils.make_test_protocol(asyncio.Protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +01001058 self.sock = mock.Mock(socket.socket)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001059 self.sock.fileno.return_value = 7
Victor Stinner24ba2032014-02-26 10:25:02 +01001060 self.sslsock = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001061 self.sslsock.fileno.return_value = 1
Victor Stinner24ba2032014-02-26 10:25:02 +01001062 self.sslcontext = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001063 self.sslcontext.wrap_socket.return_value = self.sslsock
1064
1065 def _make_one(self, create_waiter=None):
1066 transport = _SelectorSslTransport(
1067 self.loop, self.sock, self.protocol, self.sslcontext)
1068 self.sock.reset_mock()
1069 self.sslsock.reset_mock()
1070 self.sslcontext.reset_mock()
1071 self.loop.reset_counters()
1072 return transport
1073
1074 def test_on_handshake(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01001075 waiter = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001076 tr = _SelectorSslTransport(
1077 self.loop, self.sock, self.protocol, self.sslcontext,
1078 waiter=waiter)
1079 self.assertTrue(self.sslsock.do_handshake.called)
Guido van Rossum2b570162013-11-01 14:18:02 -07001080 self.loop.assert_reader(1, tr._read_ready)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001081 test_utils.run_briefly(self.loop)
1082 self.assertIsNone(waiter.result())
1083
1084 def test_on_handshake_reader_retry(self):
1085 self.sslsock.do_handshake.side_effect = ssl.SSLWantReadError
1086 transport = _SelectorSslTransport(
1087 self.loop, self.sock, self.protocol, self.sslcontext)
1088 transport._on_handshake()
1089 self.loop.assert_reader(1, transport._on_handshake)
1090
1091 def test_on_handshake_writer_retry(self):
1092 self.sslsock.do_handshake.side_effect = ssl.SSLWantWriteError
1093 transport = _SelectorSslTransport(
1094 self.loop, self.sock, self.protocol, self.sslcontext)
1095 transport._on_handshake()
1096 self.loop.assert_writer(1, transport._on_handshake)
1097
1098 def test_on_handshake_exc(self):
1099 exc = ValueError()
1100 self.sslsock.do_handshake.side_effect = exc
1101 transport = _SelectorSslTransport(
1102 self.loop, self.sock, self.protocol, self.sslcontext)
Victor Stinner8dffc452014-01-25 15:32:06 +01001103 transport._waiter = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001104 transport._on_handshake()
1105 self.assertTrue(self.sslsock.close.called)
1106 self.assertTrue(transport._waiter.done())
1107 self.assertIs(exc, transport._waiter.exception())
1108
1109 def test_on_handshake_base_exc(self):
1110 transport = _SelectorSslTransport(
1111 self.loop, self.sock, self.protocol, self.sslcontext)
Victor Stinner8dffc452014-01-25 15:32:06 +01001112 transport._waiter = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001113 exc = BaseException()
1114 self.sslsock.do_handshake.side_effect = exc
1115 self.assertRaises(BaseException, transport._on_handshake)
1116 self.assertTrue(self.sslsock.close.called)
1117 self.assertTrue(transport._waiter.done())
1118 self.assertIs(exc, transport._waiter.exception())
1119
Guido van Rossum57497ad2013-10-18 07:58:20 -07001120 def test_pause_resume_reading(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001121 tr = self._make_one()
1122 self.assertFalse(tr._paused)
Guido van Rossum2b570162013-11-01 14:18:02 -07001123 self.loop.assert_reader(1, tr._read_ready)
Guido van Rossum57497ad2013-10-18 07:58:20 -07001124 tr.pause_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001125 self.assertTrue(tr._paused)
1126 self.assertFalse(1 in self.loop.readers)
Guido van Rossum57497ad2013-10-18 07:58:20 -07001127 tr.resume_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001128 self.assertFalse(tr._paused)
Guido van Rossum2b570162013-11-01 14:18:02 -07001129 self.loop.assert_reader(1, tr._read_ready)
Andrew Svetlov3207a032014-05-27 21:24:43 +03001130 with self.assertRaises(RuntimeError):
1131 tr.resume_reading()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001132
Guido van Rossuma5062c52013-11-27 14:12:48 -08001133 def test_write(self):
1134 transport = self._make_one()
1135 transport.write(b'data')
1136 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
1137
1138 def test_write_bytearray(self):
1139 transport = self._make_one()
1140 data = bytearray(b'data')
1141 transport.write(data)
1142 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
1143 self.assertEqual(data, bytearray(b'data')) # Hasn't been mutated.
1144 self.assertIsNot(data, transport._buffer) # Hasn't been incorporated.
1145
1146 def test_write_memoryview(self):
1147 transport = self._make_one()
1148 data = memoryview(b'data')
1149 transport.write(data)
1150 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
1151
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001152 def test_write_no_data(self):
1153 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001154 transport._buffer.extend(b'data')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001155 transport.write(b'')
Guido van Rossuma5062c52013-11-27 14:12:48 -08001156 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001157
1158 def test_write_str(self):
1159 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001160 self.assertRaises(TypeError, transport.write, 'str')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001161
1162 def test_write_closing(self):
1163 transport = self._make_one()
1164 transport.close()
1165 self.assertEqual(transport._conn_lost, 1)
1166 transport.write(b'data')
1167 self.assertEqual(transport._conn_lost, 2)
1168
Victor Stinner24ba2032014-02-26 10:25:02 +01001169 @mock.patch('asyncio.selector_events.logger')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001170 def test_write_exception(self, m_log):
1171 transport = self._make_one()
1172 transport._conn_lost = 1
1173 transport.write(b'data')
Guido van Rossuma5062c52013-11-27 14:12:48 -08001174 self.assertEqual(transport._buffer, list_to_buffer())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001175 transport.write(b'data')
1176 transport.write(b'data')
1177 transport.write(b'data')
1178 transport.write(b'data')
1179 m_log.warning.assert_called_with('socket.send() raised exception.')
1180
Guido van Rossum2b570162013-11-01 14:18:02 -07001181 def test_read_ready_recv(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001182 self.sslsock.recv.return_value = b'data'
1183 transport = self._make_one()
Guido van Rossum2b570162013-11-01 14:18:02 -07001184 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001185 self.assertTrue(self.sslsock.recv.called)
1186 self.assertEqual((b'data',), self.protocol.data_received.call_args[0])
1187
Guido van Rossum2b570162013-11-01 14:18:02 -07001188 def test_read_ready_write_wants_read(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01001189 self.loop.add_writer = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001190 self.sslsock.recv.side_effect = BlockingIOError
1191 transport = self._make_one()
1192 transport._write_wants_read = True
Victor Stinner24ba2032014-02-26 10:25:02 +01001193 transport._write_ready = mock.Mock()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001194 transport._buffer.extend(b'data')
Guido van Rossum2b570162013-11-01 14:18:02 -07001195 transport._read_ready()
1196
1197 self.assertFalse(transport._write_wants_read)
1198 transport._write_ready.assert_called_with()
1199 self.loop.add_writer.assert_called_with(
1200 transport._sock_fd, transport._write_ready)
1201
1202 def test_read_ready_recv_eof(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001203 self.sslsock.recv.return_value = b''
1204 transport = self._make_one()
Victor Stinner24ba2032014-02-26 10:25:02 +01001205 transport.close = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001206 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001207 transport.close.assert_called_with()
1208 self.protocol.eof_received.assert_called_with()
1209
Guido van Rossum2b570162013-11-01 14:18:02 -07001210 def test_read_ready_recv_conn_reset(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001211 err = self.sslsock.recv.side_effect = ConnectionResetError()
1212 transport = self._make_one()
Victor Stinner24ba2032014-02-26 10:25:02 +01001213 transport._force_close = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001214 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001215 transport._force_close.assert_called_with(err)
1216
Guido van Rossum2b570162013-11-01 14:18:02 -07001217 def test_read_ready_recv_retry(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001218 self.sslsock.recv.side_effect = ssl.SSLWantReadError
1219 transport = self._make_one()
Guido van Rossum2b570162013-11-01 14:18:02 -07001220 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001221 self.assertTrue(self.sslsock.recv.called)
1222 self.assertFalse(self.protocol.data_received.called)
1223
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001224 self.sslsock.recv.side_effect = BlockingIOError
Guido van Rossum2b570162013-11-01 14:18:02 -07001225 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001226 self.assertFalse(self.protocol.data_received.called)
1227
1228 self.sslsock.recv.side_effect = InterruptedError
Guido van Rossum2b570162013-11-01 14:18:02 -07001229 transport._read_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001230 self.assertFalse(self.protocol.data_received.called)
1231
Guido van Rossum2b570162013-11-01 14:18:02 -07001232 def test_read_ready_recv_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01001233 self.loop.remove_reader = mock.Mock()
1234 self.loop.add_writer = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001235 self.sslsock.recv.side_effect = ssl.SSLWantWriteError
1236 transport = self._make_one()
1237 transport._read_ready()
1238 self.assertFalse(self.protocol.data_received.called)
1239 self.assertTrue(transport._read_wants_write)
1240
1241 self.loop.remove_reader.assert_called_with(transport._sock_fd)
1242 self.loop.add_writer.assert_called_with(
1243 transport._sock_fd, transport._write_ready)
1244
1245 def test_read_ready_recv_exc(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001246 err = self.sslsock.recv.side_effect = OSError()
1247 transport = self._make_one()
Victor Stinner24ba2032014-02-26 10:25:02 +01001248 transport._fatal_error = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001249 transport._read_ready()
Victor Stinner065ca252014-02-19 01:40:41 +01001250 transport._fatal_error.assert_called_with(
1251 err,
1252 'Fatal read error on SSL transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001253
Guido van Rossum2b570162013-11-01 14:18:02 -07001254 def test_write_ready_send(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001255 self.sslsock.send.return_value = 4
1256 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001257 transport._buffer = list_to_buffer([b'data'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001258 transport._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001259 self.assertEqual(list_to_buffer(), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001260 self.assertTrue(self.sslsock.send.called)
1261
Guido van Rossum2b570162013-11-01 14:18:02 -07001262 def test_write_ready_send_none(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001263 self.sslsock.send.return_value = 0
1264 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001265 transport._buffer = list_to_buffer([b'data1', b'data2'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001266 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001267 self.assertTrue(self.sslsock.send.called)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001268 self.assertEqual(list_to_buffer([b'data1data2']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001269
Guido van Rossum2b570162013-11-01 14:18:02 -07001270 def test_write_ready_send_partial(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001271 self.sslsock.send.return_value = 2
1272 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001273 transport._buffer = list_to_buffer([b'data1', b'data2'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001274 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001275 self.assertTrue(self.sslsock.send.called)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001276 self.assertEqual(list_to_buffer([b'ta1data2']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001277
Guido van Rossum2b570162013-11-01 14:18:02 -07001278 def test_write_ready_send_closing_partial(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001279 self.sslsock.send.return_value = 2
1280 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001281 transport._buffer = list_to_buffer([b'data1', b'data2'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001282 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001283 self.assertTrue(self.sslsock.send.called)
1284 self.assertFalse(self.sslsock.close.called)
1285
Guido van Rossum2b570162013-11-01 14:18:02 -07001286 def test_write_ready_send_closing(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001287 self.sslsock.send.return_value = 4
1288 transport = self._make_one()
1289 transport.close()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001290 transport._buffer = list_to_buffer([b'data'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001291 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001292 self.assertFalse(self.loop.writers)
1293 self.protocol.connection_lost.assert_called_with(None)
1294
Guido van Rossum2b570162013-11-01 14:18:02 -07001295 def test_write_ready_send_closing_empty_buffer(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001296 self.sslsock.send.return_value = 4
1297 transport = self._make_one()
1298 transport.close()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001299 transport._buffer = list_to_buffer()
Guido van Rossum2b570162013-11-01 14:18:02 -07001300 transport._write_ready()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001301 self.assertFalse(self.loop.writers)
1302 self.protocol.connection_lost.assert_called_with(None)
1303
Guido van Rossum2b570162013-11-01 14:18:02 -07001304 def test_write_ready_send_retry(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001305 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001306 transport._buffer = list_to_buffer([b'data'])
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001307
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001308 self.sslsock.send.side_effect = ssl.SSLWantWriteError
Guido van Rossum2b570162013-11-01 14:18:02 -07001309 transport._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001310 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001311
1312 self.sslsock.send.side_effect = BlockingIOError()
Guido van Rossum2b570162013-11-01 14:18:02 -07001313 transport._write_ready()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001314 self.assertEqual(list_to_buffer([b'data']), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001315
Guido van Rossum2b570162013-11-01 14:18:02 -07001316 def test_write_ready_send_read(self):
1317 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001318 transport._buffer = list_to_buffer([b'data'])
Guido van Rossum2b570162013-11-01 14:18:02 -07001319
Victor Stinner24ba2032014-02-26 10:25:02 +01001320 self.loop.remove_writer = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001321 self.sslsock.send.side_effect = ssl.SSLWantReadError
1322 transport._write_ready()
1323 self.assertFalse(self.protocol.data_received.called)
1324 self.assertTrue(transport._write_wants_read)
1325 self.loop.remove_writer.assert_called_with(transport._sock_fd)
1326
1327 def test_write_ready_send_exc(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001328 err = self.sslsock.send.side_effect = OSError()
1329
1330 transport = self._make_one()
Guido van Rossuma5062c52013-11-27 14:12:48 -08001331 transport._buffer = list_to_buffer([b'data'])
Victor Stinner24ba2032014-02-26 10:25:02 +01001332 transport._fatal_error = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001333 transport._write_ready()
Victor Stinner065ca252014-02-19 01:40:41 +01001334 transport._fatal_error.assert_called_with(
1335 err,
1336 'Fatal write error on SSL transport')
Guido van Rossuma5062c52013-11-27 14:12:48 -08001337 self.assertEqual(list_to_buffer(), transport._buffer)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001338
Guido van Rossum2b570162013-11-01 14:18:02 -07001339 def test_write_ready_read_wants_write(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01001340 self.loop.add_reader = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001341 self.sslsock.send.side_effect = BlockingIOError
1342 transport = self._make_one()
1343 transport._read_wants_write = True
Victor Stinner24ba2032014-02-26 10:25:02 +01001344 transport._read_ready = mock.Mock()
Guido van Rossum2b570162013-11-01 14:18:02 -07001345 transport._write_ready()
1346
1347 self.assertFalse(transport._read_wants_write)
1348 transport._read_ready.assert_called_with()
1349 self.loop.add_reader.assert_called_with(
1350 transport._sock_fd, transport._read_ready)
1351
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001352 def test_write_eof(self):
1353 tr = self._make_one()
1354 self.assertFalse(tr.can_write_eof())
1355 self.assertRaises(NotImplementedError, tr.write_eof)
1356
1357 def test_close(self):
1358 tr = self._make_one()
1359 tr.close()
1360
1361 self.assertTrue(tr._closing)
1362 self.assertEqual(1, self.loop.remove_reader_count[1])
1363 self.assertEqual(tr._conn_lost, 1)
1364
1365 tr.close()
1366 self.assertEqual(tr._conn_lost, 1)
1367 self.assertEqual(1, self.loop.remove_reader_count[1])
1368
1369 @unittest.skipIf(ssl is None or not ssl.HAS_SNI, 'No SNI support')
1370 def test_server_hostname(self):
1371 _SelectorSslTransport(
1372 self.loop, self.sock, self.protocol, self.sslcontext,
1373 server_hostname='localhost')
1374 self.sslcontext.wrap_socket.assert_called_with(
1375 self.sock, do_handshake_on_connect=False, server_side=False,
1376 server_hostname='localhost')
1377
1378
Guido van Rossum28dff0d2013-11-01 14:22:30 -07001379class SelectorSslWithoutSslTransportTests(unittest.TestCase):
1380
Victor Stinner24ba2032014-02-26 10:25:02 +01001381 @mock.patch('asyncio.selector_events.ssl', None)
Guido van Rossum28dff0d2013-11-01 14:22:30 -07001382 def test_ssl_transport_requires_ssl_module(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01001383 Mock = mock.Mock
Guido van Rossum28dff0d2013-11-01 14:22:30 -07001384 with self.assertRaises(RuntimeError):
Victor Stinnerf5e37032014-02-26 11:07:42 +01001385 _SelectorSslTransport(Mock(), Mock(), Mock(), Mock())
Guido van Rossum28dff0d2013-11-01 14:22:30 -07001386
1387
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001388class SelectorDatagramTransportTests(unittest.TestCase):
1389
1390 def setUp(self):
1391 self.loop = test_utils.TestLoop()
Victor Stinner8dffc452014-01-25 15:32:06 +01001392 self.protocol = test_utils.make_test_protocol(asyncio.DatagramProtocol)
Victor Stinner24ba2032014-02-26 10:25:02 +01001393 self.sock = mock.Mock(spec_set=socket.socket)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001394 self.sock.fileno.return_value = 7
1395
1396 def test_read_ready(self):
1397 transport = _SelectorDatagramTransport(
1398 self.loop, self.sock, self.protocol)
1399
1400 self.sock.recvfrom.return_value = (b'data', ('0.0.0.0', 1234))
1401 transport._read_ready()
1402
1403 self.protocol.datagram_received.assert_called_with(
1404 b'data', ('0.0.0.0', 1234))
1405
1406 def test_read_ready_tryagain(self):
1407 transport = _SelectorDatagramTransport(
1408 self.loop, self.sock, self.protocol)
1409
1410 self.sock.recvfrom.side_effect = BlockingIOError
Victor Stinner24ba2032014-02-26 10:25:02 +01001411 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001412 transport._read_ready()
1413
1414 self.assertFalse(transport._fatal_error.called)
1415
1416 def test_read_ready_err(self):
1417 transport = _SelectorDatagramTransport(
1418 self.loop, self.sock, self.protocol)
1419
Guido van Rossum2335de72013-11-15 16:51:48 -08001420 err = self.sock.recvfrom.side_effect = RuntimeError()
Victor Stinner24ba2032014-02-26 10:25:02 +01001421 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001422 transport._read_ready()
1423
Victor Stinner065ca252014-02-19 01:40:41 +01001424 transport._fatal_error.assert_called_with(
1425 err,
1426 'Fatal read error on datagram transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001427
Guido van Rossum2335de72013-11-15 16:51:48 -08001428 def test_read_ready_oserr(self):
1429 transport = _SelectorDatagramTransport(
1430 self.loop, self.sock, self.protocol)
1431
1432 err = self.sock.recvfrom.side_effect = OSError()
Victor Stinner24ba2032014-02-26 10:25:02 +01001433 transport._fatal_error = mock.Mock()
Guido van Rossum2335de72013-11-15 16:51:48 -08001434 transport._read_ready()
1435
1436 self.assertFalse(transport._fatal_error.called)
1437 self.protocol.error_received.assert_called_with(err)
1438
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001439 def test_sendto(self):
1440 data = b'data'
1441 transport = _SelectorDatagramTransport(
1442 self.loop, self.sock, self.protocol)
1443 transport.sendto(data, ('0.0.0.0', 1234))
1444 self.assertTrue(self.sock.sendto.called)
1445 self.assertEqual(
1446 self.sock.sendto.call_args[0], (data, ('0.0.0.0', 1234)))
1447
Guido van Rossuma5062c52013-11-27 14:12:48 -08001448 def test_sendto_bytearray(self):
1449 data = bytearray(b'data')
1450 transport = _SelectorDatagramTransport(
1451 self.loop, self.sock, self.protocol)
1452 transport.sendto(data, ('0.0.0.0', 1234))
1453 self.assertTrue(self.sock.sendto.called)
1454 self.assertEqual(
1455 self.sock.sendto.call_args[0], (data, ('0.0.0.0', 1234)))
1456
1457 def test_sendto_memoryview(self):
1458 data = memoryview(b'data')
1459 transport = _SelectorDatagramTransport(
1460 self.loop, self.sock, self.protocol)
1461 transport.sendto(data, ('0.0.0.0', 1234))
1462 self.assertTrue(self.sock.sendto.called)
1463 self.assertEqual(
1464 self.sock.sendto.call_args[0], (data, ('0.0.0.0', 1234)))
1465
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001466 def test_sendto_no_data(self):
1467 transport = _SelectorDatagramTransport(
1468 self.loop, self.sock, self.protocol)
1469 transport._buffer.append((b'data', ('0.0.0.0', 12345)))
1470 transport.sendto(b'', ())
1471 self.assertFalse(self.sock.sendto.called)
1472 self.assertEqual(
1473 [(b'data', ('0.0.0.0', 12345))], list(transport._buffer))
1474
1475 def test_sendto_buffer(self):
1476 transport = _SelectorDatagramTransport(
1477 self.loop, self.sock, self.protocol)
1478 transport._buffer.append((b'data1', ('0.0.0.0', 12345)))
1479 transport.sendto(b'data2', ('0.0.0.0', 12345))
1480 self.assertFalse(self.sock.sendto.called)
1481 self.assertEqual(
1482 [(b'data1', ('0.0.0.0', 12345)),
1483 (b'data2', ('0.0.0.0', 12345))],
1484 list(transport._buffer))
1485
Guido van Rossuma5062c52013-11-27 14:12:48 -08001486 def test_sendto_buffer_bytearray(self):
1487 data2 = bytearray(b'data2')
1488 transport = _SelectorDatagramTransport(
1489 self.loop, self.sock, self.protocol)
1490 transport._buffer.append((b'data1', ('0.0.0.0', 12345)))
1491 transport.sendto(data2, ('0.0.0.0', 12345))
1492 self.assertFalse(self.sock.sendto.called)
1493 self.assertEqual(
1494 [(b'data1', ('0.0.0.0', 12345)),
1495 (b'data2', ('0.0.0.0', 12345))],
1496 list(transport._buffer))
1497 self.assertIsInstance(transport._buffer[1][0], bytes)
1498
1499 def test_sendto_buffer_memoryview(self):
1500 data2 = memoryview(b'data2')
1501 transport = _SelectorDatagramTransport(
1502 self.loop, self.sock, self.protocol)
1503 transport._buffer.append((b'data1', ('0.0.0.0', 12345)))
1504 transport.sendto(data2, ('0.0.0.0', 12345))
1505 self.assertFalse(self.sock.sendto.called)
1506 self.assertEqual(
1507 [(b'data1', ('0.0.0.0', 12345)),
1508 (b'data2', ('0.0.0.0', 12345))],
1509 list(transport._buffer))
1510 self.assertIsInstance(transport._buffer[1][0], bytes)
1511
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001512 def test_sendto_tryagain(self):
1513 data = b'data'
1514
1515 self.sock.sendto.side_effect = BlockingIOError
1516
1517 transport = _SelectorDatagramTransport(
1518 self.loop, self.sock, self.protocol)
1519 transport.sendto(data, ('0.0.0.0', 12345))
1520
1521 self.loop.assert_writer(7, transport._sendto_ready)
1522 self.assertEqual(
1523 [(b'data', ('0.0.0.0', 12345))], list(transport._buffer))
1524
Victor Stinner24ba2032014-02-26 10:25:02 +01001525 @mock.patch('asyncio.selector_events.logger')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001526 def test_sendto_exception(self, m_log):
1527 data = b'data'
Guido van Rossum2335de72013-11-15 16:51:48 -08001528 err = self.sock.sendto.side_effect = RuntimeError()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001529
1530 transport = _SelectorDatagramTransport(
1531 self.loop, self.sock, self.protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +01001532 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001533 transport.sendto(data, ())
1534
1535 self.assertTrue(transport._fatal_error.called)
Victor Stinner065ca252014-02-19 01:40:41 +01001536 transport._fatal_error.assert_called_with(
1537 err,
1538 'Fatal write error on datagram transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001539 transport._conn_lost = 1
1540
1541 transport._address = ('123',)
1542 transport.sendto(data)
1543 transport.sendto(data)
1544 transport.sendto(data)
1545 transport.sendto(data)
1546 transport.sendto(data)
1547 m_log.warning.assert_called_with('socket.send() raised exception.')
1548
Guido van Rossum2335de72013-11-15 16:51:48 -08001549 def test_sendto_error_received(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001550 data = b'data'
1551
1552 self.sock.sendto.side_effect = ConnectionRefusedError
1553
1554 transport = _SelectorDatagramTransport(
1555 self.loop, self.sock, self.protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +01001556 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001557 transport.sendto(data, ())
1558
1559 self.assertEqual(transport._conn_lost, 0)
1560 self.assertFalse(transport._fatal_error.called)
1561
Guido van Rossum2335de72013-11-15 16:51:48 -08001562 def test_sendto_error_received_connected(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001563 data = b'data'
1564
1565 self.sock.send.side_effect = ConnectionRefusedError
1566
1567 transport = _SelectorDatagramTransport(
1568 self.loop, self.sock, self.protocol, ('0.0.0.0', 1))
Victor Stinner24ba2032014-02-26 10:25:02 +01001569 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001570 transport.sendto(data)
1571
Guido van Rossum2335de72013-11-15 16:51:48 -08001572 self.assertFalse(transport._fatal_error.called)
1573 self.assertTrue(self.protocol.error_received.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001574
1575 def test_sendto_str(self):
1576 transport = _SelectorDatagramTransport(
1577 self.loop, self.sock, self.protocol)
Guido van Rossuma5062c52013-11-27 14:12:48 -08001578 self.assertRaises(TypeError, transport.sendto, 'str', ())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001579
1580 def test_sendto_connected_addr(self):
1581 transport = _SelectorDatagramTransport(
1582 self.loop, self.sock, self.protocol, ('0.0.0.0', 1))
1583 self.assertRaises(
Guido van Rossuma5062c52013-11-27 14:12:48 -08001584 ValueError, transport.sendto, b'str', ('0.0.0.0', 2))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001585
1586 def test_sendto_closing(self):
1587 transport = _SelectorDatagramTransport(
1588 self.loop, self.sock, self.protocol, address=(1,))
1589 transport.close()
1590 self.assertEqual(transport._conn_lost, 1)
1591 transport.sendto(b'data', (1,))
1592 self.assertEqual(transport._conn_lost, 2)
1593
1594 def test_sendto_ready(self):
1595 data = b'data'
1596 self.sock.sendto.return_value = len(data)
1597
1598 transport = _SelectorDatagramTransport(
1599 self.loop, self.sock, self.protocol)
1600 transport._buffer.append((data, ('0.0.0.0', 12345)))
1601 self.loop.add_writer(7, transport._sendto_ready)
1602 transport._sendto_ready()
1603 self.assertTrue(self.sock.sendto.called)
1604 self.assertEqual(
1605 self.sock.sendto.call_args[0], (data, ('0.0.0.0', 12345)))
1606 self.assertFalse(self.loop.writers)
1607
1608 def test_sendto_ready_closing(self):
1609 data = b'data'
1610 self.sock.send.return_value = len(data)
1611
1612 transport = _SelectorDatagramTransport(
1613 self.loop, self.sock, self.protocol)
1614 transport._closing = True
1615 transport._buffer.append((data, ()))
1616 self.loop.add_writer(7, transport._sendto_ready)
1617 transport._sendto_ready()
1618 self.sock.sendto.assert_called_with(data, ())
1619 self.assertFalse(self.loop.writers)
1620 self.sock.close.assert_called_with()
1621 self.protocol.connection_lost.assert_called_with(None)
1622
1623 def test_sendto_ready_no_data(self):
1624 transport = _SelectorDatagramTransport(
1625 self.loop, self.sock, self.protocol)
1626 self.loop.add_writer(7, transport._sendto_ready)
1627 transport._sendto_ready()
1628 self.assertFalse(self.sock.sendto.called)
1629 self.assertFalse(self.loop.writers)
1630
1631 def test_sendto_ready_tryagain(self):
1632 self.sock.sendto.side_effect = BlockingIOError
1633
1634 transport = _SelectorDatagramTransport(
1635 self.loop, self.sock, self.protocol)
1636 transport._buffer.extend([(b'data1', ()), (b'data2', ())])
1637 self.loop.add_writer(7, transport._sendto_ready)
1638 transport._sendto_ready()
1639
1640 self.loop.assert_writer(7, transport._sendto_ready)
1641 self.assertEqual(
1642 [(b'data1', ()), (b'data2', ())],
1643 list(transport._buffer))
1644
1645 def test_sendto_ready_exception(self):
Guido van Rossum2335de72013-11-15 16:51:48 -08001646 err = self.sock.sendto.side_effect = RuntimeError()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001647
1648 transport = _SelectorDatagramTransport(
1649 self.loop, self.sock, self.protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +01001650 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001651 transport._buffer.append((b'data', ()))
1652 transport._sendto_ready()
1653
Victor Stinner065ca252014-02-19 01:40:41 +01001654 transport._fatal_error.assert_called_with(
1655 err,
1656 'Fatal write error on datagram transport')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001657
Guido van Rossum2335de72013-11-15 16:51:48 -08001658 def test_sendto_ready_error_received(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001659 self.sock.sendto.side_effect = ConnectionRefusedError
1660
1661 transport = _SelectorDatagramTransport(
1662 self.loop, self.sock, self.protocol)
Victor Stinner24ba2032014-02-26 10:25:02 +01001663 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001664 transport._buffer.append((b'data', ()))
1665 transport._sendto_ready()
1666
1667 self.assertFalse(transport._fatal_error.called)
1668
Guido van Rossum2335de72013-11-15 16:51:48 -08001669 def test_sendto_ready_error_received_connection(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001670 self.sock.send.side_effect = ConnectionRefusedError
1671
1672 transport = _SelectorDatagramTransport(
1673 self.loop, self.sock, self.protocol, ('0.0.0.0', 1))
Victor Stinner24ba2032014-02-26 10:25:02 +01001674 transport._fatal_error = mock.Mock()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001675 transport._buffer.append((b'data', ()))
1676 transport._sendto_ready()
1677
Guido van Rossum2335de72013-11-15 16:51:48 -08001678 self.assertFalse(transport._fatal_error.called)
1679 self.assertTrue(self.protocol.error_received.called)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001680
Victor Stinner24ba2032014-02-26 10:25:02 +01001681 @mock.patch('asyncio.base_events.logger.error')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001682 def test_fatal_error_connected(self, m_exc):
1683 transport = _SelectorDatagramTransport(
1684 self.loop, self.sock, self.protocol, ('0.0.0.0', 1))
1685 err = ConnectionRefusedError()
1686 transport._fatal_error(err)
Guido van Rossum2335de72013-11-15 16:51:48 -08001687 self.assertFalse(self.protocol.error_received.called)
Yury Selivanovff827f02014-02-18 18:02:19 -05001688 m_exc.assert_called_with(
1689 test_utils.MockPattern(
Victor Stinner065ca252014-02-19 01:40:41 +01001690 'Fatal error on transport\nprotocol:.*\ntransport:.*'),
Yury Selivanovff827f02014-02-18 18:02:19 -05001691 exc_info=(ConnectionRefusedError, MOCK_ANY, MOCK_ANY))
Antoine Pitroucb1fe982013-10-20 21:02:53 +02001692
1693
1694if __name__ == '__main__':
1695 unittest.main()