@@ -175,3 +175,131 @@ where
175
175
}
176
176
}
177
177
}
178
+
179
+ #[ cfg( test) ]
180
+ mod test {
181
+ use std:: {
182
+ io:: { Read , Write } ,
183
+ process:: Command ,
184
+ } ;
185
+
186
+ use tempfile:: NamedTempFile ;
187
+ use wasmer:: { imports, Singlepass , Store , Universal } ;
188
+
189
+ use crate :: {
190
+ cache:: { Cache , CacheOptions } ,
191
+ store:: make_store,
192
+ } ;
193
+
194
+ use super :: * ;
195
+
196
+ pub struct MockEnv { }
197
+
198
+ impl Env for MockEnv {
199
+ fn get_span_size ( & self ) -> i64 {
200
+ 300
201
+ }
202
+ fn get_calldata ( & self ) -> Result < Vec < u8 > , Error > {
203
+ Ok ( vec ! [ 1 ] )
204
+ }
205
+ fn set_return_data ( & self , _: & [ u8 ] ) -> Result < ( ) , Error > {
206
+ Ok ( ( ) )
207
+ }
208
+ fn get_ask_count ( & self ) -> i64 {
209
+ 10
210
+ }
211
+ fn get_min_count ( & self ) -> i64 {
212
+ 8
213
+ }
214
+ fn get_prepare_time ( & self ) -> i64 {
215
+ 100_000
216
+ }
217
+ fn get_execute_time ( & self ) -> Result < i64 , Error > {
218
+ Ok ( 100_000 )
219
+ }
220
+ fn get_ans_count ( & self ) -> Result < i64 , Error > {
221
+ Ok ( 8 )
222
+ }
223
+ fn ask_external_data ( & self , _: i64 , _: i64 , _: & [ u8 ] ) -> Result < ( ) , Error > {
224
+ Ok ( ( ) )
225
+ }
226
+ fn get_external_data_status ( & self , _: i64 , _: i64 ) -> Result < i64 , Error > {
227
+ Ok ( 1 )
228
+ }
229
+ fn get_external_data ( & self , _: i64 , _: i64 ) -> Result < Vec < u8 > , Error > {
230
+ Ok ( vec ! [ 1 ] )
231
+ }
232
+ }
233
+
234
+ fn wat2wasm ( wat : impl AsRef < [ u8 ] > ) -> Vec < u8 > {
235
+ let mut input_file = NamedTempFile :: new ( ) . unwrap ( ) ;
236
+ let mut output_file = NamedTempFile :: new ( ) . unwrap ( ) ;
237
+ input_file. write_all ( wat. as_ref ( ) ) . unwrap ( ) ;
238
+ Command :: new ( "wat2wasm" )
239
+ . args ( & [
240
+ input_file. path ( ) . to_str ( ) . unwrap ( ) ,
241
+ "-o" ,
242
+ output_file. path ( ) . to_str ( ) . unwrap ( ) ,
243
+ ] )
244
+ . output ( )
245
+ . unwrap ( ) ;
246
+ let mut wasm = Vec :: new ( ) ;
247
+ output_file. read_to_end ( & mut wasm) . unwrap ( ) ;
248
+ wasm
249
+ }
250
+
251
+ #[ test]
252
+ fn test_env_vm ( ) {
253
+ let env = Environment :: new ( MockEnv { } ) ;
254
+ assert_eq ! ( 300 , env. with_vm( |vm| vm. env. get_span_size( ) ) ) ;
255
+ assert_eq ! ( 300 , env. with_mut_vm( |vm| vm. env. get_span_size( ) ) ) ;
256
+ }
257
+
258
+ #[ test]
259
+ fn test_env_wasmer_instance ( ) {
260
+ let env = Environment :: new ( MockEnv { } ) ;
261
+ assert_eq ! (
262
+ Error :: UninitializedContextData ,
263
+ env. with_wasmer_instance( |_| { Ok ( ( ) ) } ) . unwrap_err( )
264
+ ) ;
265
+
266
+ let wasm = wat2wasm (
267
+ r#"(module
268
+ (func $execute (export "execute"))
269
+ (func $prepare (export "prepare"))
270
+ )"# ,
271
+ ) ;
272
+ let compiler = Singlepass :: new ( ) ;
273
+ let store = Store :: new ( & Universal :: new ( compiler) . engine ( ) ) ;
274
+ let import_object = imports ! { } ;
275
+ let mut cache = Cache :: new ( CacheOptions { cache_size : 10000 } ) ;
276
+ let instance = cache. get_instance ( & wasm, & store, & import_object) . unwrap ( ) ;
277
+ env. set_wasmer_instance ( Some ( NonNull :: from ( & instance) ) ) ;
278
+ assert_eq ! ( Ok ( ( ) ) , env. with_wasmer_instance( |_| { Ok ( ( ) ) } ) ) ;
279
+ }
280
+
281
+ #[ test]
282
+ fn test_env_gas ( ) {
283
+ let env = Environment :: new ( MockEnv { } ) ;
284
+ let wasm = wat2wasm (
285
+ r#"(module
286
+ (func $execute (export "execute"))
287
+ (func $prepare (export "prepare"))
288
+ )"# ,
289
+ ) ;
290
+ let store = make_store ( ) ;
291
+ let import_object = imports ! { } ;
292
+ let mut cache = Cache :: new ( CacheOptions { cache_size : 10000 } ) ;
293
+ let instance = cache. get_instance ( & wasm, & store, & import_object) . unwrap ( ) ;
294
+ env. set_wasmer_instance ( Some ( NonNull :: from ( & instance) ) ) ;
295
+
296
+ assert_eq ! ( 0 , env. get_gas_left( ) ) ;
297
+
298
+ env. set_gas_left ( 10 ) ;
299
+ assert_eq ! ( 10 , env. get_gas_left( ) ) ;
300
+
301
+ assert_eq ! ( Error :: OutOfGasError , env. decrease_gas_left( 11 ) . unwrap_err( ) ) ;
302
+ assert_eq ! ( Ok ( ( ) ) , env. decrease_gas_left( 3 ) ) ;
303
+ assert_eq ! ( 7 , env. get_gas_left( ) ) ;
304
+ }
305
+ }
0 commit comments