summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-06-17 23:14:59 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2014-06-17 23:14:59 (GMT)
commit8d3e02ef5a452b59fc909bf45d1d18bfd916c596 (patch)
tree7c03d264b990109a99a92866b09b8c98409ff9fd /Lib/test
parent66dc6b0f5355857ea73f59e6eb2066bf6604d322 (diff)
downloadcpython-8d3e02ef5a452b59fc909bf45d1d18bfd916c596.zip
cpython-8d3e02ef5a452b59fc909bf45d1d18bfd916c596.tar.gz
cpython-8d3e02ef5a452b59fc909bf45d1d18bfd916c596.tar.bz2
asyncio: Set __qualname__ attribute of CoroWrapper in @coroutine decorator on
Python 3.5 - Drop __slots__ optimization of CoroWrapper to be able to set the __qualname__ attribute. - Add tests on __name__, __qualname__ and __module__ of a coroutine function and coroutine object. - Fix test_tasks when run in debug mode (PYTHONASYNCIODEBUG env var set) on Python 3.3 or 3.4
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_asyncio/test_tasks.py48
1 files changed, 40 insertions, 8 deletions
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py
index 4e239ec..dcc8123 100644
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -9,9 +9,13 @@ import weakref
from test.script_helper import assert_python_ok
import asyncio
+from asyncio import tasks
from asyncio import test_utils
+PY35 = (sys.version_info >= (3, 5))
+
+
@asyncio.coroutine
def coroutine_function():
pass
@@ -117,10 +121,22 @@ class TaskTests(unittest.TestCase):
yield from []
return 'abc'
+ self.assertEqual(notmuch.__name__, 'notmuch')
+ if PY35:
+ self.assertEqual(notmuch.__qualname__,
+ 'TaskTests.test_task_repr.<locals>.notmuch')
+ self.assertEqual(notmuch.__module__, __name__)
+
filename, lineno = test_utils.get_function_source(notmuch)
src = "%s:%s" % (filename, lineno)
- t = asyncio.Task(notmuch(), loop=self.loop)
+ gen = notmuch()
+ self.assertEqual(gen.__name__, 'notmuch')
+ if PY35:
+ self.assertEqual(gen.__qualname__,
+ 'TaskTests.test_task_repr.<locals>.notmuch')
+
+ t = asyncio.Task(gen, loop=self.loop)
t.add_done_callback(Dummy())
self.assertEqual(repr(t),
'Task(<notmuch at %s>)<PENDING, [Dummy()]>' % src)
@@ -143,6 +159,12 @@ class TaskTests(unittest.TestCase):
def notmuch():
pass
+ self.assertEqual(notmuch.__name__, 'notmuch')
+ self.assertEqual(notmuch.__module__, __name__)
+ if PY35:
+ self.assertEqual(notmuch.__qualname__,
+ 'TaskTests.test_task_repr_custom.<locals>.notmuch')
+
class T(asyncio.Future):
def __repr__(self):
return 'T[]'
@@ -152,16 +174,26 @@ class TaskTests(unittest.TestCase):
return super().__repr__()
gen = notmuch()
- t = MyTask(gen, loop=self.loop)
- filename = gen.gi_code.co_filename
- lineno = gen.gi_frame.f_lineno
- if sys.version_info >= (3, 5):
- name = 'notmuch'
+ if PY35 or tasks._DEBUG:
+ # On Python >= 3.5, generators now inherit the name of the
+ # function, as expected, and have a qualified name (__qualname__
+ # attribute). In debug mode, @coroutine decorator uses CoroWrapper
+ # which gets its name (__name__ attribute) from the wrapped
+ # coroutine function.
+ coro_name = 'notmuch'
else:
# On Python < 3.5, generators inherit the name of the code, not of
# the function. See: http://bugs.python.org/issue21205
- name = 'coro'
- self.assertEqual(repr(t), 'T[](<%s at %s:%s>)' % (name, filename, lineno))
+ coro_name = 'coro'
+ self.assertEqual(gen.__name__, coro_name)
+ if PY35:
+ self.assertEqual(gen.__qualname__,
+ 'TaskTests.test_task_repr_custom.<locals>.notmuch')
+
+ t = MyTask(gen, loop=self.loop)
+ filename = gen.gi_code.co_filename
+ lineno = gen.gi_frame.f_lineno
+ self.assertEqual(repr(t), 'T[](<%s at %s:%s>)' % (coro_name, filename, lineno))
def test_task_basics(self):
@asyncio.coroutine