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