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 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] 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] 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] 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] 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] 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 { 66 fn write_str(&mut self, _s: &str) -> fmt::Result { 67 Ok(()) 68 } 69 } 70 71 #[test] 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] 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] 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] 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