@@ -37,7 +37,7 @@ def with_short_default_semaphore_ttl(
3737) -> datetime .timedelta :
3838 short_ttl = datetime .timedelta (seconds = 0.5 )
3939 mocker .patch (
40- "servicelib.redis._semaphore._DEFAULT_SEMAPHORE_TTL " ,
40+ "servicelib.redis._semaphore.DEFAULT_SEMAPHORE_TTL " ,
4141 short_ttl ,
4242 )
4343 return short_ttl
@@ -99,6 +99,7 @@ async def test_semaphore_acquire_release_single(
9999 redis_client_sdk : RedisClientSDK ,
100100 semaphore_name : str ,
101101 semaphore_capacity : int ,
102+ with_short_default_semaphore_ttl : datetime .timedelta ,
102103):
103104 semaphore = DistributedSemaphore (
104105 redis_client = redis_client_sdk ,
@@ -143,6 +144,24 @@ async def test_semaphore_acquire_release_single(
143144 ):
144145 await semaphore .reacquire ()
145146
147+ # now check what happens once TTL is expired
148+ await semaphore .acquire ()
149+ assert await semaphore .get_current_count () == 1
150+ assert await semaphore .get_available_count () == semaphore_capacity - 1
151+ await asyncio .sleep (with_short_default_semaphore_ttl .total_seconds () + 0.1 )
152+ # TTL expired, reacquire should fail
153+ with pytest .raises (
154+ SemaphoreLostError ,
155+ match = f"Semaphore '{ semaphore_name } ' was lost by this instance" ,
156+ ):
157+ await semaphore .reacquire ()
158+ # and release should also fail
159+ with pytest .raises (
160+ SemaphoreNotAcquiredError ,
161+ match = f"Semaphore '{ semaphore_name } ' was not acquired by this instance" ,
162+ ):
163+ await semaphore .release ()
164+
146165
147166async def test_semaphore_context_manager (
148167 redis_client_sdk : RedisClientSDK ,
0 commit comments