1 #![cfg(arc_try_new)]
2 
3 use std::iter;
4 use wasmtime::{Config, Engine, FuncType, Result, ValType};
5 use wasmtime_fuzzing::oom::OomTest;
6 
7 #[test]
func_type_try_new() -> Result<()>8 fn func_type_try_new() -> Result<()> {
9     let mut config = Config::new();
10     config.enable_compiler(false);
11     let engine = Engine::new(&config)?;
12 
13     // Run this OOM test a few times to make sure that we leave the engine's
14     // type registry in a good state when failing to register new types.
15     for i in 1..6 {
16         OomTest::new().test(|| {
17             let ty1 = FuncType::try_new(
18                 &engine,
19                 iter::repeat(ValType::ANYREF).take(i),
20                 iter::repeat(ValType::ANYREF).take(i),
21             )?;
22             assert_eq!(ty1.params().len(), i);
23             assert_eq!(ty1.results().len(), i);
24 
25             let ty2 = FuncType::try_new(
26                 &engine,
27                 iter::repeat(ValType::ANYREF).take(i),
28                 iter::repeat(ValType::ANYREF).take(i),
29             )?;
30             assert_eq!(ty2.params().len(), i);
31             assert_eq!(ty2.results().len(), i);
32 
33             let ty3 = FuncType::try_new(&engine, [], [])?;
34             assert_eq!(ty3.params().len(), 0);
35             assert_eq!(ty3.results().len(), 0);
36 
37             assert!(
38                 !FuncType::eq(&ty2, &ty3),
39                 "{ty2:?} should not be equal to {ty3:?}"
40             );
41 
42             Ok(())
43         })?;
44     }
45 
46     Ok(())
47 }
48