''' ``async with ():`` inlined context-stream cancellation testing. Verify the we raise errors when streams are opened prior to sync-opening a ``tractor.Context`` beforehand. ''' import trio from trio.lowlevel import current_task import tractor @tractor.context async def never_open_stream( ctx: tractor.Context, ) -> None: '''Bidir streaming endpoint which will stream back any sequence it is sent item-wise. ''' await ctx.started() await trio.sleep_forever() def test_no_far_end_stream_opened(): ''' This should exemplify the bug from: https://github.com/goodboy/tractor/issues/265 ''' async def main(): async with tractor.open_nursery() as n: portal = await n.start_actor( 'starts_no_stream', enable_modules=[__name__], ) async with ( portal.open_context( never_open_stream,) as (ctx, sent), ctx.open_stream() as stream, ): assert sent is None # XXX: so the question is whether # this should error if the far end # has not yet called `ctx.open_stream()`? # If we decide to do that we need a synchronization # message which is sent from that call? await stream.send('yo') trio.run(main)