def test_parked_closed(self): ch = Channel() def closing(): yield sleep(0.005) ch.close() go(closing) self.assertEqual((yield put(ch, 42)), False)
def test_parked_taken(self): ch = Channel() def taking(): yield sleep(0.005) yield take(ch) go(taking) self.assertEqual((yield put(ch, 42)), True)
def test_parked_closed(self): ch = Channel() def closing(): yield sleep(0.005) ch.close() go(closing) self.assertEqual((yield take(ch)), CLOSED)
def test_parked_put(self): ch = Channel() def putting(): yield sleep(0.005) yield put(ch, 42) go(putting) self.assertEqual((yield take(ch)), 42)
def taken(value): def checking(): # yield control so that the second put can proceed # XXX: @inlineCallbacks seems to resume the generator # in the same tick if the result is immediately # available (not a deferred, or an already resolved # deferred), so we need to force next tick by "sleep". # I think this is bad behavior from @inlineCallbacks. yield sleep(0) self.assertEqual(var["count"], 2, "second (buffered) put succeeds") d.callback(CLOSED) go(checking)
def test_immediate_put(self): ch = Channel() def putting(): yield put(ch, 42) go(putting) self.assertEqual((yield take(ch)), 42)
def test_immediate_taken(self): ch = Channel() def taking(): yield take(ch) go(taking) self.assertEqual((yield put(ch, 42)), True)