@@ -72,6 +72,116 @@ fn bare_run_requires_default_entrypoint() {
7272 . stderr ( predicate:: str:: contains ( "no start function or `_start` export" ) ) ;
7373}
7474
75+ #[ test]
76+ fn run_supplies_wasi_arguments ( ) {
77+ let dir = tempdir ( ) . unwrap ( ) ;
78+ let module = write_module (
79+ & dir,
80+ "args.wat" ,
81+ r#"(module
82+ (import "wasi_snapshot_preview1" "args_sizes_get" (func $args_sizes_get (param i32 i32) (result i32)))
83+ (import "wasi_snapshot_preview1" "proc_exit" (func $proc_exit (param i32)))
84+ (memory (export "memory") 1)
85+ (func (export "_start")
86+ i32.const 0
87+ i32.const 4
88+ call $args_sizes_get
89+ drop
90+ i32.const 0
91+ i32.load
92+ call $proc_exit))"# ,
93+ ) ;
94+
95+ Command :: cargo_bin ( "tinywasm" ) . unwrap ( ) . args ( [ "run" , & module, "one" , "two" ] ) . assert ( ) . code ( 3 ) . stderr ( "" ) ;
96+ }
97+
98+ #[ test]
99+ fn run_supplies_explicit_wasi_environment ( ) {
100+ let dir = tempdir ( ) . unwrap ( ) ;
101+ let module = write_module (
102+ & dir,
103+ "env.wat" ,
104+ r#"(module
105+ (import "wasi_snapshot_preview1" "environ_sizes_get" (func $environ_sizes_get (param i32 i32) (result i32)))
106+ (import "wasi_snapshot_preview1" "proc_exit" (func $proc_exit (param i32)))
107+ (memory (export "memory") 1)
108+ (func (export "_start")
109+ i32.const 0
110+ i32.const 4
111+ call $environ_sizes_get
112+ drop
113+ i32.const 0
114+ i32.load
115+ call $proc_exit))"# ,
116+ ) ;
117+
118+ Command :: cargo_bin ( "tinywasm" )
119+ . unwrap ( )
120+ . args ( [ "run" , "--env" , "MODE=test" , "--env" , "COLOR=off" , & module] )
121+ . assert ( )
122+ . code ( 2 )
123+ . stderr ( "" ) ;
124+ }
125+
126+ #[ test]
127+ fn run_inherits_wasi_stdout ( ) {
128+ let dir = tempdir ( ) . unwrap ( ) ;
129+ let module = write_module (
130+ & dir,
131+ "stdout.wat" ,
132+ r#"(module
133+ (import "wasi_snapshot_preview1" "fd_write" (func $fd_write (param i32 i32 i32 i32) (result i32)))
134+ (memory (export "memory") 1)
135+ (data (i32.const 16) "hello wasi\n")
136+ (func (export "_start")
137+ i32.const 0 i32.const 16 i32.store
138+ i32.const 4 i32.const 11 i32.store
139+ i32.const 1 i32.const 0 i32.const 1 i32.const 8
140+ call $fd_write
141+ drop))"# ,
142+ ) ;
143+
144+ Command :: cargo_bin ( "tinywasm" ) . unwrap ( ) . args ( [ "run" , & module] ) . assert ( ) . success ( ) . stdout ( "hello wasi\n " ) ;
145+ }
146+
147+ #[ test]
148+ fn run_preopens_wasi_directory ( ) {
149+ let dir = tempdir ( ) . unwrap ( ) ;
150+ let module = write_module (
151+ & dir,
152+ "preopen.wat" ,
153+ r#"(module
154+ (import "wasi_snapshot_preview1" "fd_prestat_get" (func $prestat (param i32 i32) (result i32)))
155+ (import "wasi_snapshot_preview1" "proc_exit" (func $proc_exit (param i32)))
156+ (memory (export "memory") 1)
157+ (func (export "_start")
158+ i32.const 3
159+ i32.const 0
160+ call $prestat
161+ call $proc_exit))"# ,
162+ ) ;
163+ let mapping = format ! ( "{}::/data" , dir. path( ) . display( ) ) ;
164+
165+ Command :: cargo_bin ( "tinywasm" ) . unwrap ( ) . args ( [ "run" , "--dir" , & mapping, & module] ) . assert ( ) . success ( ) . stderr ( "" ) ;
166+ }
167+
168+ #[ test]
169+ fn run_executes_core_start_before_wasi_start ( ) {
170+ let dir = tempdir ( ) . unwrap ( ) ;
171+ let module = write_module (
172+ & dir,
173+ "start-order.wat" ,
174+ r#"(module
175+ (import "wasi_snapshot_preview1" "proc_exit" (func $proc_exit (param i32)))
176+ (global $status (mut i32) (i32.const 1))
177+ (func $initialize i32.const 7 global.set $status)
178+ (start $initialize)
179+ (func (export "_start") global.get $status call $proc_exit))"# ,
180+ ) ;
181+
182+ Command :: cargo_bin ( "tinywasm" ) . unwrap ( ) . args ( [ "run" , & module] ) . assert ( ) . code ( 7 ) . stderr ( "" ) ;
183+ }
184+
75185#[ test]
76186fn inspect_lists_exports ( ) {
77187 let dir = tempdir ( ) . unwrap ( ) ;
0 commit comments