1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
# Copyright (C) 2016-present the asyncpg authors and contributors
# <see AUTHORS file>
#
# This module is part of asyncpg and is released under
# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0
import asyncio
import asyncpg
from asyncpg import _testbase as tb
class TestCancellation(tb.ConnectedTestCase):
async def test_cancellation_01(self):
st1000 = await self.con.prepare('SELECT 1000')
async def test0():
val = await self.con.execute('SELECT 42')
self.assertEqual(val, 'SELECT 1')
async def test1():
val = await self.con.fetchval('SELECT 42')
self.assertEqual(val, 42)
async def test2():
val = await self.con.fetchrow('SELECT 42')
self.assertEqual(val, (42,))
async def test3():
val = await self.con.fetch('SELECT 42')
self.assertEqual(val, [(42,)])
async def test4():
val = await self.con.prepare('SELECT 42')
self.assertEqual(await val.fetchval(), 42)
async def test5():
self.assertEqual(await st1000.fetchval(), 1000)
async def test6():
self.assertEqual(await st1000.fetchrow(), (1000,))
async def test7():
self.assertEqual(await st1000.fetch(), [(1000,)])
async def test8():
cur = await st1000.cursor()
self.assertEqual(await cur.fetchrow(), (1000,))
for test in {test0, test1, test2, test3, test4, test5,
test6, test7, test8}:
with self.subTest(testfunc=test), self.assertRunUnder(1):
st = await self.con.prepare('SELECT pg_sleep(20)')
task = self.loop.create_task(st.fetch())
await asyncio.sleep(0.05)
task.cancel()
with self.assertRaises(asyncio.CancelledError):
await task
async with self.con.transaction():
await test()
async def test_cancellation_02(self):
st = await self.con.prepare('SELECT 1')
task = self.loop.create_task(st.fetch())
await asyncio.sleep(0.05)
task.cancel()
self.assertEqual(await task, [(1,)])
async def test_cancellation_03(self):
with self.assertRaises(asyncpg.InFailedSQLTransactionError):
async with self.con.transaction():
task = self.loop.create_task(
self.con.fetch('SELECT pg_sleep(20)'))
await asyncio.sleep(0.05)
task.cancel()
with self.assertRaises(asyncio.CancelledError):
await task
await self.con.fetch('SELECT generate_series(0, 100)')
self.assertEqual(
await self.con.fetchval('SELECT 42'),
42)
async def test_cancellation_04(self):
await self.con.fetchval('SELECT pg_sleep(0)')
waiter = asyncio.Future()
self.con._cancel_current_command(waiter)
await waiter
self.assertEqual(await self.con.fetchval('SELECT 42'), 42)
|