@@ -1651,7 +1651,7 @@ def core_func(args):
16511651 assert (host_reader2 .received == [11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ])
16521652
16531653
1654- def test_stream_forward ():
1654+ def test_transfer_readable_end ():
16551655 host_writer = HostWriter (U8Type (), [1 ,2 ,3 ,4 ], chunk = 4 )
16561656 def on_start ():
16571657 return [host_writer .readable_end ]
@@ -1674,6 +1674,97 @@ def core_func(args):
16741674 assert (host_writer .readable_end is return_value )
16751675
16761676
1677+ def test_forward ():
1678+ store = Store ()
1679+ mem = bytearray (32 )
1680+ opts = mk_opts (memory = MemInst (mem , 'i32' ), async_ = True )
1681+ inst = ComponentInstance (store )
1682+ st = StreamType (U8Type ())
1683+ ft = FutureType (U8Type ())
1684+
1685+ def core_func (args ):
1686+ def new_stream (t = st ):
1687+ [packed ] = canon_stream_new (t )
1688+ return unpack_new_ends (packed )
1689+ def new_future ():
1690+ [packed ] = canon_future_new (ft )
1691+ return unpack_new_ends (packed )
1692+
1693+ rsi ,wsi = new_stream ()
1694+ [] = canon_stream_forward (st , rsi , wsi )
1695+
1696+ rsi1 ,wsi1 = new_stream ()
1697+ rsi2 ,wsi2 = new_stream ()
1698+ [] = canon_stream_drop_readable (st , rsi2 )
1699+ [] = canon_stream_forward (st , rsi1 , wsi2 )
1700+ [ret ] = canon_stream_write (st , opts , wsi1 , 0 , 4 )
1701+ result ,n = unpack_result (ret )
1702+ assert (n == 0 and result == End .Result .DROPPED )
1703+ [] = canon_stream_drop_writable (st , wsi1 )
1704+
1705+ rsi1 ,wsi1 = new_stream ()
1706+ rsi2 ,wsi2 = new_stream ()
1707+ [] = canon_stream_forward (st , rsi1 , wsi2 )
1708+ mem [0 :4 ] = b'\x01 \x02 \x03 \x04 '
1709+ [ret ] = canon_stream_write (st , opts , wsi1 , 0 , 4 )
1710+ assert (ret == definitions .BLOCKED )
1711+ [ret ] = canon_stream_read (st , opts , rsi2 , 8 , 4 )
1712+ result ,n = unpack_result (ret )
1713+ assert (n == 4 and result == End .Result .COMPLETED )
1714+ assert (mem [8 :12 ] == b'\x01 \x02 \x03 \x04 ' )
1715+
1716+ rsi1 ,wsi1 = new_stream ()
1717+ rsi2 ,wsi2 = new_stream ()
1718+ [ret ] = canon_stream_read (st , opts , rsi2 , 8 , 4 )
1719+ assert (ret == definitions .BLOCKED )
1720+ [] = canon_stream_forward (st , rsi1 , wsi2 )
1721+ mem [0 :4 ] = b'\x05 \x06 \x07 \x08 '
1722+ [ret ] = canon_stream_write (st , opts , wsi1 , 0 , 4 )
1723+ result ,n = unpack_result (ret )
1724+ assert (n == 4 and result == End .Result .COMPLETED )
1725+ assert (mem [8 :12 ] == b'\x05 \x06 \x07 \x08 ' )
1726+ [seti ] = canon_waitable_set_new ()
1727+ [] = canon_waitable_join (rsi2 , seti )
1728+ [event ] = canon_waitable_set_wait (MemInst (mem , 'i32' ), seti , 16 )
1729+ assert (event == EventCode .STREAM_READ )
1730+ assert (mem [16 ] == rsi2 )
1731+ result ,n = unpack_result (mem [20 ])
1732+ assert (n == 4 and result == End .Result .COMPLETED )
1733+
1734+ rfi1 ,wfi1 = new_future ()
1735+ rfi2 ,wfi2 = new_future ()
1736+ [ret ] = canon_future_read (ft , opts , rfi2 , 8 )
1737+ assert (ret == definitions .BLOCKED )
1738+ [] = canon_future_forward (ft , rfi1 , wfi2 )
1739+ mem [0 ] = 42
1740+ [ret ] = canon_future_write (ft , opts , wfi1 , 0 )
1741+ assert (ret == End .Result .COMPLETED )
1742+ assert (mem [8 ] == 42 )
1743+
1744+ rfi1 ,wfi1 = new_future ()
1745+ rfi2 ,wfi2 = new_future ()
1746+ mem [0 ] = 43
1747+ [ret ] = canon_future_write (ft , opts , wfi1 , 0 )
1748+ assert (ret == definitions .BLOCKED )
1749+ [ret ] = canon_future_read (ft , opts , rfi2 , 8 )
1750+ assert (ret == definitions .BLOCKED )
1751+ [] = canon_future_forward (ft , rfi1 , wfi2 )
1752+ assert (mem [8 ] == 43 )
1753+
1754+ rfi1 ,wfi1 = new_future ()
1755+ rfi2 ,wfi2 = new_future ()
1756+ [] = canon_future_drop_readable (ft , rfi2 )
1757+ [] = canon_future_forward (ft , rfi1 , wfi2 )
1758+ [ret ] = canon_future_write (ft , opts , wfi1 , 0 )
1759+ assert (ret == End .Result .DROPPED )
1760+ [] = canon_future_drop_writable (ft , wfi1 )
1761+
1762+ return []
1763+
1764+ caller_ft = FuncType ([], [], async_ = True )
1765+ lift_and_run (mk_opts (), inst , caller_ft , core_func , lambda :[], lambda _ :())
1766+
1767+
16771768def test_receive_own_stream ():
16781769 store = Store ()
16791770 inst = ComponentInstance (store )
@@ -2974,7 +3065,8 @@ def on_resolve(v):
29743065test_sync_using_wait ()
29753066test_eager_stream_completion ()
29763067test_async_stream_ops ()
2977- test_stream_forward ()
3068+ test_transfer_readable_end ()
3069+ test_forward ()
29783070test_receive_own_stream ()
29793071test_host_partial_reads_writes ()
29803072test_wasm_to_wasm_stream ()
0 commit comments