xref: /wasmtime-44.0.1/crates/fuzzing/wit/fuzz.wit (revision fee9be21)
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