1*fee9be21SAlex Crichton// For more information on what this is used for, see `fuzz_async.rs` 2*fee9be21SAlex Crichton 3*fee9be21SAlex Crichtonpackage wasmtime-fuzz:fuzz; 4*fee9be21SAlex Crichton 5*fee9be21SAlex Crichtoninterface types { 6*fee9be21SAlex Crichton variant command { 7*fee9be21SAlex Crichton // invoke the imported `sync-ready` function 8*fee9be21SAlex Crichton sync-ready-call, 9*fee9be21SAlex Crichton 10*fee9be21SAlex Crichton // invoke the imported `async-ready` function, and assert it's ready 11*fee9be21SAlex Crichton async-ready-call, 12*fee9be21SAlex Crichton 13*fee9be21SAlex Crichton // invoke the imported `async-pending` function, assert it's not 14*fee9be21SAlex Crichton // ready, and save it with the id provided. 15*fee9be21SAlex Crichton async-pending-import-call(u32), 16*fee9be21SAlex Crichton // cancel's a prior call of `async-pending` with the id specified 17*fee9be21SAlex Crichton async-pending-import-cancel(u32), 18*fee9be21SAlex Crichton // asserts that a prior call of `async-pending` with the id specified is 19*fee9be21SAlex Crichton // ready. 20*fee9be21SAlex Crichton async-pending-import-assert-ready(u32), 21*fee9be21SAlex Crichton // complete a previous invocation of this component's `async-pending` 22*fee9be21SAlex Crichton // export. 23*fee9be21SAlex Crichton async-pending-export-complete(u32), 24*fee9be21SAlex Crichton // assert a previous invocation of this component's `async-pending` export 25*fee9be21SAlex Crichton // is cancelled. 26*fee9be21SAlex Crichton async-pending-export-assert-cancelled(u32), 27*fee9be21SAlex Crichton 28*fee9be21SAlex Crichton // make a future read/write combo with the `id` specified. 29*fee9be21SAlex Crichton future-new(u32), 30*fee9be21SAlex Crichton // take a future readable end through the `future-take` import. 31*fee9be21SAlex Crichton future-take(u32), 32*fee9be21SAlex Crichton // pass the future specified to this component's `future-receive` import. 33*fee9be21SAlex Crichton future-give(u32), 34*fee9be21SAlex Crichton // drop the future end identified 35*fee9be21SAlex Crichton future-drop-readable(u32), 36*fee9be21SAlex Crichton // ... 37*fee9be21SAlex Crichton future-write-ready(future-payload), 38*fee9be21SAlex Crichton future-read-ready(future-payload), 39*fee9be21SAlex Crichton future-write-pending(future-payload), 40*fee9be21SAlex Crichton future-read-pending(u32), 41*fee9be21SAlex Crichton future-write-dropped(u32), 42*fee9be21SAlex Crichton future-cancel-write(u32), 43*fee9be21SAlex Crichton future-cancel-read(u32), 44*fee9be21SAlex Crichton future-write-assert-complete(u32), 45*fee9be21SAlex Crichton future-write-assert-dropped(u32), 46*fee9be21SAlex Crichton future-read-assert-complete(future-payload), 47*fee9be21SAlex Crichton 48*fee9be21SAlex Crichton // make a stream read/write combo with the `id` specified. 49*fee9be21SAlex Crichton stream-new(u32), 50*fee9be21SAlex Crichton // take a stream readable end through the `stream-take` import. 51*fee9be21SAlex Crichton stream-take(u32), 52*fee9be21SAlex Crichton // pass the stream specified to this component's `stream-receive` import. 53*fee9be21SAlex Crichton stream-give(u32), 54*fee9be21SAlex Crichton // drop the stream end identified 55*fee9be21SAlex Crichton stream-drop-readable(u32), 56*fee9be21SAlex Crichton stream-drop-writable(u32), 57*fee9be21SAlex Crichton // ... 58*fee9be21SAlex Crichton stream-write-ready(stream-ready-payload), 59*fee9be21SAlex Crichton stream-read-ready(stream-ready-payload), 60*fee9be21SAlex Crichton stream-write-pending(stream-write-payload), 61*fee9be21SAlex Crichton stream-read-pending(stream-read-payload), 62*fee9be21SAlex Crichton stream-write-dropped(stream-write-payload), 63*fee9be21SAlex Crichton stream-read-dropped(stream-read-payload), 64*fee9be21SAlex Crichton stream-cancel-write(u32), 65*fee9be21SAlex Crichton stream-cancel-read(u32), 66*fee9be21SAlex Crichton stream-write-assert-complete(stream-read-payload), 67*fee9be21SAlex Crichton stream-write-assert-dropped(stream-read-payload), 68*fee9be21SAlex Crichton stream-read-assert-complete(stream-write-payload), 69*fee9be21SAlex Crichton stream-read-assert-dropped(u32), 70*fee9be21SAlex Crichton 71*fee9be21SAlex Crichton ack, 72*fee9be21SAlex Crichton } 73*fee9be21SAlex Crichton 74*fee9be21SAlex Crichton record future-payload { 75*fee9be21SAlex Crichton %future: u32, 76*fee9be21SAlex Crichton item: u32, 77*fee9be21SAlex Crichton } 78*fee9be21SAlex Crichton 79*fee9be21SAlex Crichton record stream-ready-payload { 80*fee9be21SAlex Crichton %stream: u32, 81*fee9be21SAlex Crichton item: u32, 82*fee9be21SAlex Crichton op-count: u32, 83*fee9be21SAlex Crichton ready-count: u32, 84*fee9be21SAlex Crichton } 85*fee9be21SAlex Crichton 86*fee9be21SAlex Crichton record stream-write-payload { 87*fee9be21SAlex Crichton %stream: u32, 88*fee9be21SAlex Crichton item: u32, 89*fee9be21SAlex Crichton count: u32, 90*fee9be21SAlex Crichton } 91*fee9be21SAlex Crichton 92*fee9be21SAlex Crichton record stream-read-payload { 93*fee9be21SAlex Crichton %stream: u32, 94*fee9be21SAlex Crichton count: u32, 95*fee9be21SAlex Crichton } 96*fee9be21SAlex Crichton 97*fee9be21SAlex Crichton enum scope { 98*fee9be21SAlex Crichton caller, 99*fee9be21SAlex Crichton callee, 100*fee9be21SAlex Crichton } 101*fee9be21SAlex Crichton 102*fee9be21SAlex Crichton get-commands: func(s: scope) -> stream<command>; 103*fee9be21SAlex Crichton} 104*fee9be21SAlex Crichton 105*fee9be21SAlex Crichtoninterface async-test { 106*fee9be21SAlex Crichton use types.{command, scope}; 107*fee9be21SAlex Crichton 108*fee9be21SAlex Crichton // Initialization function. Invokes `task.return` but keeps running to receive 109*fee9be21SAlex Crichton // commands. Commands come from the `get-commands` function which is passed 110*fee9be21SAlex Crichton // the `scope` provided here. 111*fee9be21SAlex Crichton // 112*fee9be21SAlex Crichton // This invokes the imported `init` function with the `callee` scope. 113*fee9be21SAlex Crichton init: async func(scope: scope); 114*fee9be21SAlex Crichton 115*fee9be21SAlex Crichton sync-ready: func(); 116*fee9be21SAlex Crichton 117*fee9be21SAlex Crichton // Must return immediately. 118*fee9be21SAlex Crichton async-ready: async func(); 119*fee9be21SAlex Crichton 120*fee9be21SAlex Crichton // Must not be ready when called. Status will be resolved through a later 121*fee9be21SAlex Crichton // command using the `id` provided. 122*fee9be21SAlex Crichton async-pending: async func(id: u32); 123*fee9be21SAlex Crichton 124*fee9be21SAlex Crichton // Remove the future reader `id` from this component's state and return it. 125*fee9be21SAlex Crichton future-take: func(id: u32) -> future<u32>; 126*fee9be21SAlex Crichton // Receive a future from another component. 127*fee9be21SAlex Crichton future-receive: func(id: u32, f: future<u32>); 128*fee9be21SAlex Crichton 129*fee9be21SAlex Crichton // Remove the stream reader `id` from this component's state and return it. 130*fee9be21SAlex Crichton stream-take: func(id: u32) -> stream<u32>; 131*fee9be21SAlex Crichton // Receive a stream from another component. 132*fee9be21SAlex Crichton stream-receive: func(id: u32, f: stream<u32>); 133*fee9be21SAlex Crichton 134*fee9be21SAlex Crichton} 135*fee9be21SAlex Crichton 136*fee9be21SAlex Crichtonworld fuzz-async { 137*fee9be21SAlex Crichton import async-test; 138*fee9be21SAlex Crichton export async-test; 139*fee9be21SAlex Crichton} 140