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