1*0f9be3d1SNick Fitzgerald use std::{
2*0f9be3d1SNick Fitzgerald     fmt::{self, Write},
3*0f9be3d1SNick Fitzgerald     sync::atomic::{AtomicU32, Ordering::SeqCst},
4*0f9be3d1SNick Fitzgerald };
5*0f9be3d1SNick Fitzgerald use wasmtime::{Error, Result, error::OutOfMemory, format_err};
6*0f9be3d1SNick Fitzgerald use wasmtime_fuzzing::oom::OomTest;
7*0f9be3d1SNick Fitzgerald 
ok_if_not_oom(error: Error) -> Result<()>8*0f9be3d1SNick Fitzgerald fn ok_if_not_oom(error: Error) -> Result<()> {
9*0f9be3d1SNick Fitzgerald     if error.is::<OutOfMemory>() {
10*0f9be3d1SNick Fitzgerald         Err(error)
11*0f9be3d1SNick Fitzgerald     } else {
12*0f9be3d1SNick Fitzgerald         Ok(())
13*0f9be3d1SNick Fitzgerald     }
14*0f9be3d1SNick Fitzgerald }
15*0f9be3d1SNick Fitzgerald 
16*0f9be3d1SNick Fitzgerald #[test]
error_new() -> Result<()>17*0f9be3d1SNick Fitzgerald fn error_new() -> Result<()> {
18*0f9be3d1SNick Fitzgerald     OomTest::new().test(|| {
19*0f9be3d1SNick Fitzgerald         let error = Error::new(u8::try_from(u32::MAX).unwrap_err());
20*0f9be3d1SNick Fitzgerald         ok_if_not_oom(error)
21*0f9be3d1SNick Fitzgerald     })
22*0f9be3d1SNick Fitzgerald }
23*0f9be3d1SNick Fitzgerald 
24*0f9be3d1SNick Fitzgerald #[test]
error_msg() -> Result<()>25*0f9be3d1SNick Fitzgerald fn error_msg() -> Result<()> {
26*0f9be3d1SNick Fitzgerald     OomTest::new().test(|| {
27*0f9be3d1SNick Fitzgerald         let error = Error::msg("ouch");
28*0f9be3d1SNick Fitzgerald         ok_if_not_oom(error)
29*0f9be3d1SNick Fitzgerald     })
30*0f9be3d1SNick Fitzgerald }
31*0f9be3d1SNick Fitzgerald 
32*0f9be3d1SNick Fitzgerald static X: AtomicU32 = AtomicU32::new(42);
33*0f9be3d1SNick Fitzgerald 
34*0f9be3d1SNick Fitzgerald #[test]
error_fmt() -> Result<()>35*0f9be3d1SNick Fitzgerald fn error_fmt() -> Result<()> {
36*0f9be3d1SNick Fitzgerald     OomTest::new().test(|| {
37*0f9be3d1SNick Fitzgerald         let x = X.load(SeqCst);
38*0f9be3d1SNick Fitzgerald         let error = format_err!("ouch: {x}");
39*0f9be3d1SNick Fitzgerald         ok_if_not_oom(error)
40*0f9be3d1SNick Fitzgerald     })
41*0f9be3d1SNick Fitzgerald }
42*0f9be3d1SNick Fitzgerald 
43*0f9be3d1SNick Fitzgerald #[test]
error_context() -> Result<()>44*0f9be3d1SNick Fitzgerald fn error_context() -> Result<()> {
45*0f9be3d1SNick Fitzgerald     OomTest::new().test(|| {
46*0f9be3d1SNick Fitzgerald         let error = Error::msg("hello");
47*0f9be3d1SNick Fitzgerald         let error = error.context("goodbye");
48*0f9be3d1SNick Fitzgerald         ok_if_not_oom(error)
49*0f9be3d1SNick Fitzgerald     })
50*0f9be3d1SNick Fitzgerald }
51*0f9be3d1SNick Fitzgerald 
52*0f9be3d1SNick Fitzgerald #[test]
error_chain() -> Result<()>53*0f9be3d1SNick Fitzgerald fn error_chain() -> Result<()> {
54*0f9be3d1SNick Fitzgerald     OomTest::new().test(|| {
55*0f9be3d1SNick Fitzgerald         let error = Error::msg("hello");
56*0f9be3d1SNick Fitzgerald         let error = error.context("goodbye");
57*0f9be3d1SNick Fitzgerald         for _ in error.chain() {
58*0f9be3d1SNick Fitzgerald             // Nothing to do here, just exercising the iteration.
59*0f9be3d1SNick Fitzgerald         }
60*0f9be3d1SNick Fitzgerald         ok_if_not_oom(error)
61*0f9be3d1SNick Fitzgerald     })
62*0f9be3d1SNick Fitzgerald }
63*0f9be3d1SNick Fitzgerald 
64*0f9be3d1SNick Fitzgerald struct Null;
65*0f9be3d1SNick Fitzgerald impl Write for Null {
write_str(&mut self, _s: &str) -> fmt::Result66*0f9be3d1SNick Fitzgerald     fn write_str(&mut self, _s: &str) -> fmt::Result {
67*0f9be3d1SNick Fitzgerald         Ok(())
68*0f9be3d1SNick Fitzgerald     }
69*0f9be3d1SNick Fitzgerald }
70*0f9be3d1SNick Fitzgerald 
71*0f9be3d1SNick Fitzgerald #[test]
display_fmt_error() -> Result<()>72*0f9be3d1SNick Fitzgerald fn display_fmt_error() -> Result<()> {
73*0f9be3d1SNick Fitzgerald     OomTest::new().test(|| {
74*0f9be3d1SNick Fitzgerald         let error = Error::msg("hello");
75*0f9be3d1SNick Fitzgerald         let error = error.context("goodbye");
76*0f9be3d1SNick Fitzgerald         write!(&mut Null, "{error}").unwrap();
77*0f9be3d1SNick Fitzgerald         ok_if_not_oom(error)
78*0f9be3d1SNick Fitzgerald     })
79*0f9be3d1SNick Fitzgerald }
80*0f9be3d1SNick Fitzgerald 
81*0f9be3d1SNick Fitzgerald #[test]
alternate_display_fmt_error() -> Result<()>82*0f9be3d1SNick Fitzgerald fn alternate_display_fmt_error() -> Result<()> {
83*0f9be3d1SNick Fitzgerald     OomTest::new().test(|| {
84*0f9be3d1SNick Fitzgerald         let error = Error::msg("hello");
85*0f9be3d1SNick Fitzgerald         let error = error.context("goodbye");
86*0f9be3d1SNick Fitzgerald         write!(&mut Null, "{error:?}").unwrap();
87*0f9be3d1SNick Fitzgerald         ok_if_not_oom(error)
88*0f9be3d1SNick Fitzgerald     })
89*0f9be3d1SNick Fitzgerald }
90*0f9be3d1SNick Fitzgerald 
91*0f9be3d1SNick Fitzgerald #[test]
debug_fmt_error() -> Result<()>92*0f9be3d1SNick Fitzgerald fn debug_fmt_error() -> Result<()> {
93*0f9be3d1SNick Fitzgerald     OomTest::new().test(|| {
94*0f9be3d1SNick Fitzgerald         let error = Error::msg("hello");
95*0f9be3d1SNick Fitzgerald         let error = error.context("goodbye");
96*0f9be3d1SNick Fitzgerald         write!(&mut Null, "{error:?}").unwrap();
97*0f9be3d1SNick Fitzgerald         ok_if_not_oom(error)
98*0f9be3d1SNick Fitzgerald     })
99*0f9be3d1SNick Fitzgerald }
100*0f9be3d1SNick Fitzgerald 
101*0f9be3d1SNick Fitzgerald #[test]
alternate_debug_fmt_error() -> Result<()>102*0f9be3d1SNick Fitzgerald fn alternate_debug_fmt_error() -> Result<()> {
103*0f9be3d1SNick Fitzgerald     OomTest::new().test(|| {
104*0f9be3d1SNick Fitzgerald         let error = Error::msg("hello");
105*0f9be3d1SNick Fitzgerald         let error = error.context("goodbye");
106*0f9be3d1SNick Fitzgerald         write!(&mut Null, "{error:#?}").unwrap();
107*0f9be3d1SNick Fitzgerald         ok_if_not_oom(error)
108*0f9be3d1SNick Fitzgerald     })
109*0f9be3d1SNick Fitzgerald }
110