File size: 1,023 Bytes
748b3e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import asyncio

from telesave.core.limits import ConcurrencyLimiter


def test_cancelled_per_user_wait_releases_global_permit() -> None:
    async def scenario() -> None:
        limiter = ConcurrencyLimiter(global_limit=2, per_user_limit=1)
        entered = asyncio.Event()

        async def holder() -> None:
            async with limiter.acquire(1):
                entered.set()
                await asyncio.sleep(3600)

        async def waiter() -> None:
            async with limiter.acquire(1):
                pass

        holder_task = asyncio.create_task(holder())
        await entered.wait()
        waiter_task = asyncio.create_task(waiter())
        await asyncio.sleep(0)
        waiter_task.cancel()
        try:
            await waiter_task
        except asyncio.CancelledError:
            pass

        assert limiter._global._value == 1
        holder_task.cancel()
        try:
            await holder_task
        except asyncio.CancelledError:
            pass

    asyncio.run(scenario())