2020-04-06 16:47:06 -07:00
use std ::env ;
use wasmer_runtime ::Backend ;
pub fn get_backend ( ) -> Option < Backend > {
#[ cfg(feature = " backend-cranelift " ) ]
{
2020-04-06 17:14:27 -07:00
if let Ok ( v ) = env ::var ( " WASMER_TEST_CRANELIFT " ) {
2020-04-06 16:47:06 -07:00
if v = = " 1 " {
return Some ( Backend ::Cranelift ) ;
}
}
}
#[ cfg(feature = " backend-llvm " ) ]
{
if let Ok ( v ) = env ::var ( " WASMER_TEST_LLVM " ) {
if v = = " 1 " {
return Some ( Backend ::LLVM ) ;
}
}
}
#[ cfg(feature = " backend-singlepass " ) ]
{
if let Ok ( v ) = env ::var ( " WASMER_TEST_SINGLEPASS " ) {
if v = = " 1 " {
return Some ( Backend ::Singlepass ) ;
}
}
}
None
}
2019-05-17 12:09:31 -07:00
macro_rules ! assert_wasi_output {
2019-07-17 14:00:51 -07:00
( $file :expr , $name :expr , $po_dir_args : expr , $mapdir_args :expr , $envvar_args :expr , $expected :expr ) = > { {
2020-04-08 11:59:47 -07:00
use crate ::dev_utils ::stdio ::StdioCapturer ;
2019-11-21 19:31:17 -08:00
use wasmer_runtime ::Func ;
2019-11-21 14:00:46 -08:00
use wasmer_wasi ::{ generate_import_object_for_version , get_wasi_version } ;
2019-05-17 12:09:31 -07:00
let wasm_bytes = include_bytes! ( $file ) ;
2020-04-06 17:14:27 -07:00
let backend = $crate ::wasitests ::_common ::get_backend ( ) . expect ( " Please set one of `WASMER_TEST_CRANELIFT`, `WASMER_TEST_LLVM`, or `WASMER_TEST_SINGELPASS` to `1`. " ) ;
2020-04-06 16:47:06 -07:00
let compiler = wasmer_runtime ::compiler_for_backend ( backend ) . expect ( " The desired compiler was not found! " ) ;
2019-05-17 12:09:31 -07:00
2020-04-06 16:47:06 -07:00
let module = wasmer_runtime ::compile_with_config_with ( & wasm_bytes [ .. ] , Default ::default ( ) , & * compiler ) . expect ( " WASM can't be compiled " ) ;
2019-05-17 12:09:31 -07:00
2019-12-06 14:04:30 +01:00
let wasi_version = get_wasi_version ( & module , true ) . expect ( " WASI module " ) ;
2019-11-21 11:30:44 -08:00
let import_object = generate_import_object_for_version (
wasi_version ,
2020-04-01 17:09:51 -07:00
vec! [ $name . into ( ) ] ,
2019-11-21 11:30:44 -08:00
vec! [ ] ,
$po_dir_args ,
$mapdir_args ,
) ;
2019-05-17 12:09:31 -07:00
let instance = module
. instantiate ( & import_object )
. map_err ( | err | format! ( " Can't instantiate the WebAssembly module: {:?} " , err ) )
. unwrap ( ) ; // NOTE: Need to figure what the unwrap is for ??
let capturer = StdioCapturer ::new ( ) ;
let start : Func < ( ) , ( ) > = instance
2020-04-01 17:09:51 -07:00
. exports
. get ( " _start " )
2019-05-17 12:09:31 -07:00
. map_err ( | e | format! ( " {:?} " , e ) )
. expect ( " start function in wasi module " ) ;
2019-05-20 13:55:29 -07:00
start . call ( ) . expect ( " execute the wasm " ) ;
2019-05-17 12:09:31 -07:00
let output = capturer . end ( ) . unwrap ( ) . 0 ;
let expected_output = include_str! ( $expected ) ;
assert! (
output . contains ( expected_output ) ,
" Output: `{}` does not contain expected output: `{}` " ,
output ,
expected_output
) ;
} } ;
}