def test_acquire_callback(self): # Test that callbacks passed to acquire() run immediately after # release(), and that wait() callbacks aren't run until a release() # with no waiters on acquire(). sem = toro.Semaphore(0) history = [] sem.acquire().add_done_callback(make_callback('acquire1', history)) sem.acquire().add_done_callback(make_callback('acquire2', history)) def wait_callback(name): def cb(_): self.assertFalse(sem.locked()) history.append(name) return cb sem.wait().add_done_callback(wait_callback('wait1')) sem.wait().add_done_callback(wait_callback('wait2')) sem.release() history.append('release1') sem.release() history.append('release2') sem.release() history.append('release3') self.assertEqual([ # First release wakes first acquire 'acquire1', 'release1', # Second release wakes second acquire 'acquire2', 'release2', # Third release wakes all waits 'wait1', 'wait2', 'release3' ], history)
def test_release_twice(self): s = toro.Semaphore() result = [] s.acquire().add_done_callback(lambda x: result.append('a')) s.release() s.acquire().add_done_callback(lambda x: result.append('b')) s.release() yield gen.Task(self.io_loop.add_timeout, time.time() + 0.01) self.assertEqual(result, ['a', 'b'])
def test_context_manager_contended(self): toro_obj = toro.Semaphore() history = [] n_coroutines = 10 @gen.coroutine def f(i): with (yield toro_obj.acquire()): history.append('acquired %d' % i) yield pause(timedelta(seconds=0.01)) history.append('releasing %d' % i) yield [f(i) for i in range(n_coroutines)] expected_history = [] for i in range(n_coroutines): expected_history.extend(['acquired %d' % i, 'releasing %d' % i]) self.assertEqual(expected_history, history)
def test_repr(self): # No exceptions str(toro.Semaphore()) repr(toro.Semaphore())
def test_timeout_acquire(self): s = toro.Semaphore(value=0) with assert_raises(toro.Timeout): yield s.acquire(deadline=timedelta(seconds=0.01))