blob: 34881016891b995e8a1703ae483cb2b182f14230 [file] [log] [blame]
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001"""Tests for events.py."""
2
3import functools
4import gc
5import io
6import os
Victor Stinner8c33ffd2014-02-19 18:10:32 +01007import platform
Victor Stinner307bccc2014-06-12 18:39:26 +02008import re
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07009import signal
10import socket
11try:
12 import ssl
13except ImportError:
14 ssl = None
15import subprocess
16import sys
17import threading
18import time
19import errno
20import unittest
Victor Stinner24ba2032014-02-26 10:25:02 +010021from unittest import mock
Guido van Rossum94ba1462014-04-27 10:44:22 -070022import weakref
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070023
24
Victor Stinner8dffc452014-01-25 15:32:06 +010025import asyncio
Victor Stinnerb2614752014-08-25 23:20:52 +020026from asyncio import proactor_events
Victor Stinner128ee222014-01-25 22:22:18 +010027from asyncio import selector_events
Victor Stinner29ad0112015-01-15 00:04:21 +010028from asyncio import sslproto
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070029from asyncio import test_utils
Victor Stinnerdc7765d2014-12-18 12:29:53 +010030try:
Victor Stinnerd7ff5a52014-12-26 21:16:42 +010031 from test import support
Victor Stinnerdc7765d2014-12-18 12:29:53 +010032except ImportError:
33 from asyncio import test_support as support
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070034
35
Christian Heimes6d8c1ab2013-12-06 00:23:13 +010036def data_file(filename):
37 if hasattr(support, 'TEST_HOME_DIR'):
38 fullname = os.path.join(support.TEST_HOME_DIR, filename)
39 if os.path.isfile(fullname):
40 return fullname
41 fullname = os.path.join(os.path.dirname(__file__), filename)
42 if os.path.isfile(fullname):
43 return fullname
44 raise FileNotFoundError(filename)
45
Yury Selivanov88a5bf02014-02-18 12:15:06 -050046
Victor Stinner8c33ffd2014-02-19 18:10:32 +010047def osx_tiger():
48 """Return True if the platform is Mac OS 10.4 or older."""
49 if sys.platform != 'darwin':
50 return False
51 version = platform.mac_ver()[0]
52 version = tuple(map(int, version.split('.')))
53 return version < (10, 5)
54
55
Christian Heimes6d8c1ab2013-12-06 00:23:13 +010056ONLYCERT = data_file('ssl_cert.pem')
57ONLYKEY = data_file('ssl_key.pem')
58SIGNED_CERTFILE = data_file('keycert3.pem')
59SIGNING_CA = data_file('pycacert.pem')
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +020060PEERCERT = {'serialNumber': 'B09264B1F2DA21D1',
61 'version': 1,
62 'subject': ((('countryName', 'XY'),),
63 (('localityName', 'Castle Anthrax'),),
64 (('organizationName', 'Python Software Foundation'),),
65 (('commonName', 'localhost'),)),
66 'issuer': ((('countryName', 'XY'),),
67 (('organizationName', 'Python Software Foundation CA'),),
68 (('commonName', 'our-ca-server'),)),
69 'notAfter': 'Nov 13 19:47:07 2022 GMT',
70 'notBefore': 'Jan 4 19:47:07 2013 GMT'}
Christian Heimes6d8c1ab2013-12-06 00:23:13 +010071
72
Yury Selivanov88a5bf02014-02-18 12:15:06 -050073class MyBaseProto(asyncio.Protocol):
Victor Stinnere6a53792014-03-06 01:00:36 +010074 connected = None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070075 done = None
76
77 def __init__(self, loop=None):
Christian Heimes6d8c1ab2013-12-06 00:23:13 +010078 self.transport = None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070079 self.state = 'INITIAL'
80 self.nbytes = 0
81 if loop is not None:
Victor Stinnere6a53792014-03-06 01:00:36 +010082 self.connected = asyncio.Future(loop=loop)
Victor Stinner8dffc452014-01-25 15:32:06 +010083 self.done = asyncio.Future(loop=loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070084
85 def connection_made(self, transport):
86 self.transport = transport
87 assert self.state == 'INITIAL', self.state
88 self.state = 'CONNECTED'
Victor Stinnere6a53792014-03-06 01:00:36 +010089 if self.connected:
90 self.connected.set_result(None)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070091
92 def data_received(self, data):
93 assert self.state == 'CONNECTED', self.state
94 self.nbytes += len(data)
95
96 def eof_received(self):
97 assert self.state == 'CONNECTED', self.state
98 self.state = 'EOF'
99
100 def connection_lost(self, exc):
101 assert self.state in ('CONNECTED', 'EOF'), self.state
102 self.state = 'CLOSED'
103 if self.done:
104 self.done.set_result(None)
105
106
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500107class MyProto(MyBaseProto):
108 def connection_made(self, transport):
109 super().connection_made(transport)
110 transport.write(b'GET / HTTP/1.0\r\nHost: example.com\r\n\r\n')
111
112
Victor Stinner8dffc452014-01-25 15:32:06 +0100113class MyDatagramProto(asyncio.DatagramProtocol):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700114 done = None
115
116 def __init__(self, loop=None):
117 self.state = 'INITIAL'
118 self.nbytes = 0
119 if loop is not None:
Victor Stinner8dffc452014-01-25 15:32:06 +0100120 self.done = asyncio.Future(loop=loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700121
122 def connection_made(self, transport):
123 self.transport = transport
124 assert self.state == 'INITIAL', self.state
125 self.state = 'INITIALIZED'
126
127 def datagram_received(self, data, addr):
128 assert self.state == 'INITIALIZED', self.state
129 self.nbytes += len(data)
130
Guido van Rossum2335de72013-11-15 16:51:48 -0800131 def error_received(self, exc):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700132 assert self.state == 'INITIALIZED', self.state
133
134 def connection_lost(self, exc):
135 assert self.state == 'INITIALIZED', self.state
136 self.state = 'CLOSED'
137 if self.done:
138 self.done.set_result(None)
139
140
Victor Stinner8dffc452014-01-25 15:32:06 +0100141class MyReadPipeProto(asyncio.Protocol):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700142 done = None
143
144 def __init__(self, loop=None):
145 self.state = ['INITIAL']
146 self.nbytes = 0
147 self.transport = None
148 if loop is not None:
Victor Stinner8dffc452014-01-25 15:32:06 +0100149 self.done = asyncio.Future(loop=loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700150
151 def connection_made(self, transport):
152 self.transport = transport
153 assert self.state == ['INITIAL'], self.state
154 self.state.append('CONNECTED')
155
156 def data_received(self, data):
157 assert self.state == ['INITIAL', 'CONNECTED'], self.state
158 self.nbytes += len(data)
159
160 def eof_received(self):
161 assert self.state == ['INITIAL', 'CONNECTED'], self.state
162 self.state.append('EOF')
163
164 def connection_lost(self, exc):
Guido van Rossum02757ea2014-01-10 13:30:04 -0800165 if 'EOF' not in self.state:
166 self.state.append('EOF') # It is okay if EOF is missed.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700167 assert self.state == ['INITIAL', 'CONNECTED', 'EOF'], self.state
168 self.state.append('CLOSED')
169 if self.done:
170 self.done.set_result(None)
171
172
Victor Stinner8dffc452014-01-25 15:32:06 +0100173class MyWritePipeProto(asyncio.BaseProtocol):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700174 done = None
175
176 def __init__(self, loop=None):
177 self.state = 'INITIAL'
178 self.transport = None
179 if loop is not None:
Victor Stinner8dffc452014-01-25 15:32:06 +0100180 self.done = asyncio.Future(loop=loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700181
182 def connection_made(self, transport):
183 self.transport = transport
184 assert self.state == 'INITIAL', self.state
185 self.state = 'CONNECTED'
186
187 def connection_lost(self, exc):
188 assert self.state == 'CONNECTED', self.state
189 self.state = 'CLOSED'
190 if self.done:
191 self.done.set_result(None)
192
193
Victor Stinner8dffc452014-01-25 15:32:06 +0100194class MySubprocessProtocol(asyncio.SubprocessProtocol):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700195
196 def __init__(self, loop):
197 self.state = 'INITIAL'
198 self.transport = None
Victor Stinner8dffc452014-01-25 15:32:06 +0100199 self.connected = asyncio.Future(loop=loop)
200 self.completed = asyncio.Future(loop=loop)
201 self.disconnects = {fd: asyncio.Future(loop=loop) for fd in range(3)}
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700202 self.data = {1: b'', 2: b''}
203 self.returncode = None
Victor Stinner8dffc452014-01-25 15:32:06 +0100204 self.got_data = {1: asyncio.Event(loop=loop),
205 2: asyncio.Event(loop=loop)}
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700206
207 def connection_made(self, transport):
208 self.transport = transport
209 assert self.state == 'INITIAL', self.state
210 self.state = 'CONNECTED'
211 self.connected.set_result(None)
212
213 def connection_lost(self, exc):
214 assert self.state == 'CONNECTED', self.state
215 self.state = 'CLOSED'
216 self.completed.set_result(None)
217
218 def pipe_data_received(self, fd, data):
219 assert self.state == 'CONNECTED', self.state
220 self.data[fd] += data
221 self.got_data[fd].set()
222
223 def pipe_connection_lost(self, fd, exc):
224 assert self.state == 'CONNECTED', self.state
225 if exc:
226 self.disconnects[fd].set_exception(exc)
227 else:
228 self.disconnects[fd].set_result(exc)
229
230 def process_exited(self):
231 assert self.state == 'CONNECTED', self.state
232 self.returncode = self.transport.get_returncode()
233
234
235class EventLoopTestsMixin:
236
237 def setUp(self):
238 super().setUp()
239 self.loop = self.create_event_loop()
Victor Stinnerc73701d2014-06-18 01:36:32 +0200240 self.set_event_loop(self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700241
242 def tearDown(self):
243 # just in case if we have transport close callbacks
Victor Stinnere80bf0d2014-12-04 23:07:47 +0100244 if not self.loop.is_closed():
245 test_utils.run_briefly(self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700246
247 self.loop.close()
248 gc.collect()
249 super().tearDown()
250
251 def test_run_until_complete_nesting(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100252 @asyncio.coroutine
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700253 def coro1():
254 yield
255
Victor Stinner8dffc452014-01-25 15:32:06 +0100256 @asyncio.coroutine
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700257 def coro2():
258 self.assertTrue(self.loop.is_running())
259 self.loop.run_until_complete(coro1())
260
261 self.assertRaises(
262 RuntimeError, self.loop.run_until_complete, coro2())
263
264 # Note: because of the default Windows timing granularity of
265 # 15.6 msec, we use fairly long sleep times here (~100 msec).
266
267 def test_run_until_complete(self):
268 t0 = self.loop.time()
Victor Stinner8dffc452014-01-25 15:32:06 +0100269 self.loop.run_until_complete(asyncio.sleep(0.1, loop=self.loop))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700270 t1 = self.loop.time()
Guido van Rossum051a3312013-10-18 15:15:56 -0700271 self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700272
273 def test_run_until_complete_stopped(self):
Victor Stinner8dffc452014-01-25 15:32:06 +0100274 @asyncio.coroutine
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700275 def cb():
276 self.loop.stop()
Victor Stinner8dffc452014-01-25 15:32:06 +0100277 yield from asyncio.sleep(0.1, loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700278 task = cb()
279 self.assertRaises(RuntimeError,
280 self.loop.run_until_complete, task)
281
282 def test_call_later(self):
283 results = []
284
285 def callback(arg):
286 results.append(arg)
287 self.loop.stop()
288
289 self.loop.call_later(0.1, callback, 'hello world')
290 t0 = time.monotonic()
291 self.loop.run_forever()
292 t1 = time.monotonic()
293 self.assertEqual(results, ['hello world'])
Guido van Rossum051a3312013-10-18 15:15:56 -0700294 self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700295
296 def test_call_soon(self):
297 results = []
298
299 def callback(arg1, arg2):
300 results.append((arg1, arg2))
301 self.loop.stop()
302
303 self.loop.call_soon(callback, 'hello', 'world')
304 self.loop.run_forever()
305 self.assertEqual(results, [('hello', 'world')])
306
307 def test_call_soon_threadsafe(self):
308 results = []
309 lock = threading.Lock()
310
311 def callback(arg):
312 results.append(arg)
313 if len(results) >= 2:
314 self.loop.stop()
315
316 def run_in_thread():
317 self.loop.call_soon_threadsafe(callback, 'hello')
318 lock.release()
319
320 lock.acquire()
321 t = threading.Thread(target=run_in_thread)
322 t.start()
323
324 with lock:
325 self.loop.call_soon(callback, 'world')
326 self.loop.run_forever()
327 t.join()
328 self.assertEqual(results, ['hello', 'world'])
329
330 def test_call_soon_threadsafe_same_thread(self):
331 results = []
332
333 def callback(arg):
334 results.append(arg)
335 if len(results) >= 2:
336 self.loop.stop()
337
338 self.loop.call_soon_threadsafe(callback, 'hello')
339 self.loop.call_soon(callback, 'world')
340 self.loop.run_forever()
341 self.assertEqual(results, ['hello', 'world'])
342
343 def test_run_in_executor(self):
344 def run(arg):
345 return (arg, threading.get_ident())
346 f2 = self.loop.run_in_executor(None, run, 'yo')
347 res, thread_id = self.loop.run_until_complete(f2)
348 self.assertEqual(res, 'yo')
349 self.assertNotEqual(thread_id, threading.get_ident())
350
351 def test_reader_callback(self):
352 r, w = test_utils.socketpair()
Victor Stinnere6a53792014-03-06 01:00:36 +0100353 r.setblocking(False)
354 bytes_read = bytearray()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700355
356 def reader():
357 try:
358 data = r.recv(1024)
359 except BlockingIOError:
360 # Spurious readiness notifications are possible
361 # at least on Linux -- see man select.
362 return
363 if data:
Victor Stinnere6a53792014-03-06 01:00:36 +0100364 bytes_read.extend(data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700365 else:
366 self.assertTrue(self.loop.remove_reader(r.fileno()))
367 r.close()
368
369 self.loop.add_reader(r.fileno(), reader)
370 self.loop.call_soon(w.send, b'abc')
Victor Stinnere6a53792014-03-06 01:00:36 +0100371 test_utils.run_until(self.loop, lambda: len(bytes_read) >= 3)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700372 self.loop.call_soon(w.send, b'def')
Victor Stinnere6a53792014-03-06 01:00:36 +0100373 test_utils.run_until(self.loop, lambda: len(bytes_read) >= 6)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700374 self.loop.call_soon(w.close)
375 self.loop.call_soon(self.loop.stop)
376 self.loop.run_forever()
Victor Stinnere6a53792014-03-06 01:00:36 +0100377 self.assertEqual(bytes_read, b'abcdef')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700378
379 def test_writer_callback(self):
380 r, w = test_utils.socketpair()
381 w.setblocking(False)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700382
Victor Stinnere6a53792014-03-06 01:00:36 +0100383 def writer(data):
384 w.send(data)
385 self.loop.stop()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700386
Victor Stinnere6a53792014-03-06 01:00:36 +0100387 data = b'x' * 1024
388 self.loop.add_writer(w.fileno(), writer, data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700389 self.loop.run_forever()
Victor Stinnere6a53792014-03-06 01:00:36 +0100390
391 self.assertTrue(self.loop.remove_writer(w.fileno()))
392 self.assertFalse(self.loop.remove_writer(w.fileno()))
393
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700394 w.close()
Victor Stinnere6a53792014-03-06 01:00:36 +0100395 read = r.recv(len(data) * 2)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700396 r.close()
Victor Stinnere6a53792014-03-06 01:00:36 +0100397 self.assertEqual(read, data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700398
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500399 def _basetest_sock_client_ops(self, httpd, sock):
Victor Stinnerb2614752014-08-25 23:20:52 +0200400 if not isinstance(self.loop, proactor_events.BaseProactorEventLoop):
401 # in debug mode, socket operations must fail
402 # if the socket is not in blocking mode
403 self.loop.set_debug(True)
404 sock.setblocking(True)
405 with self.assertRaises(ValueError):
406 self.loop.run_until_complete(
407 self.loop.sock_connect(sock, httpd.address))
408 with self.assertRaises(ValueError):
409 self.loop.run_until_complete(
410 self.loop.sock_sendall(sock, b'GET / HTTP/1.0\r\n\r\n'))
411 with self.assertRaises(ValueError):
412 self.loop.run_until_complete(
413 self.loop.sock_recv(sock, 1024))
414 with self.assertRaises(ValueError):
415 self.loop.run_until_complete(
416 self.loop.sock_accept(sock))
Victor Stinner9c9f1f12014-07-29 23:08:17 +0200417
418 # test in non-blocking mode
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500419 sock.setblocking(False)
420 self.loop.run_until_complete(
421 self.loop.sock_connect(sock, httpd.address))
422 self.loop.run_until_complete(
423 self.loop.sock_sendall(sock, b'GET / HTTP/1.0\r\n\r\n'))
424 data = self.loop.run_until_complete(
425 self.loop.sock_recv(sock, 1024))
426 # consume data
427 self.loop.run_until_complete(
428 self.loop.sock_recv(sock, 1024))
429 sock.close()
430 self.assertTrue(data.startswith(b'HTTP/1.0 200 OK'))
431
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700432 def test_sock_client_ops(self):
433 with test_utils.run_test_server() as httpd:
434 sock = socket.socket()
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500435 self._basetest_sock_client_ops(httpd, sock)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700436
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500437 @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets')
438 def test_unix_sock_client_ops(self):
439 with test_utils.run_test_unix_server() as httpd:
440 sock = socket.socket(socket.AF_UNIX)
441 self._basetest_sock_client_ops(httpd, sock)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700442
443 def test_sock_client_fail(self):
444 # Make sure that we will get an unused port
445 address = None
446 try:
447 s = socket.socket()
448 s.bind(('127.0.0.1', 0))
449 address = s.getsockname()
450 finally:
451 s.close()
452
453 sock = socket.socket()
454 sock.setblocking(False)
455 with self.assertRaises(ConnectionRefusedError):
456 self.loop.run_until_complete(
457 self.loop.sock_connect(sock, address))
458 sock.close()
459
460 def test_sock_accept(self):
461 listener = socket.socket()
462 listener.setblocking(False)
463 listener.bind(('127.0.0.1', 0))
464 listener.listen(1)
465 client = socket.socket()
466 client.connect(listener.getsockname())
467
468 f = self.loop.sock_accept(listener)
469 conn, addr = self.loop.run_until_complete(f)
470 self.assertEqual(conn.gettimeout(), 0)
471 self.assertEqual(addr, client.getsockname())
472 self.assertEqual(client.getpeername(), listener.getsockname())
473 client.close()
474 conn.close()
475 listener.close()
476
477 @unittest.skipUnless(hasattr(signal, 'SIGKILL'), 'No SIGKILL')
478 def test_add_signal_handler(self):
479 caught = 0
480
481 def my_handler():
482 nonlocal caught
483 caught += 1
484
485 # Check error behavior first.
486 self.assertRaises(
487 TypeError, self.loop.add_signal_handler, 'boom', my_handler)
488 self.assertRaises(
489 TypeError, self.loop.remove_signal_handler, 'boom')
490 self.assertRaises(
491 ValueError, self.loop.add_signal_handler, signal.NSIG+1,
492 my_handler)
493 self.assertRaises(
494 ValueError, self.loop.remove_signal_handler, signal.NSIG+1)
495 self.assertRaises(
496 ValueError, self.loop.add_signal_handler, 0, my_handler)
497 self.assertRaises(
498 ValueError, self.loop.remove_signal_handler, 0)
499 self.assertRaises(
500 ValueError, self.loop.add_signal_handler, -1, my_handler)
501 self.assertRaises(
502 ValueError, self.loop.remove_signal_handler, -1)
503 self.assertRaises(
504 RuntimeError, self.loop.add_signal_handler, signal.SIGKILL,
505 my_handler)
506 # Removing SIGKILL doesn't raise, since we don't call signal().
507 self.assertFalse(self.loop.remove_signal_handler(signal.SIGKILL))
508 # Now set a handler and handle it.
509 self.loop.add_signal_handler(signal.SIGINT, my_handler)
Victor Stinnere6a53792014-03-06 01:00:36 +0100510
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700511 os.kill(os.getpid(), signal.SIGINT)
Victor Stinnere6a53792014-03-06 01:00:36 +0100512 test_utils.run_until(self.loop, lambda: caught)
513
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700514 # Removing it should restore the default handler.
515 self.assertTrue(self.loop.remove_signal_handler(signal.SIGINT))
516 self.assertEqual(signal.getsignal(signal.SIGINT),
517 signal.default_int_handler)
518 # Removing again returns False.
519 self.assertFalse(self.loop.remove_signal_handler(signal.SIGINT))
520
521 @unittest.skipUnless(hasattr(signal, 'SIGALRM'), 'No SIGALRM')
522 def test_signal_handling_while_selecting(self):
523 # Test with a signal actually arriving during a select() call.
524 caught = 0
525
526 def my_handler():
527 nonlocal caught
528 caught += 1
529 self.loop.stop()
530
531 self.loop.add_signal_handler(signal.SIGALRM, my_handler)
532
533 signal.setitimer(signal.ITIMER_REAL, 0.01, 0) # Send SIGALRM once.
534 self.loop.run_forever()
535 self.assertEqual(caught, 1)
536
537 @unittest.skipUnless(hasattr(signal, 'SIGALRM'), 'No SIGALRM')
538 def test_signal_handling_args(self):
539 some_args = (42,)
540 caught = 0
541
542 def my_handler(*args):
543 nonlocal caught
544 caught += 1
545 self.assertEqual(args, some_args)
546
547 self.loop.add_signal_handler(signal.SIGALRM, my_handler, *some_args)
548
Guido van Rossum051a3312013-10-18 15:15:56 -0700549 signal.setitimer(signal.ITIMER_REAL, 0.1, 0) # Send SIGALRM once.
550 self.loop.call_later(0.5, self.loop.stop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700551 self.loop.run_forever()
552 self.assertEqual(caught, 1)
553
Victor Stinner4ac30f12014-02-19 18:32:03 +0100554 def _basetest_create_connection(self, connection_fut, check_sockname=True):
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500555 tr, pr = self.loop.run_until_complete(connection_fut)
556 self.assertIsInstance(tr, asyncio.Transport)
557 self.assertIsInstance(pr, asyncio.Protocol)
Victor Stinnerbfff45d2014-07-08 23:57:31 +0200558 self.assertIs(pr.transport, tr)
Victor Stinner8c33ffd2014-02-19 18:10:32 +0100559 if check_sockname:
560 self.assertIsNotNone(tr.get_extra_info('sockname'))
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500561 self.loop.run_until_complete(pr.done)
562 self.assertGreater(pr.nbytes, 0)
563 tr.close()
564
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700565 def test_create_connection(self):
566 with test_utils.run_test_server() as httpd:
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500567 conn_fut = self.loop.create_connection(
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700568 lambda: MyProto(loop=self.loop), *httpd.address)
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500569 self._basetest_create_connection(conn_fut)
570
571 @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets')
572 def test_create_unix_connection(self):
Victor Stinner8c33ffd2014-02-19 18:10:32 +0100573 # Issue #20682: On Mac OS X Tiger, getsockname() returns a
574 # zero-length address for UNIX socket.
575 check_sockname = not osx_tiger()
576
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500577 with test_utils.run_test_unix_server() as httpd:
578 conn_fut = self.loop.create_unix_connection(
579 lambda: MyProto(loop=self.loop), httpd.address)
Victor Stinner8c33ffd2014-02-19 18:10:32 +0100580 self._basetest_create_connection(conn_fut, check_sockname)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700581
582 def test_create_connection_sock(self):
583 with test_utils.run_test_server() as httpd:
584 sock = None
585 infos = self.loop.run_until_complete(
586 self.loop.getaddrinfo(
587 *httpd.address, type=socket.SOCK_STREAM))
588 for family, type, proto, cname, address in infos:
589 try:
590 sock = socket.socket(family=family, type=type, proto=proto)
591 sock.setblocking(False)
592 self.loop.run_until_complete(
593 self.loop.sock_connect(sock, address))
594 except:
595 pass
596 else:
597 break
598 else:
599 assert False, 'Can not create socket.'
600
601 f = self.loop.create_connection(
602 lambda: MyProto(loop=self.loop), sock=sock)
603 tr, pr = self.loop.run_until_complete(f)
Victor Stinner8dffc452014-01-25 15:32:06 +0100604 self.assertIsInstance(tr, asyncio.Transport)
605 self.assertIsInstance(pr, asyncio.Protocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700606 self.loop.run_until_complete(pr.done)
607 self.assertGreater(pr.nbytes, 0)
608 tr.close()
609
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200610 def check_ssl_extra_info(self, client, check_sockname=True,
611 peername=None, peercert={}):
612 if check_sockname:
613 self.assertIsNotNone(client.get_extra_info('sockname'))
614 if peername:
615 self.assertEqual(peername,
616 client.get_extra_info('peername'))
617 else:
618 self.assertIsNotNone(client.get_extra_info('peername'))
619 self.assertEqual(peercert,
620 client.get_extra_info('peercert'))
621
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200622 # test SSL cipher
623 cipher = client.get_extra_info('cipher')
624 self.assertIsInstance(cipher, tuple)
625 self.assertEqual(len(cipher), 3, cipher)
626 self.assertIsInstance(cipher[0], str)
627 self.assertIsInstance(cipher[1], str)
628 self.assertIsInstance(cipher[2], int)
629
630 # test SSL object
631 sslobj = client.get_extra_info('ssl_object')
632 self.assertIsNotNone(sslobj)
633 self.assertEqual(sslobj.compression(),
634 client.get_extra_info('compression'))
635 self.assertEqual(sslobj.cipher(),
636 client.get_extra_info('cipher'))
637 self.assertEqual(sslobj.getpeercert(),
638 client.get_extra_info('peercert'))
Victor Stinner72e1eae2015-09-21 22:20:19 +0200639 self.assertEqual(sslobj.compression(),
640 client.get_extra_info('compression'))
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200641
Victor Stinner8c33ffd2014-02-19 18:10:32 +0100642 def _basetest_create_ssl_connection(self, connection_fut,
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200643 check_sockname=True,
644 peername=None):
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500645 tr, pr = self.loop.run_until_complete(connection_fut)
646 self.assertIsInstance(tr, asyncio.Transport)
647 self.assertIsInstance(pr, asyncio.Protocol)
648 self.assertTrue('ssl' in tr.__class__.__name__.lower())
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200649 self.check_ssl_extra_info(tr, check_sockname, peername)
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500650 self.loop.run_until_complete(pr.done)
651 self.assertGreater(pr.nbytes, 0)
652 tr.close()
653
Antoine Pitroufd39a892014-10-15 16:58:21 +0200654 def _test_create_ssl_connection(self, httpd, create_connection,
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200655 check_sockname=True, peername=None):
Antoine Pitroufd39a892014-10-15 16:58:21 +0200656 conn_fut = create_connection(ssl=test_utils.dummy_ssl_context())
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200657 self._basetest_create_ssl_connection(conn_fut, check_sockname,
658 peername)
Antoine Pitroufd39a892014-10-15 16:58:21 +0200659
Victor Stinner662fd5f2014-11-20 14:16:31 +0100660 # ssl.Purpose was introduced in Python 3.4
661 if hasattr(ssl, 'Purpose'):
662 def _dummy_ssl_create_context(purpose=ssl.Purpose.SERVER_AUTH, *,
663 cafile=None, capath=None,
664 cadata=None):
665 """
666 A ssl.create_default_context() replacement that doesn't enable
667 cert validation.
668 """
669 self.assertEqual(purpose, ssl.Purpose.SERVER_AUTH)
670 return test_utils.dummy_ssl_context()
671
672 # With ssl=True, ssl.create_default_context() should be called
673 with mock.patch('ssl.create_default_context',
674 side_effect=_dummy_ssl_create_context) as m:
675 conn_fut = create_connection(ssl=True)
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200676 self._basetest_create_ssl_connection(conn_fut, check_sockname,
677 peername)
Victor Stinner662fd5f2014-11-20 14:16:31 +0100678 self.assertEqual(m.call_count, 1)
Antoine Pitroufd39a892014-10-15 16:58:21 +0200679
680 # With the real ssl.create_default_context(), certificate
681 # validation will fail
682 with self.assertRaises(ssl.SSLError) as cm:
683 conn_fut = create_connection(ssl=True)
Victor Stinnerc1ad35a2014-11-20 14:19:23 +0100684 # Ignore the "SSL handshake failed" log in debug mode
685 with test_utils.disable_logger():
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200686 self._basetest_create_ssl_connection(conn_fut, check_sockname,
687 peername)
Antoine Pitroufd39a892014-10-15 16:58:21 +0200688
689 self.assertEqual(cm.exception.reason, 'CERTIFICATE_VERIFY_FAILED')
690
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700691 @unittest.skipIf(ssl is None, 'No ssl module')
692 def test_create_ssl_connection(self):
693 with test_utils.run_test_server(use_ssl=True) as httpd:
Antoine Pitroufd39a892014-10-15 16:58:21 +0200694 create_connection = functools.partial(
695 self.loop.create_connection,
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500696 lambda: MyProto(loop=self.loop),
Antoine Pitroufd39a892014-10-15 16:58:21 +0200697 *httpd.address)
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200698 self._test_create_ssl_connection(httpd, create_connection,
699 peername=httpd.address)
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500700
Victor Stinner231b4042015-01-14 00:19:09 +0100701 def test_legacy_create_ssl_connection(self):
702 with test_utils.force_legacy_ssl_support():
703 self.test_create_ssl_connection()
704
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500705 @unittest.skipIf(ssl is None, 'No ssl module')
706 @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets')
707 def test_create_ssl_unix_connection(self):
Victor Stinner8c33ffd2014-02-19 18:10:32 +0100708 # Issue #20682: On Mac OS X Tiger, getsockname() returns a
709 # zero-length address for UNIX socket.
710 check_sockname = not osx_tiger()
711
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500712 with test_utils.run_test_unix_server(use_ssl=True) as httpd:
Antoine Pitroufd39a892014-10-15 16:58:21 +0200713 create_connection = functools.partial(
714 self.loop.create_unix_connection,
715 lambda: MyProto(loop=self.loop), httpd.address,
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500716 server_hostname='127.0.0.1')
717
Antoine Pitroufd39a892014-10-15 16:58:21 +0200718 self._test_create_ssl_connection(httpd, create_connection,
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200719 check_sockname,
720 peername=httpd.address)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700721
Victor Stinner231b4042015-01-14 00:19:09 +0100722 def test_legacy_create_ssl_unix_connection(self):
723 with test_utils.force_legacy_ssl_support():
724 self.test_create_ssl_unix_connection()
725
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700726 def test_create_connection_local_addr(self):
727 with test_utils.run_test_server() as httpd:
Christian Heimes6d8c1ab2013-12-06 00:23:13 +0100728 port = support.find_unused_port()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700729 f = self.loop.create_connection(
730 lambda: MyProto(loop=self.loop),
731 *httpd.address, local_addr=(httpd.address[0], port))
732 tr, pr = self.loop.run_until_complete(f)
733 expected = pr.transport.get_extra_info('sockname')[1]
734 self.assertEqual(port, expected)
735 tr.close()
736
737 def test_create_connection_local_addr_in_use(self):
738 with test_utils.run_test_server() as httpd:
739 f = self.loop.create_connection(
740 lambda: MyProto(loop=self.loop),
741 *httpd.address, local_addr=httpd.address)
742 with self.assertRaises(OSError) as cm:
743 self.loop.run_until_complete(f)
744 self.assertEqual(cm.exception.errno, errno.EADDRINUSE)
745 self.assertIn(str(httpd.address), cm.exception.strerror)
746
Victor Stinner5e4a7d82015-09-21 18:33:43 +0200747 @mock.patch('asyncio.base_events.socket')
748 def create_server_multiple_hosts(self, family, hosts, mock_sock):
749 @asyncio.coroutine
750 def getaddrinfo(host, port, *args, **kw):
751 if family == socket.AF_INET:
752 return [[family, socket.SOCK_STREAM, 6, '', (host, port)]]
753 else:
754 return [[family, socket.SOCK_STREAM, 6, '', (host, port, 0, 0)]]
755
756 def getaddrinfo_task(*args, **kwds):
757 return asyncio.Task(getaddrinfo(*args, **kwds), loop=self.loop)
758
759 if family == socket.AF_INET:
760 mock_sock.socket().getsockbyname.side_effect = [(host, 80)
761 for host in hosts]
762 else:
763 mock_sock.socket().getsockbyname.side_effect = [(host, 80, 0, 0)
764 for host in hosts]
765 self.loop.getaddrinfo = getaddrinfo_task
766 self.loop._start_serving = mock.Mock()
767 f = self.loop.create_server(lambda: MyProto(self.loop), hosts, 80)
768 server = self.loop.run_until_complete(f)
769 self.addCleanup(server.close)
770 server_hosts = [sock.getsockbyname()[0] for sock in server.sockets]
771 self.assertEqual(server_hosts, hosts)
772
773 def test_create_server_multiple_hosts_ipv4(self):
774 self.create_server_multiple_hosts(socket.AF_INET,
775 ['1.2.3.4', '5.6.7.8'])
776
777 def test_create_server_multiple_hosts_ipv6(self):
778 self.create_server_multiple_hosts(socket.AF_INET6, ['::1', '::2'])
779
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700780 def test_create_server(self):
Victor Stinnere6a53792014-03-06 01:00:36 +0100781 proto = MyProto(self.loop)
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500782 f = self.loop.create_server(lambda: proto, '0.0.0.0', 0)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700783 server = self.loop.run_until_complete(f)
784 self.assertEqual(len(server.sockets), 1)
785 sock = server.sockets[0]
786 host, port = sock.getsockname()
787 self.assertEqual(host, '0.0.0.0')
788 client = socket.socket()
789 client.connect(('127.0.0.1', port))
Antoine Pitroud20afad2013-10-20 01:51:25 +0200790 client.sendall(b'xxx')
Victor Stinnere6a53792014-03-06 01:00:36 +0100791
792 self.loop.run_until_complete(proto.connected)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700793 self.assertEqual('CONNECTED', proto.state)
Victor Stinnere6a53792014-03-06 01:00:36 +0100794
795 test_utils.run_until(self.loop, lambda: proto.nbytes > 0)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700796 self.assertEqual(3, proto.nbytes)
797
798 # extra info is available
799 self.assertIsNotNone(proto.transport.get_extra_info('sockname'))
800 self.assertEqual('127.0.0.1',
801 proto.transport.get_extra_info('peername')[0])
802
803 # close connection
804 proto.transport.close()
Victor Stinnere6a53792014-03-06 01:00:36 +0100805 self.loop.run_until_complete(proto.done)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700806
807 self.assertEqual('CLOSED', proto.state)
808
809 # the client socket must be closed after to avoid ECONNRESET upon
810 # recv()/send() on the serving socket
811 client.close()
812
813 # close server
814 server.close()
815
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500816 def _make_unix_server(self, factory, **kwargs):
817 path = test_utils.gen_unix_socket_path()
818 self.addCleanup(lambda: os.path.exists(path) and os.unlink(path))
819
820 f = self.loop.create_unix_server(factory, path, **kwargs)
821 server = self.loop.run_until_complete(f)
822
823 return server, path
824
825 @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets')
826 def test_create_unix_server(self):
Victor Stinnere6a53792014-03-06 01:00:36 +0100827 proto = MyProto(loop=self.loop)
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500828 server, path = self._make_unix_server(lambda: proto)
829 self.assertEqual(len(server.sockets), 1)
830
831 client = socket.socket(socket.AF_UNIX)
832 client.connect(path)
833 client.sendall(b'xxx')
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500834
Victor Stinnere6a53792014-03-06 01:00:36 +0100835 self.loop.run_until_complete(proto.connected)
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500836 self.assertEqual('CONNECTED', proto.state)
Victor Stinnere6a53792014-03-06 01:00:36 +0100837 test_utils.run_until(self.loop, lambda: proto.nbytes > 0)
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500838 self.assertEqual(3, proto.nbytes)
839
840 # close connection
841 proto.transport.close()
Victor Stinnere6a53792014-03-06 01:00:36 +0100842 self.loop.run_until_complete(proto.done)
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500843
844 self.assertEqual('CLOSED', proto.state)
845
846 # the client socket must be closed after to avoid ECONNRESET upon
847 # recv()/send() on the serving socket
848 client.close()
849
850 # close server
851 server.close()
852
Victor Stinner1fd03a42014-04-07 11:18:54 +0200853 @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets')
854 def test_create_unix_server_path_socket_error(self):
855 proto = MyProto(loop=self.loop)
856 sock = socket.socket()
857 with sock:
858 f = self.loop.create_unix_server(lambda: proto, '/test', sock=sock)
859 with self.assertRaisesRegex(ValueError,
860 'path and sock can not be specified '
861 'at the same time'):
Victor Stinner770e48d2014-07-11 11:58:33 +0200862 self.loop.run_until_complete(f)
Victor Stinner1fd03a42014-04-07 11:18:54 +0200863
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500864 def _create_ssl_context(self, certfile, keyfile=None):
Christian Heimes6d8c1ab2013-12-06 00:23:13 +0100865 sslcontext = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
866 sslcontext.options |= ssl.OP_NO_SSLv2
867 sslcontext.load_cert_chain(certfile, keyfile)
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500868 return sslcontext
Christian Heimes6d8c1ab2013-12-06 00:23:13 +0100869
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500870 def _make_ssl_server(self, factory, certfile, keyfile=None):
871 sslcontext = self._create_ssl_context(certfile, keyfile)
Christian Heimes6d8c1ab2013-12-06 00:23:13 +0100872
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500873 f = self.loop.create_server(factory, '127.0.0.1', 0, ssl=sslcontext)
Christian Heimes6d8c1ab2013-12-06 00:23:13 +0100874 server = self.loop.run_until_complete(f)
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500875
Christian Heimes6d8c1ab2013-12-06 00:23:13 +0100876 sock = server.sockets[0]
877 host, port = sock.getsockname()
878 self.assertEqual(host, '127.0.0.1')
879 return server, host, port
880
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500881 def _make_ssl_unix_server(self, factory, certfile, keyfile=None):
882 sslcontext = self._create_ssl_context(certfile, keyfile)
883 return self._make_unix_server(factory, ssl=sslcontext)
884
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700885 @unittest.skipIf(ssl is None, 'No ssl module')
886 def test_create_server_ssl(self):
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500887 proto = MyProto(loop=self.loop)
888 server, host, port = self._make_ssl_server(
889 lambda: proto, ONLYCERT, ONLYKEY)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700890
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500891 f_c = self.loop.create_connection(MyBaseProto, host, port,
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700892 ssl=test_utils.dummy_ssl_context())
893 client, pr = self.loop.run_until_complete(f_c)
894
895 client.write(b'xxx')
Victor Stinnere6a53792014-03-06 01:00:36 +0100896 self.loop.run_until_complete(proto.connected)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700897 self.assertEqual('CONNECTED', proto.state)
Victor Stinnere6a53792014-03-06 01:00:36 +0100898
899 test_utils.run_until(self.loop, lambda: proto.nbytes > 0)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700900 self.assertEqual(3, proto.nbytes)
901
902 # extra info is available
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +0200903 self.check_ssl_extra_info(client, peername=(host, port))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700904
905 # close connection
906 proto.transport.close()
907 self.loop.run_until_complete(proto.done)
908 self.assertEqual('CLOSED', proto.state)
909
910 # the client socket must be closed after to avoid ECONNRESET upon
911 # recv()/send() on the serving socket
912 client.close()
913
914 # stop serving
915 server.close()
916
Victor Stinner231b4042015-01-14 00:19:09 +0100917 def test_legacy_create_server_ssl(self):
918 with test_utils.force_legacy_ssl_support():
919 self.test_create_server_ssl()
920
Christian Heimes6d8c1ab2013-12-06 00:23:13 +0100921 @unittest.skipIf(ssl is None, 'No ssl module')
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500922 @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets')
923 def test_create_unix_server_ssl(self):
924 proto = MyProto(loop=self.loop)
925 server, path = self._make_ssl_unix_server(
926 lambda: proto, ONLYCERT, ONLYKEY)
927
928 f_c = self.loop.create_unix_connection(
929 MyBaseProto, path, ssl=test_utils.dummy_ssl_context(),
930 server_hostname='')
931
932 client, pr = self.loop.run_until_complete(f_c)
933
934 client.write(b'xxx')
Victor Stinnere6a53792014-03-06 01:00:36 +0100935 self.loop.run_until_complete(proto.connected)
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500936 self.assertEqual('CONNECTED', proto.state)
Victor Stinnere6a53792014-03-06 01:00:36 +0100937 test_utils.run_until(self.loop, lambda: proto.nbytes > 0)
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500938 self.assertEqual(3, proto.nbytes)
939
940 # close connection
941 proto.transport.close()
942 self.loop.run_until_complete(proto.done)
943 self.assertEqual('CLOSED', proto.state)
944
945 # the client socket must be closed after to avoid ECONNRESET upon
946 # recv()/send() on the serving socket
947 client.close()
948
949 # stop serving
950 server.close()
951
Victor Stinner231b4042015-01-14 00:19:09 +0100952 def test_legacy_create_unix_server_ssl(self):
953 with test_utils.force_legacy_ssl_support():
954 self.test_create_unix_server_ssl()
955
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500956 @unittest.skipIf(ssl is None, 'No ssl module')
Christian Heimes6d8c1ab2013-12-06 00:23:13 +0100957 def test_create_server_ssl_verify_failed(self):
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500958 proto = MyProto(loop=self.loop)
959 server, host, port = self._make_ssl_server(
960 lambda: proto, SIGNED_CERTFILE)
Christian Heimes6d8c1ab2013-12-06 00:23:13 +0100961
962 sslcontext_client = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
963 sslcontext_client.options |= ssl.OP_NO_SSLv2
964 sslcontext_client.verify_mode = ssl.CERT_REQUIRED
965 if hasattr(sslcontext_client, 'check_hostname'):
966 sslcontext_client.check_hostname = True
967
Victor Stinner29342622015-01-29 14:15:19 +0100968
Christian Heimes6d8c1ab2013-12-06 00:23:13 +0100969 # no CA loaded
970 f_c = self.loop.create_connection(MyProto, host, port,
971 ssl=sslcontext_client)
Victor Stinner29342622015-01-29 14:15:19 +0100972 with mock.patch.object(self.loop, 'call_exception_handler'):
973 with test_utils.disable_logger():
974 with self.assertRaisesRegex(ssl.SSLError,
975 'certificate verify failed '):
976 self.loop.run_until_complete(f_c)
977
978 # execute the loop to log the connection error
979 test_utils.run_briefly(self.loop)
Christian Heimes6d8c1ab2013-12-06 00:23:13 +0100980
981 # close connection
982 self.assertIsNone(proto.transport)
983 server.close()
984
Victor Stinner231b4042015-01-14 00:19:09 +0100985 def test_legacy_create_server_ssl_verify_failed(self):
986 with test_utils.force_legacy_ssl_support():
987 self.test_create_server_ssl_verify_failed()
988
Christian Heimes6d8c1ab2013-12-06 00:23:13 +0100989 @unittest.skipIf(ssl is None, 'No ssl module')
Yury Selivanov88a5bf02014-02-18 12:15:06 -0500990 @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets')
991 def test_create_unix_server_ssl_verify_failed(self):
992 proto = MyProto(loop=self.loop)
993 server, path = self._make_ssl_unix_server(
994 lambda: proto, SIGNED_CERTFILE)
995
996 sslcontext_client = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
997 sslcontext_client.options |= ssl.OP_NO_SSLv2
998 sslcontext_client.verify_mode = ssl.CERT_REQUIRED
999 if hasattr(sslcontext_client, 'check_hostname'):
1000 sslcontext_client.check_hostname = True
1001
1002 # no CA loaded
1003 f_c = self.loop.create_unix_connection(MyProto, path,
1004 ssl=sslcontext_client,
1005 server_hostname='invalid')
Victor Stinner29342622015-01-29 14:15:19 +01001006 with mock.patch.object(self.loop, 'call_exception_handler'):
1007 with test_utils.disable_logger():
1008 with self.assertRaisesRegex(ssl.SSLError,
1009 'certificate verify failed '):
1010 self.loop.run_until_complete(f_c)
1011
1012 # execute the loop to log the connection error
1013 test_utils.run_briefly(self.loop)
Yury Selivanov88a5bf02014-02-18 12:15:06 -05001014
1015 # close connection
1016 self.assertIsNone(proto.transport)
1017 server.close()
1018
Victor Stinner29342622015-01-29 14:15:19 +01001019
Victor Stinner231b4042015-01-14 00:19:09 +01001020 def test_legacy_create_unix_server_ssl_verify_failed(self):
1021 with test_utils.force_legacy_ssl_support():
1022 self.test_create_unix_server_ssl_verify_failed()
1023
Yury Selivanov88a5bf02014-02-18 12:15:06 -05001024 @unittest.skipIf(ssl is None, 'No ssl module')
Christian Heimes6d8c1ab2013-12-06 00:23:13 +01001025 def test_create_server_ssl_match_failed(self):
Yury Selivanov88a5bf02014-02-18 12:15:06 -05001026 proto = MyProto(loop=self.loop)
1027 server, host, port = self._make_ssl_server(
1028 lambda: proto, SIGNED_CERTFILE)
Christian Heimes6d8c1ab2013-12-06 00:23:13 +01001029
1030 sslcontext_client = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
1031 sslcontext_client.options |= ssl.OP_NO_SSLv2
1032 sslcontext_client.verify_mode = ssl.CERT_REQUIRED
1033 sslcontext_client.load_verify_locations(
1034 cafile=SIGNING_CA)
1035 if hasattr(sslcontext_client, 'check_hostname'):
1036 sslcontext_client.check_hostname = True
1037
1038 # incorrect server_hostname
1039 f_c = self.loop.create_connection(MyProto, host, port,
1040 ssl=sslcontext_client)
Victor Stinner29342622015-01-29 14:15:19 +01001041 with mock.patch.object(self.loop, 'call_exception_handler'):
1042 with test_utils.disable_logger():
1043 with self.assertRaisesRegex(
1044 ssl.CertificateError,
1045 "hostname '127.0.0.1' doesn't match 'localhost'"):
1046 self.loop.run_until_complete(f_c)
Christian Heimes6d8c1ab2013-12-06 00:23:13 +01001047
1048 # close connection
1049 proto.transport.close()
1050 server.close()
1051
Victor Stinner231b4042015-01-14 00:19:09 +01001052 def test_legacy_create_server_ssl_match_failed(self):
1053 with test_utils.force_legacy_ssl_support():
1054 self.test_create_server_ssl_match_failed()
1055
Christian Heimes6d8c1ab2013-12-06 00:23:13 +01001056 @unittest.skipIf(ssl is None, 'No ssl module')
Yury Selivanov88a5bf02014-02-18 12:15:06 -05001057 @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets')
1058 def test_create_unix_server_ssl_verified(self):
1059 proto = MyProto(loop=self.loop)
1060 server, path = self._make_ssl_unix_server(
1061 lambda: proto, SIGNED_CERTFILE)
1062
1063 sslcontext_client = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
1064 sslcontext_client.options |= ssl.OP_NO_SSLv2
1065 sslcontext_client.verify_mode = ssl.CERT_REQUIRED
1066 sslcontext_client.load_verify_locations(cafile=SIGNING_CA)
1067 if hasattr(sslcontext_client, 'check_hostname'):
1068 sslcontext_client.check_hostname = True
1069
1070 # Connection succeeds with correct CA and server hostname.
1071 f_c = self.loop.create_unix_connection(MyProto, path,
1072 ssl=sslcontext_client,
1073 server_hostname='localhost')
1074 client, pr = self.loop.run_until_complete(f_c)
1075
1076 # close connection
1077 proto.transport.close()
1078 client.close()
1079 server.close()
Victor Stinner231b4042015-01-14 00:19:09 +01001080 self.loop.run_until_complete(proto.done)
1081
1082 def test_legacy_create_unix_server_ssl_verified(self):
1083 with test_utils.force_legacy_ssl_support():
1084 self.test_create_unix_server_ssl_verified()
Yury Selivanov88a5bf02014-02-18 12:15:06 -05001085
1086 @unittest.skipIf(ssl is None, 'No ssl module')
Christian Heimes6d8c1ab2013-12-06 00:23:13 +01001087 def test_create_server_ssl_verified(self):
Yury Selivanov88a5bf02014-02-18 12:15:06 -05001088 proto = MyProto(loop=self.loop)
1089 server, host, port = self._make_ssl_server(
1090 lambda: proto, SIGNED_CERTFILE)
Christian Heimes6d8c1ab2013-12-06 00:23:13 +01001091
1092 sslcontext_client = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
1093 sslcontext_client.options |= ssl.OP_NO_SSLv2
1094 sslcontext_client.verify_mode = ssl.CERT_REQUIRED
1095 sslcontext_client.load_verify_locations(cafile=SIGNING_CA)
1096 if hasattr(sslcontext_client, 'check_hostname'):
1097 sslcontext_client.check_hostname = True
1098
1099 # Connection succeeds with correct CA and server hostname.
1100 f_c = self.loop.create_connection(MyProto, host, port,
1101 ssl=sslcontext_client,
1102 server_hostname='localhost')
1103 client, pr = self.loop.run_until_complete(f_c)
1104
Victor Stinnerf7dc7fb2015-09-21 18:06:17 +02001105 # extra info is available
1106 self.check_ssl_extra_info(client,peername=(host, port),
1107 peercert=PEERCERT)
1108
Christian Heimes6d8c1ab2013-12-06 00:23:13 +01001109 # close connection
1110 proto.transport.close()
1111 client.close()
1112 server.close()
Victor Stinner231b4042015-01-14 00:19:09 +01001113 self.loop.run_until_complete(proto.done)
1114
1115 def test_legacy_create_server_ssl_verified(self):
1116 with test_utils.force_legacy_ssl_support():
1117 self.test_create_server_ssl_verified()
Christian Heimes6d8c1ab2013-12-06 00:23:13 +01001118
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001119 def test_create_server_sock(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01001120 proto = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001121
1122 class TestMyProto(MyProto):
1123 def connection_made(self, transport):
1124 super().connection_made(transport)
1125 proto.set_result(self)
1126
1127 sock_ob = socket.socket(type=socket.SOCK_STREAM)
1128 sock_ob.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1129 sock_ob.bind(('0.0.0.0', 0))
1130
1131 f = self.loop.create_server(TestMyProto, sock=sock_ob)
1132 server = self.loop.run_until_complete(f)
1133 sock = server.sockets[0]
1134 self.assertIs(sock, sock_ob)
1135
1136 host, port = sock.getsockname()
1137 self.assertEqual(host, '0.0.0.0')
1138 client = socket.socket()
1139 client.connect(('127.0.0.1', port))
1140 client.send(b'xxx')
1141 client.close()
1142 server.close()
1143
1144 def test_create_server_addr_in_use(self):
1145 sock_ob = socket.socket(type=socket.SOCK_STREAM)
1146 sock_ob.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1147 sock_ob.bind(('0.0.0.0', 0))
1148
1149 f = self.loop.create_server(MyProto, sock=sock_ob)
1150 server = self.loop.run_until_complete(f)
1151 sock = server.sockets[0]
1152 host, port = sock.getsockname()
1153
1154 f = self.loop.create_server(MyProto, host=host, port=port)
1155 with self.assertRaises(OSError) as cm:
1156 self.loop.run_until_complete(f)
1157 self.assertEqual(cm.exception.errno, errno.EADDRINUSE)
1158
1159 server.close()
1160
Christian Heimes6d8c1ab2013-12-06 00:23:13 +01001161 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 not supported or enabled')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001162 def test_create_server_dual_stack(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01001163 f_proto = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001164
1165 class TestMyProto(MyProto):
1166 def connection_made(self, transport):
1167 super().connection_made(transport)
1168 f_proto.set_result(self)
1169
1170 try_count = 0
1171 while True:
1172 try:
Christian Heimes6d8c1ab2013-12-06 00:23:13 +01001173 port = support.find_unused_port()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001174 f = self.loop.create_server(TestMyProto, host=None, port=port)
1175 server = self.loop.run_until_complete(f)
1176 except OSError as ex:
1177 if ex.errno == errno.EADDRINUSE:
1178 try_count += 1
1179 self.assertGreaterEqual(5, try_count)
1180 continue
1181 else:
1182 raise
1183 else:
1184 break
1185 client = socket.socket()
1186 client.connect(('127.0.0.1', port))
1187 client.send(b'xxx')
1188 proto = self.loop.run_until_complete(f_proto)
1189 proto.transport.close()
1190 client.close()
1191
Victor Stinner8dffc452014-01-25 15:32:06 +01001192 f_proto = asyncio.Future(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001193 client = socket.socket(socket.AF_INET6)
1194 client.connect(('::1', port))
1195 client.send(b'xxx')
1196 proto = self.loop.run_until_complete(f_proto)
1197 proto.transport.close()
1198 client.close()
1199
1200 server.close()
1201
1202 def test_server_close(self):
1203 f = self.loop.create_server(MyProto, '0.0.0.0', 0)
1204 server = self.loop.run_until_complete(f)
1205 sock = server.sockets[0]
1206 host, port = sock.getsockname()
1207
1208 client = socket.socket()
1209 client.connect(('127.0.0.1', port))
1210 client.send(b'xxx')
1211 client.close()
1212
1213 server.close()
1214
1215 client = socket.socket()
1216 self.assertRaises(
1217 ConnectionRefusedError, client.connect, ('127.0.0.1', port))
1218 client.close()
1219
1220 def test_create_datagram_endpoint(self):
1221 class TestMyDatagramProto(MyDatagramProto):
1222 def __init__(inner_self):
1223 super().__init__(loop=self.loop)
1224
1225 def datagram_received(self, data, addr):
1226 super().datagram_received(data, addr)
1227 self.transport.sendto(b'resp:'+data, addr)
1228
1229 coro = self.loop.create_datagram_endpoint(
1230 TestMyDatagramProto, local_addr=('127.0.0.1', 0))
1231 s_transport, server = self.loop.run_until_complete(coro)
1232 host, port = s_transport.get_extra_info('sockname')
1233
Victor Stinnerbfff45d2014-07-08 23:57:31 +02001234 self.assertIsInstance(s_transport, asyncio.Transport)
1235 self.assertIsInstance(server, TestMyDatagramProto)
1236 self.assertEqual('INITIALIZED', server.state)
1237 self.assertIs(server.transport, s_transport)
1238
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001239 coro = self.loop.create_datagram_endpoint(
1240 lambda: MyDatagramProto(loop=self.loop),
1241 remote_addr=(host, port))
1242 transport, client = self.loop.run_until_complete(coro)
1243
Victor Stinnerbfff45d2014-07-08 23:57:31 +02001244 self.assertIsInstance(transport, asyncio.Transport)
1245 self.assertIsInstance(client, MyDatagramProto)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001246 self.assertEqual('INITIALIZED', client.state)
Victor Stinnerbfff45d2014-07-08 23:57:31 +02001247 self.assertIs(client.transport, transport)
1248
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001249 transport.sendto(b'xxx')
Victor Stinnere6a53792014-03-06 01:00:36 +01001250 test_utils.run_until(self.loop, lambda: server.nbytes)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001251 self.assertEqual(3, server.nbytes)
Victor Stinnere6a53792014-03-06 01:00:36 +01001252 test_utils.run_until(self.loop, lambda: client.nbytes)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001253
1254 # received
1255 self.assertEqual(8, client.nbytes)
1256
1257 # extra info is available
1258 self.assertIsNotNone(transport.get_extra_info('sockname'))
1259
1260 # close connection
1261 transport.close()
1262 self.loop.run_until_complete(client.done)
1263 self.assertEqual('CLOSED', client.state)
1264 server.transport.close()
1265
1266 def test_internal_fds(self):
1267 loop = self.create_event_loop()
Victor Stinner128ee222014-01-25 22:22:18 +01001268 if not isinstance(loop, selector_events.BaseSelectorEventLoop):
Victor Stinner27d41122014-06-04 00:23:26 +02001269 loop.close()
Zachary Ware101d9e72013-12-08 00:44:27 -06001270 self.skipTest('loop is not a BaseSelectorEventLoop')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001271
1272 self.assertEqual(1, loop._internal_fds)
1273 loop.close()
1274 self.assertEqual(0, loop._internal_fds)
1275 self.assertIsNone(loop._csock)
1276 self.assertIsNone(loop._ssock)
1277
1278 @unittest.skipUnless(sys.platform != 'win32',
1279 "Don't support pipes for Windows")
1280 def test_read_pipe(self):
Yury Selivanov88a5bf02014-02-18 12:15:06 -05001281 proto = MyReadPipeProto(loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001282
1283 rpipe, wpipe = os.pipe()
1284 pipeobj = io.open(rpipe, 'rb', 1024)
1285
Victor Stinner8dffc452014-01-25 15:32:06 +01001286 @asyncio.coroutine
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001287 def connect():
Yury Selivanov88a5bf02014-02-18 12:15:06 -05001288 t, p = yield from self.loop.connect_read_pipe(
1289 lambda: proto, pipeobj)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001290 self.assertIs(p, proto)
1291 self.assertIs(t, proto.transport)
1292 self.assertEqual(['INITIAL', 'CONNECTED'], proto.state)
1293 self.assertEqual(0, proto.nbytes)
1294
1295 self.loop.run_until_complete(connect())
1296
1297 os.write(wpipe, b'1')
Victor Stinnere6a53792014-03-06 01:00:36 +01001298 test_utils.run_until(self.loop, lambda: proto.nbytes >= 1)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001299 self.assertEqual(1, proto.nbytes)
1300
1301 os.write(wpipe, b'2345')
Victor Stinnere6a53792014-03-06 01:00:36 +01001302 test_utils.run_until(self.loop, lambda: proto.nbytes >= 5)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001303 self.assertEqual(['INITIAL', 'CONNECTED'], proto.state)
1304 self.assertEqual(5, proto.nbytes)
1305
1306 os.close(wpipe)
1307 self.loop.run_until_complete(proto.done)
1308 self.assertEqual(
1309 ['INITIAL', 'CONNECTED', 'EOF', 'CLOSED'], proto.state)
1310 # extra info is available
1311 self.assertIsNotNone(proto.transport.get_extra_info('pipe'))
1312
1313 @unittest.skipUnless(sys.platform != 'win32',
1314 "Don't support pipes for Windows")
Victor Stinner9dd39f52014-02-03 00:32:13 +01001315 # select, poll and kqueue don't support character devices (PTY) on Mac OS X
1316 # older than 10.6 (Snow Leopard)
1317 @support.requires_mac_ver(10, 6)
Victor Stinner13b493e2014-02-11 18:40:56 +01001318 # Issue #20495: The test hangs on FreeBSD 7.2 but pass on FreeBSD 9
1319 @support.requires_freebsd_version(8)
Guido van Rossum02757ea2014-01-10 13:30:04 -08001320 def test_read_pty_output(self):
Yury Selivanov88a5bf02014-02-18 12:15:06 -05001321 proto = MyReadPipeProto(loop=self.loop)
Guido van Rossum02757ea2014-01-10 13:30:04 -08001322
1323 master, slave = os.openpty()
1324 master_read_obj = io.open(master, 'rb', 0)
1325
Victor Stinner8dffc452014-01-25 15:32:06 +01001326 @asyncio.coroutine
Guido van Rossum02757ea2014-01-10 13:30:04 -08001327 def connect():
Yury Selivanov88a5bf02014-02-18 12:15:06 -05001328 t, p = yield from self.loop.connect_read_pipe(lambda: proto,
Guido van Rossum02757ea2014-01-10 13:30:04 -08001329 master_read_obj)
1330 self.assertIs(p, proto)
1331 self.assertIs(t, proto.transport)
1332 self.assertEqual(['INITIAL', 'CONNECTED'], proto.state)
1333 self.assertEqual(0, proto.nbytes)
1334
1335 self.loop.run_until_complete(connect())
1336
1337 os.write(slave, b'1')
1338 test_utils.run_until(self.loop, lambda: proto.nbytes)
1339 self.assertEqual(1, proto.nbytes)
1340
1341 os.write(slave, b'2345')
1342 test_utils.run_until(self.loop, lambda: proto.nbytes >= 5)
1343 self.assertEqual(['INITIAL', 'CONNECTED'], proto.state)
1344 self.assertEqual(5, proto.nbytes)
1345
1346 os.close(slave)
1347 self.loop.run_until_complete(proto.done)
1348 self.assertEqual(
1349 ['INITIAL', 'CONNECTED', 'EOF', 'CLOSED'], proto.state)
1350 # extra info is available
1351 self.assertIsNotNone(proto.transport.get_extra_info('pipe'))
1352
1353 @unittest.skipUnless(sys.platform != 'win32',
1354 "Don't support pipes for Windows")
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001355 def test_write_pipe(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001356 rpipe, wpipe = os.pipe()
1357 pipeobj = io.open(wpipe, 'wb', 1024)
1358
Victor Stinner658103f2014-02-26 11:31:55 +01001359 proto = MyWritePipeProto(loop=self.loop)
1360 connect = self.loop.connect_write_pipe(lambda: proto, pipeobj)
1361 transport, p = self.loop.run_until_complete(connect)
1362 self.assertIs(p, proto)
1363 self.assertIs(transport, proto.transport)
1364 self.assertEqual('CONNECTED', proto.state)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001365
1366 transport.write(b'1')
Victor Stinnere6a53792014-03-06 01:00:36 +01001367
1368 data = bytearray()
1369 def reader(data):
1370 chunk = os.read(rpipe, 1024)
1371 data += chunk
1372 return len(data)
1373
1374 test_utils.run_until(self.loop, lambda: reader(data) >= 1)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001375 self.assertEqual(b'1', data)
1376
1377 transport.write(b'2345')
Victor Stinnere6a53792014-03-06 01:00:36 +01001378 test_utils.run_until(self.loop, lambda: reader(data) >= 5)
1379 self.assertEqual(b'12345', data)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001380 self.assertEqual('CONNECTED', proto.state)
1381
1382 os.close(rpipe)
1383
1384 # extra info is available
1385 self.assertIsNotNone(proto.transport.get_extra_info('pipe'))
1386
1387 # close connection
1388 proto.transport.close()
1389 self.loop.run_until_complete(proto.done)
1390 self.assertEqual('CLOSED', proto.state)
1391
1392 @unittest.skipUnless(sys.platform != 'win32',
1393 "Don't support pipes for Windows")
1394 def test_write_pipe_disconnect_on_close(self):
Guido van Rossumd41c3432013-11-23 11:51:53 -08001395 rsock, wsock = test_utils.socketpair()
Victor Stinnerb2614752014-08-25 23:20:52 +02001396 rsock.setblocking(False)
Guido van Rossumb0fb94d2013-10-21 21:28:45 -07001397 pipeobj = io.open(wsock.detach(), 'wb', 1024)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001398
Victor Stinner658103f2014-02-26 11:31:55 +01001399 proto = MyWritePipeProto(loop=self.loop)
1400 connect = self.loop.connect_write_pipe(lambda: proto, pipeobj)
1401 transport, p = self.loop.run_until_complete(connect)
1402 self.assertIs(p, proto)
1403 self.assertIs(transport, proto.transport)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001404 self.assertEqual('CONNECTED', proto.state)
1405
1406 transport.write(b'1')
Guido van Rossumb0fb94d2013-10-21 21:28:45 -07001407 data = self.loop.run_until_complete(self.loop.sock_recv(rsock, 1024))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001408 self.assertEqual(b'1', data)
1409
Guido van Rossumb0fb94d2013-10-21 21:28:45 -07001410 rsock.close()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001411
1412 self.loop.run_until_complete(proto.done)
1413 self.assertEqual('CLOSED', proto.state)
1414
Victor Stinner8dffc452014-01-25 15:32:06 +01001415 @unittest.skipUnless(sys.platform != 'win32',
1416 "Don't support pipes for Windows")
Victor Stinner9dd39f52014-02-03 00:32:13 +01001417 # select, poll and kqueue don't support character devices (PTY) on Mac OS X
1418 # older than 10.6 (Snow Leopard)
1419 @support.requires_mac_ver(10, 6)
Victor Stinner8dffc452014-01-25 15:32:06 +01001420 def test_write_pty(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01001421 master, slave = os.openpty()
1422 slave_write_obj = io.open(slave, 'wb', 0)
1423
Victor Stinner658103f2014-02-26 11:31:55 +01001424 proto = MyWritePipeProto(loop=self.loop)
1425 connect = self.loop.connect_write_pipe(lambda: proto, slave_write_obj)
1426 transport, p = self.loop.run_until_complete(connect)
1427 self.assertIs(p, proto)
1428 self.assertIs(transport, proto.transport)
1429 self.assertEqual('CONNECTED', proto.state)
Victor Stinner8dffc452014-01-25 15:32:06 +01001430
1431 transport.write(b'1')
Victor Stinnere6a53792014-03-06 01:00:36 +01001432
1433 data = bytearray()
1434 def reader(data):
1435 chunk = os.read(master, 1024)
1436 data += chunk
1437 return len(data)
1438
1439 test_utils.run_until(self.loop, lambda: reader(data) >= 1,
1440 timeout=10)
Victor Stinner8dffc452014-01-25 15:32:06 +01001441 self.assertEqual(b'1', data)
1442
1443 transport.write(b'2345')
Victor Stinnere6a53792014-03-06 01:00:36 +01001444 test_utils.run_until(self.loop, lambda: reader(data) >= 5,
1445 timeout=10)
1446 self.assertEqual(b'12345', data)
Victor Stinner8dffc452014-01-25 15:32:06 +01001447 self.assertEqual('CONNECTED', proto.state)
1448
1449 os.close(master)
1450
1451 # extra info is available
1452 self.assertIsNotNone(proto.transport.get_extra_info('pipe'))
1453
1454 # close connection
1455 proto.transport.close()
1456 self.loop.run_until_complete(proto.done)
1457 self.assertEqual('CLOSED', proto.state)
1458
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001459 def test_prompt_cancellation(self):
1460 r, w = test_utils.socketpair()
1461 r.setblocking(False)
1462 f = self.loop.sock_recv(r, 1)
1463 ov = getattr(f, 'ov', None)
Serhiy Storchakae048add2013-11-14 23:10:51 +02001464 if ov is not None:
1465 self.assertTrue(ov.pending)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001466
Victor Stinner8dffc452014-01-25 15:32:06 +01001467 @asyncio.coroutine
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001468 def main():
1469 try:
1470 self.loop.call_soon(f.cancel)
1471 yield from f
Victor Stinner8dffc452014-01-25 15:32:06 +01001472 except asyncio.CancelledError:
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001473 res = 'cancelled'
1474 else:
1475 res = None
1476 finally:
1477 self.loop.stop()
1478 return res
1479
1480 start = time.monotonic()
Victor Stinner8dffc452014-01-25 15:32:06 +01001481 t = asyncio.Task(main(), loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001482 self.loop.run_forever()
1483 elapsed = time.monotonic() - start
1484
1485 self.assertLess(elapsed, 0.1)
1486 self.assertEqual(t.result(), 'cancelled')
Victor Stinner8dffc452014-01-25 15:32:06 +01001487 self.assertRaises(asyncio.CancelledError, f.result)
Serhiy Storchakae048add2013-11-14 23:10:51 +02001488 if ov is not None:
1489 self.assertFalse(ov.pending)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001490 self.loop._stop_serving(r)
1491
1492 r.close()
1493 w.close()
1494
Victor Stinnerf67255a2014-01-25 15:01:33 +01001495 def test_timeout_rounding(self):
1496 def _run_once():
1497 self.loop._run_once_counter += 1
1498 orig_run_once()
1499
1500 orig_run_once = self.loop._run_once
1501 self.loop._run_once_counter = 0
1502 self.loop._run_once = _run_once
Victor Stinnerf67255a2014-01-25 15:01:33 +01001503
Victor Stinner8dffc452014-01-25 15:32:06 +01001504 @asyncio.coroutine
Victor Stinnerf67255a2014-01-25 15:01:33 +01001505 def wait():
1506 loop = self.loop
Victor Stinner85310a52014-02-07 23:34:58 +01001507 yield from asyncio.sleep(1e-2, loop=loop)
1508 yield from asyncio.sleep(1e-4, loop=loop)
Victor Stinnercf736f42014-02-10 19:17:46 +01001509 yield from asyncio.sleep(1e-6, loop=loop)
1510 yield from asyncio.sleep(1e-8, loop=loop)
Victor Stinner6cf5c962014-02-10 23:42:32 +01001511 yield from asyncio.sleep(1e-10, loop=loop)
Victor Stinnerf67255a2014-01-25 15:01:33 +01001512
1513 self.loop.run_until_complete(wait())
Victor Stinner6cf5c962014-02-10 23:42:32 +01001514 # The ideal number of call is 12, but on some platforms, the selector
Victor Stinner85310a52014-02-07 23:34:58 +01001515 # may sleep at little bit less than timeout depending on the resolution
Victor Stinner6cf5c962014-02-10 23:42:32 +01001516 # of the clock used by the kernel. Tolerate a few useless calls on
1517 # these platforms.
1518 self.assertLessEqual(self.loop._run_once_counter, 20,
1519 {'clock_resolution': self.loop._clock_resolution,
Victor Stinner1c143b12014-02-10 11:47:50 +01001520 'selector': self.loop._selector.__class__.__name__})
Victor Stinner1703bbb2014-02-03 23:59:52 +01001521
Victor Stinner28773462014-02-13 09:24:37 +01001522 def test_sock_connect_address(self):
Victor Stinner2fc23132015-02-04 14:51:23 +01001523 # In debug mode, sock_connect() must ensure that the address is already
1524 # resolved (call _check_resolved_address())
1525 self.loop.set_debug(True)
1526
Victor Stinnera90e8ed2014-02-20 21:59:38 +01001527 addresses = [(socket.AF_INET, ('www.python.org', 80))]
Victor Stinner1ff0ee02014-02-13 10:46:05 +01001528 if support.IPV6_ENABLED:
Victor Stinnera90e8ed2014-02-20 21:59:38 +01001529 addresses.extend((
1530 (socket.AF_INET6, ('www.python.org', 80)),
1531 (socket.AF_INET6, ('www.python.org', 80, 0, 0)),
1532 ))
Victor Stinner1ff0ee02014-02-13 10:46:05 +01001533
Victor Stinnera90e8ed2014-02-20 21:59:38 +01001534 for family, address in addresses:
Victor Stinner28773462014-02-13 09:24:37 +01001535 for sock_type in (socket.SOCK_STREAM, socket.SOCK_DGRAM):
1536 sock = socket.socket(family, sock_type)
1537 with sock:
Victor Stinnerb2614752014-08-25 23:20:52 +02001538 sock.setblocking(False)
Victor Stinner28773462014-02-13 09:24:37 +01001539 connect = self.loop.sock_connect(sock, address)
1540 with self.assertRaises(ValueError) as cm:
1541 self.loop.run_until_complete(connect)
1542 self.assertIn('address must be resolved',
1543 str(cm.exception))
1544
Victor Stinnereeeebcd2014-03-06 00:52:53 +01001545 def test_remove_fds_after_closing(self):
1546 loop = self.create_event_loop()
1547 callback = lambda: None
1548 r, w = test_utils.socketpair()
1549 self.addCleanup(r.close)
1550 self.addCleanup(w.close)
1551 loop.add_reader(r, callback)
1552 loop.add_writer(w, callback)
1553 loop.close()
1554 self.assertFalse(loop.remove_reader(r))
1555 self.assertFalse(loop.remove_writer(w))
1556
1557 def test_add_fds_after_closing(self):
1558 loop = self.create_event_loop()
1559 callback = lambda: None
1560 r, w = test_utils.socketpair()
1561 self.addCleanup(r.close)
1562 self.addCleanup(w.close)
1563 loop.close()
1564 with self.assertRaises(RuntimeError):
1565 loop.add_reader(r, callback)
1566 with self.assertRaises(RuntimeError):
1567 loop.add_writer(w, callback)
1568
Victor Stinnerf328c7d2014-06-23 01:02:37 +02001569 def test_close_running_event_loop(self):
1570 @asyncio.coroutine
1571 def close_loop(loop):
1572 self.loop.close()
1573
1574 coro = close_loop(self.loop)
1575 with self.assertRaises(RuntimeError):
1576 self.loop.run_until_complete(coro)
1577
Victor Stinnere80bf0d2014-12-04 23:07:47 +01001578 def test_close(self):
1579 self.loop.close()
1580
1581 @asyncio.coroutine
1582 def test():
1583 pass
1584
1585 func = lambda: False
1586 coro = test()
1587 self.addCleanup(coro.close)
1588
1589 # operation blocked when the loop is closed
1590 with self.assertRaises(RuntimeError):
1591 self.loop.run_forever()
1592 with self.assertRaises(RuntimeError):
1593 fut = asyncio.Future(loop=self.loop)
1594 self.loop.run_until_complete(fut)
1595 with self.assertRaises(RuntimeError):
1596 self.loop.call_soon(func)
1597 with self.assertRaises(RuntimeError):
1598 self.loop.call_soon_threadsafe(func)
1599 with self.assertRaises(RuntimeError):
1600 self.loop.call_later(1.0, func)
1601 with self.assertRaises(RuntimeError):
1602 self.loop.call_at(self.loop.time() + .0, func)
1603 with self.assertRaises(RuntimeError):
1604 self.loop.run_in_executor(None, func)
1605 with self.assertRaises(RuntimeError):
1606 self.loop.create_task(coro)
1607 with self.assertRaises(RuntimeError):
1608 self.loop.add_signal_handler(signal.SIGTERM, func)
1609
Guido van Rossum59691282013-10-30 14:52:03 -07001610
1611class SubprocessTestsMixin:
1612
1613 def check_terminated(self, returncode):
1614 if sys.platform == 'win32':
1615 self.assertIsInstance(returncode, int)
Richard Oudkerk2902b6d2013-11-02 16:38:58 +00001616 # expect 1 but sometimes get 0
Guido van Rossum59691282013-10-30 14:52:03 -07001617 else:
1618 self.assertEqual(-signal.SIGTERM, returncode)
1619
1620 def check_killed(self, returncode):
1621 if sys.platform == 'win32':
1622 self.assertIsInstance(returncode, int)
Richard Oudkerk2902b6d2013-11-02 16:38:58 +00001623 # expect 1 but sometimes get 0
Guido van Rossum59691282013-10-30 14:52:03 -07001624 else:
1625 self.assertEqual(-signal.SIGKILL, returncode)
1626
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001627 def test_subprocess_exec(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001628 prog = os.path.join(os.path.dirname(__file__), 'echo.py')
1629
Victor Stinner658103f2014-02-26 11:31:55 +01001630 connect = self.loop.subprocess_exec(
1631 functools.partial(MySubprocessProtocol, self.loop),
1632 sys.executable, prog)
1633 transp, proto = self.loop.run_until_complete(connect)
1634 self.assertIsInstance(proto, MySubprocessProtocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001635 self.loop.run_until_complete(proto.connected)
1636 self.assertEqual('CONNECTED', proto.state)
1637
1638 stdin = transp.get_pipe_transport(0)
1639 stdin.write(b'Python The Winner')
1640 self.loop.run_until_complete(proto.got_data[1].wait())
Victor Stinner47cd10d2015-01-30 00:05:19 +01001641 with test_utils.disable_logger():
1642 transp.close()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001643 self.loop.run_until_complete(proto.completed)
Victor Stinner47cd10d2015-01-30 00:05:19 +01001644 self.check_killed(proto.returncode)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001645 self.assertEqual(b'Python The Winner', proto.data[1])
1646
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001647 def test_subprocess_interactive(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001648 prog = os.path.join(os.path.dirname(__file__), 'echo.py')
1649
Victor Stinner658103f2014-02-26 11:31:55 +01001650 connect = self.loop.subprocess_exec(
1651 functools.partial(MySubprocessProtocol, self.loop),
1652 sys.executable, prog)
1653 transp, proto = self.loop.run_until_complete(connect)
1654 self.assertIsInstance(proto, MySubprocessProtocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001655 self.loop.run_until_complete(proto.connected)
1656 self.assertEqual('CONNECTED', proto.state)
1657
Victor Stinner47cd10d2015-01-30 00:05:19 +01001658 stdin = transp.get_pipe_transport(0)
1659 stdin.write(b'Python ')
1660 self.loop.run_until_complete(proto.got_data[1].wait())
1661 proto.got_data[1].clear()
1662 self.assertEqual(b'Python ', proto.data[1])
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001663
Victor Stinner47cd10d2015-01-30 00:05:19 +01001664 stdin.write(b'The Winner')
1665 self.loop.run_until_complete(proto.got_data[1].wait())
1666 self.assertEqual(b'Python The Winner', proto.data[1])
1667
1668 with test_utils.disable_logger():
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001669 transp.close()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001670 self.loop.run_until_complete(proto.completed)
Victor Stinner47cd10d2015-01-30 00:05:19 +01001671 self.check_killed(proto.returncode)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001672
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001673 def test_subprocess_shell(self):
Victor Stinner658103f2014-02-26 11:31:55 +01001674 connect = self.loop.subprocess_shell(
1675 functools.partial(MySubprocessProtocol, self.loop),
1676 'echo Python')
1677 transp, proto = self.loop.run_until_complete(connect)
1678 self.assertIsInstance(proto, MySubprocessProtocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001679 self.loop.run_until_complete(proto.connected)
1680
1681 transp.get_pipe_transport(0).close()
1682 self.loop.run_until_complete(proto.completed)
1683 self.assertEqual(0, proto.returncode)
1684 self.assertTrue(all(f.done() for f in proto.disconnects.values()))
Guido van Rossum59691282013-10-30 14:52:03 -07001685 self.assertEqual(proto.data[1].rstrip(b'\r\n'), b'Python')
1686 self.assertEqual(proto.data[2], b'')
Victor Stinner29ad0112015-01-15 00:04:21 +01001687 transp.close()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001688
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001689 def test_subprocess_exitcode(self):
Victor Stinner658103f2014-02-26 11:31:55 +01001690 connect = self.loop.subprocess_shell(
1691 functools.partial(MySubprocessProtocol, self.loop),
1692 'exit 7', stdin=None, stdout=None, stderr=None)
1693 transp, proto = self.loop.run_until_complete(connect)
1694 self.assertIsInstance(proto, MySubprocessProtocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001695 self.loop.run_until_complete(proto.completed)
1696 self.assertEqual(7, proto.returncode)
Victor Stinner29ad0112015-01-15 00:04:21 +01001697 transp.close()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001698
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001699 def test_subprocess_close_after_finish(self):
Victor Stinner658103f2014-02-26 11:31:55 +01001700 connect = self.loop.subprocess_shell(
1701 functools.partial(MySubprocessProtocol, self.loop),
1702 'exit 7', stdin=None, stdout=None, stderr=None)
1703 transp, proto = self.loop.run_until_complete(connect)
1704 self.assertIsInstance(proto, MySubprocessProtocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001705 self.assertIsNone(transp.get_pipe_transport(0))
1706 self.assertIsNone(transp.get_pipe_transport(1))
1707 self.assertIsNone(transp.get_pipe_transport(2))
1708 self.loop.run_until_complete(proto.completed)
1709 self.assertEqual(7, proto.returncode)
1710 self.assertIsNone(transp.close())
1711
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001712 def test_subprocess_kill(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001713 prog = os.path.join(os.path.dirname(__file__), 'echo.py')
1714
Victor Stinner658103f2014-02-26 11:31:55 +01001715 connect = self.loop.subprocess_exec(
1716 functools.partial(MySubprocessProtocol, self.loop),
1717 sys.executable, prog)
1718 transp, proto = self.loop.run_until_complete(connect)
1719 self.assertIsInstance(proto, MySubprocessProtocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001720 self.loop.run_until_complete(proto.connected)
1721
1722 transp.kill()
1723 self.loop.run_until_complete(proto.completed)
Guido van Rossum59691282013-10-30 14:52:03 -07001724 self.check_killed(proto.returncode)
Victor Stinner29ad0112015-01-15 00:04:21 +01001725 transp.close()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001726
Guido van Rossum59691282013-10-30 14:52:03 -07001727 def test_subprocess_terminate(self):
Guido van Rossum59691282013-10-30 14:52:03 -07001728 prog = os.path.join(os.path.dirname(__file__), 'echo.py')
1729
Victor Stinner658103f2014-02-26 11:31:55 +01001730 connect = self.loop.subprocess_exec(
1731 functools.partial(MySubprocessProtocol, self.loop),
1732 sys.executable, prog)
1733 transp, proto = self.loop.run_until_complete(connect)
1734 self.assertIsInstance(proto, MySubprocessProtocol)
Guido van Rossum59691282013-10-30 14:52:03 -07001735 self.loop.run_until_complete(proto.connected)
1736
1737 transp.terminate()
1738 self.loop.run_until_complete(proto.completed)
1739 self.check_terminated(proto.returncode)
Victor Stinner29ad0112015-01-15 00:04:21 +01001740 transp.close()
Guido van Rossum59691282013-10-30 14:52:03 -07001741
1742 @unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP")
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001743 def test_subprocess_send_signal(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001744 prog = os.path.join(os.path.dirname(__file__), 'echo.py')
1745
Victor Stinner658103f2014-02-26 11:31:55 +01001746 connect = self.loop.subprocess_exec(
1747 functools.partial(MySubprocessProtocol, self.loop),
1748 sys.executable, prog)
1749 transp, proto = self.loop.run_until_complete(connect)
1750 self.assertIsInstance(proto, MySubprocessProtocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001751 self.loop.run_until_complete(proto.connected)
1752
1753 transp.send_signal(signal.SIGHUP)
1754 self.loop.run_until_complete(proto.completed)
1755 self.assertEqual(-signal.SIGHUP, proto.returncode)
Victor Stinner29ad0112015-01-15 00:04:21 +01001756 transp.close()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001757
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001758 def test_subprocess_stderr(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001759 prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
1760
Victor Stinner658103f2014-02-26 11:31:55 +01001761 connect = self.loop.subprocess_exec(
1762 functools.partial(MySubprocessProtocol, self.loop),
1763 sys.executable, prog)
1764 transp, proto = self.loop.run_until_complete(connect)
1765 self.assertIsInstance(proto, MySubprocessProtocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001766 self.loop.run_until_complete(proto.connected)
1767
1768 stdin = transp.get_pipe_transport(0)
1769 stdin.write(b'test')
1770
1771 self.loop.run_until_complete(proto.completed)
1772
1773 transp.close()
1774 self.assertEqual(b'OUT:test', proto.data[1])
1775 self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2])
1776 self.assertEqual(0, proto.returncode)
1777
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001778 def test_subprocess_stderr_redirect_to_stdout(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001779 prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
1780
Victor Stinner658103f2014-02-26 11:31:55 +01001781 connect = self.loop.subprocess_exec(
1782 functools.partial(MySubprocessProtocol, self.loop),
1783 sys.executable, prog, stderr=subprocess.STDOUT)
1784 transp, proto = self.loop.run_until_complete(connect)
1785 self.assertIsInstance(proto, MySubprocessProtocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001786 self.loop.run_until_complete(proto.connected)
1787
1788 stdin = transp.get_pipe_transport(0)
1789 self.assertIsNotNone(transp.get_pipe_transport(1))
1790 self.assertIsNone(transp.get_pipe_transport(2))
1791
1792 stdin.write(b'test')
1793 self.loop.run_until_complete(proto.completed)
1794 self.assertTrue(proto.data[1].startswith(b'OUT:testERR:test'),
1795 proto.data[1])
1796 self.assertEqual(b'', proto.data[2])
1797
1798 transp.close()
1799 self.assertEqual(0, proto.returncode)
1800
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001801 def test_subprocess_close_client_stream(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001802 prog = os.path.join(os.path.dirname(__file__), 'echo3.py')
1803
Victor Stinner658103f2014-02-26 11:31:55 +01001804 connect = self.loop.subprocess_exec(
1805 functools.partial(MySubprocessProtocol, self.loop),
1806 sys.executable, prog)
1807 transp, proto = self.loop.run_until_complete(connect)
1808 self.assertIsInstance(proto, MySubprocessProtocol)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001809 self.loop.run_until_complete(proto.connected)
1810
1811 stdin = transp.get_pipe_transport(0)
1812 stdout = transp.get_pipe_transport(1)
1813 stdin.write(b'test')
1814 self.loop.run_until_complete(proto.got_data[1].wait())
1815 self.assertEqual(b'OUT:test', proto.data[1])
1816
1817 stdout.close()
1818 self.loop.run_until_complete(proto.disconnects[1])
1819 stdin.write(b'xxx')
1820 self.loop.run_until_complete(proto.got_data[2].wait())
Guido van Rossum59691282013-10-30 14:52:03 -07001821 if sys.platform != 'win32':
1822 self.assertEqual(b'ERR:BrokenPipeError', proto.data[2])
1823 else:
1824 # After closing the read-end of a pipe, writing to the
1825 # write-end using os.write() fails with errno==EINVAL and
1826 # GetLastError()==ERROR_INVALID_NAME on Windows!?! (Using
1827 # WriteFile() we get ERROR_BROKEN_PIPE as expected.)
1828 self.assertEqual(b'ERR:OSError', proto.data[2])
Victor Stinner47cd10d2015-01-30 00:05:19 +01001829 with test_utils.disable_logger():
1830 transp.close()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001831 self.loop.run_until_complete(proto.completed)
Victor Stinner47cd10d2015-01-30 00:05:19 +01001832 self.check_killed(proto.returncode)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001833
Charles-François Natalibcd76822013-10-20 20:31:43 +02001834 def test_subprocess_wait_no_same_group(self):
Victor Stinner658103f2014-02-26 11:31:55 +01001835 # start the new process in a new session
1836 connect = self.loop.subprocess_shell(
1837 functools.partial(MySubprocessProtocol, self.loop),
1838 'exit 7', stdin=None, stdout=None, stderr=None,
1839 start_new_session=True)
1840 _, proto = yield self.loop.run_until_complete(connect)
1841 self.assertIsInstance(proto, MySubprocessProtocol)
Charles-François Natalibcd76822013-10-20 20:31:43 +02001842 self.loop.run_until_complete(proto.completed)
1843 self.assertEqual(7, proto.returncode)
1844
Victor Stinnere623a122014-01-29 14:35:15 -08001845 def test_subprocess_exec_invalid_args(self):
1846 @asyncio.coroutine
1847 def connect(**kwds):
1848 yield from self.loop.subprocess_exec(
1849 asyncio.SubprocessProtocol,
1850 'pwd', **kwds)
1851
1852 with self.assertRaises(ValueError):
1853 self.loop.run_until_complete(connect(universal_newlines=True))
1854 with self.assertRaises(ValueError):
1855 self.loop.run_until_complete(connect(bufsize=4096))
1856 with self.assertRaises(ValueError):
1857 self.loop.run_until_complete(connect(shell=True))
1858
1859 def test_subprocess_shell_invalid_args(self):
1860 @asyncio.coroutine
1861 def connect(cmd=None, **kwds):
1862 if not cmd:
1863 cmd = 'pwd'
1864 yield from self.loop.subprocess_shell(
1865 asyncio.SubprocessProtocol,
1866 cmd, **kwds)
1867
1868 with self.assertRaises(ValueError):
1869 self.loop.run_until_complete(connect(['ls', '-l']))
1870 with self.assertRaises(ValueError):
1871 self.loop.run_until_complete(connect(universal_newlines=True))
1872 with self.assertRaises(ValueError):
1873 self.loop.run_until_complete(connect(bufsize=4096))
1874 with self.assertRaises(ValueError):
1875 self.loop.run_until_complete(connect(shell=False))
1876
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001877
1878if sys.platform == 'win32':
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001879
Victor Stinnerc73701d2014-06-18 01:36:32 +02001880 class SelectEventLoopTests(EventLoopTestsMixin, test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001881
1882 def create_event_loop(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01001883 return asyncio.SelectorEventLoop()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001884
Guido van Rossum59691282013-10-30 14:52:03 -07001885 class ProactorEventLoopTests(EventLoopTestsMixin,
1886 SubprocessTestsMixin,
Victor Stinnerc73701d2014-06-18 01:36:32 +02001887 test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001888
1889 def create_event_loop(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01001890 return asyncio.ProactorEventLoop()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001891
Victor Stinner29ad0112015-01-15 00:04:21 +01001892 if not sslproto._is_sslproto_available():
1893 def test_create_ssl_connection(self):
1894 raise unittest.SkipTest("need python 3.5 (ssl.MemoryBIO)")
1895
1896 def test_create_server_ssl(self):
1897 raise unittest.SkipTest("need python 3.5 (ssl.MemoryBIO)")
1898
1899 def test_create_server_ssl_verify_failed(self):
1900 raise unittest.SkipTest("need python 3.5 (ssl.MemoryBIO)")
1901
1902 def test_create_server_ssl_match_failed(self):
1903 raise unittest.SkipTest("need python 3.5 (ssl.MemoryBIO)")
1904
1905 def test_create_server_ssl_verified(self):
1906 raise unittest.SkipTest("need python 3.5 (ssl.MemoryBIO)")
1907
Victor Stinner231b4042015-01-14 00:19:09 +01001908 def test_legacy_create_ssl_connection(self):
1909 raise unittest.SkipTest("IocpEventLoop incompatible with legacy SSL")
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001910
Victor Stinner231b4042015-01-14 00:19:09 +01001911 def test_legacy_create_server_ssl(self):
1912 raise unittest.SkipTest("IocpEventLoop incompatible with legacy SSL")
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001913
Victor Stinner231b4042015-01-14 00:19:09 +01001914 def test_legacy_create_server_ssl_verify_failed(self):
1915 raise unittest.SkipTest("IocpEventLoop incompatible with legacy SSL")
Christian Heimesb82c9152013-12-07 00:09:45 +01001916
Victor Stinner231b4042015-01-14 00:19:09 +01001917 def test_legacy_create_server_ssl_match_failed(self):
1918 raise unittest.SkipTest("IocpEventLoop incompatible with legacy SSL")
Christian Heimesb82c9152013-12-07 00:09:45 +01001919
Victor Stinner231b4042015-01-14 00:19:09 +01001920 def test_legacy_create_server_ssl_verified(self):
1921 raise unittest.SkipTest("IocpEventLoop incompatible with legacy SSL")
Christian Heimesb82c9152013-12-07 00:09:45 +01001922
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001923 def test_reader_callback(self):
1924 raise unittest.SkipTest("IocpEventLoop does not have add_reader()")
1925
1926 def test_reader_callback_cancel(self):
1927 raise unittest.SkipTest("IocpEventLoop does not have add_reader()")
1928
1929 def test_writer_callback(self):
1930 raise unittest.SkipTest("IocpEventLoop does not have add_writer()")
1931
1932 def test_writer_callback_cancel(self):
1933 raise unittest.SkipTest("IocpEventLoop does not have add_writer()")
1934
1935 def test_create_datagram_endpoint(self):
1936 raise unittest.SkipTest(
1937 "IocpEventLoop does not have create_datagram_endpoint()")
Victor Stinnereeeebcd2014-03-06 00:52:53 +01001938
1939 def test_remove_fds_after_closing(self):
1940 raise unittest.SkipTest("IocpEventLoop does not have add_reader()")
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001941else:
1942 from asyncio import selectors
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001943
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -08001944 class UnixEventLoopTestsMixin(EventLoopTestsMixin):
1945 def setUp(self):
1946 super().setUp()
Victor Stinner8dffc452014-01-25 15:32:06 +01001947 watcher = asyncio.SafeChildWatcher()
Guido van Rossum2bcae702013-11-13 15:50:08 -08001948 watcher.attach_loop(self.loop)
Victor Stinner8dffc452014-01-25 15:32:06 +01001949 asyncio.set_child_watcher(watcher)
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -08001950
1951 def tearDown(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01001952 asyncio.set_child_watcher(None)
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -08001953 super().tearDown()
1954
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001955 if hasattr(selectors, 'KqueueSelector'):
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -08001956 class KqueueEventLoopTests(UnixEventLoopTestsMixin,
Guido van Rossum59691282013-10-30 14:52:03 -07001957 SubprocessTestsMixin,
Victor Stinnerc73701d2014-06-18 01:36:32 +02001958 test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001959
1960 def create_event_loop(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01001961 return asyncio.SelectorEventLoop(
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001962 selectors.KqueueSelector())
1963
Victor Stinner8dffc452014-01-25 15:32:06 +01001964 # kqueue doesn't support character devices (PTY) on Mac OS X older
1965 # than 10.9 (Maverick)
1966 @support.requires_mac_ver(10, 9)
Victor Stinner5afffea2014-02-18 01:30:03 +01001967 # Issue #20667: KqueueEventLoopTests.test_read_pty_output()
Victor Stinner9141bff2014-02-18 09:13:47 +01001968 # hangs on OpenBSD 5.5
1969 @unittest.skipIf(sys.platform.startswith('openbsd'),
1970 'test hangs on OpenBSD')
Victor Stinner8dffc452014-01-25 15:32:06 +01001971 def test_read_pty_output(self):
1972 super().test_read_pty_output()
1973
1974 # kqueue doesn't support character devices (PTY) on Mac OS X older
1975 # than 10.9 (Maverick)
1976 @support.requires_mac_ver(10, 9)
1977 def test_write_pty(self):
1978 super().test_write_pty()
1979
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001980 if hasattr(selectors, 'EpollSelector'):
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -08001981 class EPollEventLoopTests(UnixEventLoopTestsMixin,
Guido van Rossum59691282013-10-30 14:52:03 -07001982 SubprocessTestsMixin,
Victor Stinnerc73701d2014-06-18 01:36:32 +02001983 test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001984
1985 def create_event_loop(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01001986 return asyncio.SelectorEventLoop(selectors.EpollSelector())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001987
1988 if hasattr(selectors, 'PollSelector'):
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -08001989 class PollEventLoopTests(UnixEventLoopTestsMixin,
Guido van Rossum59691282013-10-30 14:52:03 -07001990 SubprocessTestsMixin,
Victor Stinnerc73701d2014-06-18 01:36:32 +02001991 test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001992
1993 def create_event_loop(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01001994 return asyncio.SelectorEventLoop(selectors.PollSelector())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001995
1996 # Should always exist.
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -08001997 class SelectEventLoopTests(UnixEventLoopTestsMixin,
Guido van Rossum59691282013-10-30 14:52:03 -07001998 SubprocessTestsMixin,
Victor Stinnerc73701d2014-06-18 01:36:32 +02001999 test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002000
2001 def create_event_loop(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01002002 return asyncio.SelectorEventLoop(selectors.SelectSelector())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002003
2004
Victor Stinner975735f2014-06-25 21:41:58 +02002005def noop(*args):
Victor Stinner307bccc2014-06-12 18:39:26 +02002006 pass
2007
2008
Victor Stinner80f53aa2014-06-27 13:52:20 +02002009class HandleTests(test_utils.TestCase):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002010
Victor Stinner307bccc2014-06-12 18:39:26 +02002011 def setUp(self):
Victor Stinner80f53aa2014-06-27 13:52:20 +02002012 self.loop = mock.Mock()
2013 self.loop.get_debug.return_value = True
Victor Stinner307bccc2014-06-12 18:39:26 +02002014
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002015 def test_handle(self):
2016 def callback(*args):
2017 return args
2018
2019 args = ()
Victor Stinner307bccc2014-06-12 18:39:26 +02002020 h = asyncio.Handle(callback, args, self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002021 self.assertIs(h._callback, callback)
2022 self.assertIs(h._args, args)
2023 self.assertFalse(h._cancelled)
2024
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002025 h.cancel()
2026 self.assertTrue(h._cancelled)
2027
Yury Selivanovff827f02014-02-18 18:02:19 -05002028 def test_handle_from_handle(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002029 def callback(*args):
2030 return args
Victor Stinner307bccc2014-06-12 18:39:26 +02002031 h1 = asyncio.Handle(callback, (), loop=self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002032 self.assertRaises(
Victor Stinner307bccc2014-06-12 18:39:26 +02002033 AssertionError, asyncio.Handle, h1, (), self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002034
Yury Selivanovff827f02014-02-18 18:02:19 -05002035 def test_callback_with_exception(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002036 def callback():
2037 raise ValueError()
2038
Victor Stinner307bccc2014-06-12 18:39:26 +02002039 self.loop = mock.Mock()
2040 self.loop.call_exception_handler = mock.Mock()
Yury Selivanovff827f02014-02-18 18:02:19 -05002041
Victor Stinner307bccc2014-06-12 18:39:26 +02002042 h = asyncio.Handle(callback, (), self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002043 h._run()
Yury Selivanovff827f02014-02-18 18:02:19 -05002044
Victor Stinner307bccc2014-06-12 18:39:26 +02002045 self.loop.call_exception_handler.assert_called_with({
Yury Selivanovff827f02014-02-18 18:02:19 -05002046 'message': test_utils.MockPattern('Exception in callback.*'),
Victor Stinner24ba2032014-02-26 10:25:02 +01002047 'exception': mock.ANY,
Victor Stinner80f53aa2014-06-27 13:52:20 +02002048 'handle': h,
2049 'source_traceback': h._source_traceback,
Yury Selivanovff827f02014-02-18 18:02:19 -05002050 })
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002051
Guido van Rossum94ba1462014-04-27 10:44:22 -07002052 def test_handle_weakref(self):
2053 wd = weakref.WeakValueDictionary()
Victor Stinner307bccc2014-06-12 18:39:26 +02002054 h = asyncio.Handle(lambda: None, (), self.loop)
Guido van Rossum94ba1462014-04-27 10:44:22 -07002055 wd['h'] = h # Would fail without __weakref__ slot.
2056
Victor Stinner975735f2014-06-25 21:41:58 +02002057 def test_handle_repr(self):
Victor Stinnerf68bd882014-07-10 22:32:58 +02002058 self.loop.get_debug.return_value = False
2059
Victor Stinner307bccc2014-06-12 18:39:26 +02002060 # simple function
Victor Stinnerf68bd882014-07-10 22:32:58 +02002061 h = asyncio.Handle(noop, (1, 2), self.loop)
2062 filename, lineno = test_utils.get_function_source(noop)
Victor Stinner307bccc2014-06-12 18:39:26 +02002063 self.assertEqual(repr(h),
Victor Stinnerf68bd882014-07-10 22:32:58 +02002064 '<Handle noop(1, 2) at %s:%s>'
2065 % (filename, lineno))
Victor Stinner307bccc2014-06-12 18:39:26 +02002066
2067 # cancelled handle
2068 h.cancel()
2069 self.assertEqual(repr(h),
Victor Stinnerf68bd882014-07-10 22:32:58 +02002070 '<Handle cancelled>')
Victor Stinner307bccc2014-06-12 18:39:26 +02002071
2072 # decorated function
2073 cb = asyncio.coroutine(noop)
2074 h = asyncio.Handle(cb, (), self.loop)
2075 self.assertEqual(repr(h),
Victor Stinnerf68bd882014-07-10 22:32:58 +02002076 '<Handle noop() at %s:%s>'
2077 % (filename, lineno))
Victor Stinner307bccc2014-06-12 18:39:26 +02002078
2079 # partial function
Victor Stinner975735f2014-06-25 21:41:58 +02002080 cb = functools.partial(noop, 1, 2)
2081 h = asyncio.Handle(cb, (3,), self.loop)
Victor Stinner975735f2014-06-25 21:41:58 +02002082 regex = (r'^<Handle noop\(1, 2\)\(3\) at %s:%s>$'
2083 % (re.escape(filename), lineno))
Victor Stinner307bccc2014-06-12 18:39:26 +02002084 self.assertRegex(repr(h), regex)
2085
2086 # partial method
2087 if sys.version_info >= (3, 4):
Victor Stinner975735f2014-06-25 21:41:58 +02002088 method = HandleTests.test_handle_repr
Victor Stinner307bccc2014-06-12 18:39:26 +02002089 cb = functools.partialmethod(method)
Victor Stinnerf68bd882014-07-10 22:32:58 +02002090 filename, lineno = test_utils.get_function_source(method)
Victor Stinner307bccc2014-06-12 18:39:26 +02002091 h = asyncio.Handle(cb, (), self.loop)
2092
Victor Stinner975735f2014-06-25 21:41:58 +02002093 cb_regex = r'<function HandleTests.test_handle_repr .*>'
2094 cb_regex = (r'functools.partialmethod\(%s, , \)\(\)' % cb_regex)
2095 regex = (r'^<Handle %s at %s:%s>$'
2096 % (cb_regex, re.escape(filename), lineno))
Victor Stinner307bccc2014-06-12 18:39:26 +02002097 self.assertRegex(repr(h), regex)
2098
Victor Stinnerf68bd882014-07-10 22:32:58 +02002099 def test_handle_repr_debug(self):
2100 self.loop.get_debug.return_value = True
2101
2102 # simple function
2103 create_filename = __file__
2104 create_lineno = sys._getframe().f_lineno + 1
2105 h = asyncio.Handle(noop, (1, 2), self.loop)
2106 filename, lineno = test_utils.get_function_source(noop)
2107 self.assertEqual(repr(h),
2108 '<Handle noop(1, 2) at %s:%s created at %s:%s>'
2109 % (filename, lineno, create_filename, create_lineno))
2110
2111 # cancelled handle
2112 h.cancel()
Yury Selivanov592ada92014-09-25 12:07:56 -04002113 self.assertEqual(
2114 repr(h),
2115 '<Handle cancelled noop(1, 2) at %s:%s created at %s:%s>'
2116 % (filename, lineno, create_filename, create_lineno))
2117
2118 # double cancellation won't overwrite _repr
2119 h.cancel()
2120 self.assertEqual(
2121 repr(h),
2122 '<Handle cancelled noop(1, 2) at %s:%s created at %s:%s>'
2123 % (filename, lineno, create_filename, create_lineno))
Victor Stinnerf68bd882014-07-10 22:32:58 +02002124
Victor Stinner80f53aa2014-06-27 13:52:20 +02002125 def test_handle_source_traceback(self):
2126 loop = asyncio.get_event_loop_policy().new_event_loop()
2127 loop.set_debug(True)
2128 self.set_event_loop(loop)
2129
2130 def check_source_traceback(h):
2131 lineno = sys._getframe(1).f_lineno - 1
2132 self.assertIsInstance(h._source_traceback, list)
2133 self.assertEqual(h._source_traceback[-1][:3],
2134 (__file__,
2135 lineno,
2136 'test_handle_source_traceback'))
2137
2138 # call_soon
2139 h = loop.call_soon(noop)
2140 check_source_traceback(h)
2141
2142 # call_soon_threadsafe
2143 h = loop.call_soon_threadsafe(noop)
2144 check_source_traceback(h)
2145
2146 # call_later
2147 h = loop.call_later(0, noop)
2148 check_source_traceback(h)
2149
2150 # call_at
2151 h = loop.call_later(0, noop)
2152 check_source_traceback(h)
2153
Victor Stinner307bccc2014-06-12 18:39:26 +02002154
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002155class TimerTests(unittest.TestCase):
2156
Victor Stinner975735f2014-06-25 21:41:58 +02002157 def setUp(self):
2158 self.loop = mock.Mock()
2159
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002160 def test_hash(self):
2161 when = time.monotonic()
Yury Selivanovff827f02014-02-18 18:02:19 -05002162 h = asyncio.TimerHandle(when, lambda: False, (),
Victor Stinner24ba2032014-02-26 10:25:02 +01002163 mock.Mock())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002164 self.assertEqual(hash(h), hash(when))
2165
2166 def test_timer(self):
2167 def callback(*args):
2168 return args
2169
Victor Stinnerf68bd882014-07-10 22:32:58 +02002170 args = (1, 2, 3)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002171 when = time.monotonic()
Victor Stinner24ba2032014-02-26 10:25:02 +01002172 h = asyncio.TimerHandle(when, callback, args, mock.Mock())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002173 self.assertIs(h._callback, callback)
2174 self.assertIs(h._args, args)
2175 self.assertFalse(h._cancelled)
2176
Victor Stinner975735f2014-06-25 21:41:58 +02002177 # cancel
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002178 h.cancel()
2179 self.assertTrue(h._cancelled)
Victor Stinnerf68bd882014-07-10 22:32:58 +02002180 self.assertIsNone(h._callback)
2181 self.assertIsNone(h._args)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002182
Victor Stinner975735f2014-06-25 21:41:58 +02002183 # when cannot be None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002184 self.assertRaises(AssertionError,
Yury Selivanovff827f02014-02-18 18:02:19 -05002185 asyncio.TimerHandle, None, callback, args,
Victor Stinner975735f2014-06-25 21:41:58 +02002186 self.loop)
2187
2188 def test_timer_repr(self):
Victor Stinnerf68bd882014-07-10 22:32:58 +02002189 self.loop.get_debug.return_value = False
2190
Victor Stinner975735f2014-06-25 21:41:58 +02002191 # simple function
2192 h = asyncio.TimerHandle(123, noop, (), self.loop)
2193 src = test_utils.get_function_source(noop)
2194 self.assertEqual(repr(h),
2195 '<TimerHandle when=123 noop() at %s:%s>' % src)
2196
2197 # cancelled handle
2198 h.cancel()
2199 self.assertEqual(repr(h),
Victor Stinnerf68bd882014-07-10 22:32:58 +02002200 '<TimerHandle cancelled when=123>')
2201
2202 def test_timer_repr_debug(self):
2203 self.loop.get_debug.return_value = True
2204
2205 # simple function
2206 create_filename = __file__
2207 create_lineno = sys._getframe().f_lineno + 1
2208 h = asyncio.TimerHandle(123, noop, (), self.loop)
2209 filename, lineno = test_utils.get_function_source(noop)
2210 self.assertEqual(repr(h),
2211 '<TimerHandle when=123 noop() '
2212 'at %s:%s created at %s:%s>'
2213 % (filename, lineno, create_filename, create_lineno))
2214
2215 # cancelled handle
2216 h.cancel()
2217 self.assertEqual(repr(h),
Victor Stinner1b38bc62014-09-17 23:24:13 +02002218 '<TimerHandle cancelled when=123 noop() '
2219 'at %s:%s created at %s:%s>'
2220 % (filename, lineno, create_filename, create_lineno))
Victor Stinnerf68bd882014-07-10 22:32:58 +02002221
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002222
2223 def test_timer_comparison(self):
2224 def callback(*args):
2225 return args
2226
2227 when = time.monotonic()
2228
Victor Stinner975735f2014-06-25 21:41:58 +02002229 h1 = asyncio.TimerHandle(when, callback, (), self.loop)
2230 h2 = asyncio.TimerHandle(when, callback, (), self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002231 # TODO: Use assertLess etc.
2232 self.assertFalse(h1 < h2)
2233 self.assertFalse(h2 < h1)
2234 self.assertTrue(h1 <= h2)
2235 self.assertTrue(h2 <= h1)
2236 self.assertFalse(h1 > h2)
2237 self.assertFalse(h2 > h1)
2238 self.assertTrue(h1 >= h2)
2239 self.assertTrue(h2 >= h1)
2240 self.assertTrue(h1 == h2)
2241 self.assertFalse(h1 != h2)
2242
2243 h2.cancel()
2244 self.assertFalse(h1 == h2)
2245
Victor Stinner975735f2014-06-25 21:41:58 +02002246 h1 = asyncio.TimerHandle(when, callback, (), self.loop)
2247 h2 = asyncio.TimerHandle(when + 10.0, callback, (), self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002248 self.assertTrue(h1 < h2)
2249 self.assertFalse(h2 < h1)
2250 self.assertTrue(h1 <= h2)
2251 self.assertFalse(h2 <= h1)
2252 self.assertFalse(h1 > h2)
2253 self.assertTrue(h2 > h1)
2254 self.assertFalse(h1 >= h2)
2255 self.assertTrue(h2 >= h1)
2256 self.assertFalse(h1 == h2)
2257 self.assertTrue(h1 != h2)
2258
Victor Stinner975735f2014-06-25 21:41:58 +02002259 h3 = asyncio.Handle(callback, (), self.loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002260 self.assertIs(NotImplemented, h1.__eq__(h3))
2261 self.assertIs(NotImplemented, h1.__ne__(h3))
2262
2263
2264class AbstractEventLoopTests(unittest.TestCase):
2265
2266 def test_not_implemented(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01002267 f = mock.Mock()
Victor Stinner8dffc452014-01-25 15:32:06 +01002268 loop = asyncio.AbstractEventLoop()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002269 self.assertRaises(
2270 NotImplementedError, loop.run_forever)
2271 self.assertRaises(
2272 NotImplementedError, loop.run_until_complete, None)
2273 self.assertRaises(
2274 NotImplementedError, loop.stop)
2275 self.assertRaises(
2276 NotImplementedError, loop.is_running)
2277 self.assertRaises(
Victor Stinner896a25a2014-07-08 11:29:25 +02002278 NotImplementedError, loop.is_closed)
2279 self.assertRaises(
Guido van Rossume3f52ef2013-11-01 14:19:04 -07002280 NotImplementedError, loop.close)
2281 self.assertRaises(
Victor Stinner896a25a2014-07-08 11:29:25 +02002282 NotImplementedError, loop.create_task, None)
2283 self.assertRaises(
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002284 NotImplementedError, loop.call_later, None, None)
2285 self.assertRaises(
2286 NotImplementedError, loop.call_at, f, f)
2287 self.assertRaises(
2288 NotImplementedError, loop.call_soon, None)
2289 self.assertRaises(
2290 NotImplementedError, loop.time)
2291 self.assertRaises(
2292 NotImplementedError, loop.call_soon_threadsafe, None)
2293 self.assertRaises(
2294 NotImplementedError, loop.run_in_executor, f, f)
2295 self.assertRaises(
2296 NotImplementedError, loop.set_default_executor, f)
2297 self.assertRaises(
2298 NotImplementedError, loop.getaddrinfo, 'localhost', 8080)
2299 self.assertRaises(
2300 NotImplementedError, loop.getnameinfo, ('localhost', 8080))
2301 self.assertRaises(
2302 NotImplementedError, loop.create_connection, f)
2303 self.assertRaises(
2304 NotImplementedError, loop.create_server, f)
2305 self.assertRaises(
2306 NotImplementedError, loop.create_datagram_endpoint, f)
2307 self.assertRaises(
2308 NotImplementedError, loop.add_reader, 1, f)
2309 self.assertRaises(
2310 NotImplementedError, loop.remove_reader, 1)
2311 self.assertRaises(
2312 NotImplementedError, loop.add_writer, 1, f)
2313 self.assertRaises(
2314 NotImplementedError, loop.remove_writer, 1)
2315 self.assertRaises(
2316 NotImplementedError, loop.sock_recv, f, 10)
2317 self.assertRaises(
2318 NotImplementedError, loop.sock_sendall, f, 10)
2319 self.assertRaises(
2320 NotImplementedError, loop.sock_connect, f, f)
2321 self.assertRaises(
2322 NotImplementedError, loop.sock_accept, f)
2323 self.assertRaises(
2324 NotImplementedError, loop.add_signal_handler, 1, f)
2325 self.assertRaises(
2326 NotImplementedError, loop.remove_signal_handler, 1)
2327 self.assertRaises(
2328 NotImplementedError, loop.remove_signal_handler, 1)
2329 self.assertRaises(
2330 NotImplementedError, loop.connect_read_pipe, f,
Victor Stinner24ba2032014-02-26 10:25:02 +01002331 mock.sentinel.pipe)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002332 self.assertRaises(
2333 NotImplementedError, loop.connect_write_pipe, f,
Victor Stinner24ba2032014-02-26 10:25:02 +01002334 mock.sentinel.pipe)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002335 self.assertRaises(
2336 NotImplementedError, loop.subprocess_shell, f,
Victor Stinner24ba2032014-02-26 10:25:02 +01002337 mock.sentinel)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002338 self.assertRaises(
2339 NotImplementedError, loop.subprocess_exec, f)
Victor Stinner896a25a2014-07-08 11:29:25 +02002340 self.assertRaises(
2341 NotImplementedError, loop.set_exception_handler, f)
2342 self.assertRaises(
2343 NotImplementedError, loop.default_exception_handler, f)
2344 self.assertRaises(
2345 NotImplementedError, loop.call_exception_handler, f)
2346 self.assertRaises(
2347 NotImplementedError, loop.get_debug)
2348 self.assertRaises(
2349 NotImplementedError, loop.set_debug, f)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002350
2351
2352class ProtocolsAbsTests(unittest.TestCase):
2353
2354 def test_empty(self):
Victor Stinner24ba2032014-02-26 10:25:02 +01002355 f = mock.Mock()
Victor Stinner8dffc452014-01-25 15:32:06 +01002356 p = asyncio.Protocol()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002357 self.assertIsNone(p.connection_made(f))
2358 self.assertIsNone(p.connection_lost(f))
2359 self.assertIsNone(p.data_received(f))
2360 self.assertIsNone(p.eof_received())
2361
Victor Stinner8dffc452014-01-25 15:32:06 +01002362 dp = asyncio.DatagramProtocol()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002363 self.assertIsNone(dp.connection_made(f))
2364 self.assertIsNone(dp.connection_lost(f))
Guido van Rossum2335de72013-11-15 16:51:48 -08002365 self.assertIsNone(dp.error_received(f))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002366 self.assertIsNone(dp.datagram_received(f, f))
2367
Victor Stinner8dffc452014-01-25 15:32:06 +01002368 sp = asyncio.SubprocessProtocol()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002369 self.assertIsNone(sp.connection_made(f))
2370 self.assertIsNone(sp.connection_lost(f))
2371 self.assertIsNone(sp.pipe_data_received(1, f))
2372 self.assertIsNone(sp.pipe_connection_lost(1, f))
2373 self.assertIsNone(sp.process_exited())
2374
2375
2376class PolicyTests(unittest.TestCase):
2377
2378 def test_event_loop_policy(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01002379 policy = asyncio.AbstractEventLoopPolicy()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002380 self.assertRaises(NotImplementedError, policy.get_event_loop)
2381 self.assertRaises(NotImplementedError, policy.set_event_loop, object())
2382 self.assertRaises(NotImplementedError, policy.new_event_loop)
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -08002383 self.assertRaises(NotImplementedError, policy.get_child_watcher)
2384 self.assertRaises(NotImplementedError, policy.set_child_watcher,
2385 object())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002386
2387 def test_get_event_loop(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01002388 policy = asyncio.DefaultEventLoopPolicy()
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -08002389 self.assertIsNone(policy._local._loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002390
2391 loop = policy.get_event_loop()
Victor Stinner8dffc452014-01-25 15:32:06 +01002392 self.assertIsInstance(loop, asyncio.AbstractEventLoop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002393
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -08002394 self.assertIs(policy._local._loop, loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002395 self.assertIs(loop, policy.get_event_loop())
2396 loop.close()
2397
Guido van Rossumcced0762013-11-27 10:37:13 -08002398 def test_get_event_loop_calls_set_event_loop(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01002399 policy = asyncio.DefaultEventLoopPolicy()
Guido van Rossumcced0762013-11-27 10:37:13 -08002400
Victor Stinner24ba2032014-02-26 10:25:02 +01002401 with mock.patch.object(
Guido van Rossumcced0762013-11-27 10:37:13 -08002402 policy, "set_event_loop",
2403 wraps=policy.set_event_loop) as m_set_event_loop:
2404
2405 loop = policy.get_event_loop()
2406
2407 # policy._local._loop must be set through .set_event_loop()
2408 # (the unix DefaultEventLoopPolicy needs this call to attach
2409 # the child watcher correctly)
2410 m_set_event_loop.assert_called_with(loop)
2411
2412 loop.close()
2413
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002414 def test_get_event_loop_after_set_none(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01002415 policy = asyncio.DefaultEventLoopPolicy()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002416 policy.set_event_loop(None)
Victor Stinner3a1c7382014-12-18 01:20:10 +01002417 self.assertRaises(RuntimeError, policy.get_event_loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002418
Victor Stinner24ba2032014-02-26 10:25:02 +01002419 @mock.patch('asyncio.events.threading.current_thread')
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002420 def test_get_event_loop_thread(self, m_current_thread):
2421
2422 def f():
Victor Stinner8dffc452014-01-25 15:32:06 +01002423 policy = asyncio.DefaultEventLoopPolicy()
Victor Stinner3a1c7382014-12-18 01:20:10 +01002424 self.assertRaises(RuntimeError, policy.get_event_loop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002425
2426 th = threading.Thread(target=f)
2427 th.start()
2428 th.join()
2429
2430 def test_new_event_loop(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01002431 policy = asyncio.DefaultEventLoopPolicy()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002432
2433 loop = policy.new_event_loop()
Victor Stinner8dffc452014-01-25 15:32:06 +01002434 self.assertIsInstance(loop, asyncio.AbstractEventLoop)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002435 loop.close()
2436
2437 def test_set_event_loop(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01002438 policy = asyncio.DefaultEventLoopPolicy()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002439 old_loop = policy.get_event_loop()
2440
2441 self.assertRaises(AssertionError, policy.set_event_loop, object())
2442
2443 loop = policy.new_event_loop()
2444 policy.set_event_loop(loop)
2445 self.assertIs(loop, policy.get_event_loop())
2446 self.assertIsNot(old_loop, policy.get_event_loop())
2447 loop.close()
2448 old_loop.close()
2449
2450 def test_get_event_loop_policy(self):
Victor Stinner8dffc452014-01-25 15:32:06 +01002451 policy = asyncio.get_event_loop_policy()
2452 self.assertIsInstance(policy, asyncio.AbstractEventLoopPolicy)
2453 self.assertIs(policy, asyncio.get_event_loop_policy())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002454
2455 def test_set_event_loop_policy(self):
2456 self.assertRaises(
Victor Stinner8dffc452014-01-25 15:32:06 +01002457 AssertionError, asyncio.set_event_loop_policy, object())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002458
Victor Stinner8dffc452014-01-25 15:32:06 +01002459 old_policy = asyncio.get_event_loop_policy()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002460
Victor Stinner8dffc452014-01-25 15:32:06 +01002461 policy = asyncio.DefaultEventLoopPolicy()
2462 asyncio.set_event_loop_policy(policy)
2463 self.assertIs(policy, asyncio.get_event_loop_policy())
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07002464 self.assertIsNot(policy, old_policy)
2465
2466
2467if __name__ == '__main__':
2468 unittest.main()