|
| 1 | +use descriptor_fuzz::FuzzPk; |
| 2 | +use honggfuzz::fuzz; |
| 3 | +use miniscript::{policy, ParseError, ParseNumError}; |
| 4 | +use old_miniscript::policy as old_policy; |
| 5 | + |
| 6 | +type Policy = policy::Concrete<FuzzPk>; |
| 7 | +type OldPolicy = old_policy::Concrete<FuzzPk>; |
| 8 | + |
| 9 | +fn do_test(data: &[u8]) { |
| 10 | + let data_str = String::from_utf8_lossy(data); |
| 11 | + match (data_str.parse::<Policy>(), data_str.parse::<OldPolicy>()) { |
| 12 | + (Err(_), Err(_)) => {} |
| 13 | + (Ok(x), Err(e)) => panic!("new logic parses {} as {:?}, old fails with {}", data_str, x, e), |
| 14 | + // These is anew parse error |
| 15 | + ( |
| 16 | + Err(miniscript::Error::Parse(ParseError::Num(ParseNumError::IllegalZero { .. }))), |
| 17 | + Ok(_), |
| 18 | + ) => {} |
| 19 | + (Err(e), Ok(x)) => { |
| 20 | + panic!("old logic parses {} as {:?}, new fails with {:?}", data_str, x, e) |
| 21 | + } |
| 22 | + (Ok(new), Ok(old)) => { |
| 23 | + assert_eq!( |
| 24 | + old.to_string(), |
| 25 | + new.to_string(), |
| 26 | + "input {} (left is old, right is new)", |
| 27 | + data_str |
| 28 | + ); |
| 29 | + |
| 30 | + let comp = new.compile::<miniscript::Legacy>(); |
| 31 | + let old_comp = old.compile::<old_miniscript::Legacy>(); |
| 32 | + |
| 33 | + match (comp, old_comp) { |
| 34 | + (Err(_), Err(_)) => {} |
| 35 | + (Ok(x), Err(e)) => { |
| 36 | + panic!("new logic compiles {} as {:?}, old fails with {}", data_str, x, e) |
| 37 | + } |
| 38 | + (Err(e), Ok(x)) => { |
| 39 | + panic!("old logic compiles {} as {:?}, new fails with {}", data_str, x, e) |
| 40 | + } |
| 41 | + (Ok(new), Ok(old)) => { |
| 42 | + assert_eq!( |
| 43 | + old.to_string(), |
| 44 | + new.to_string(), |
| 45 | + "input {} (left is old, right is new)", |
| 46 | + data_str |
| 47 | + ); |
| 48 | + } |
| 49 | + } |
| 50 | + } |
| 51 | + } |
| 52 | +} |
| 53 | + |
| 54 | +fn main() { |
| 55 | + loop { |
| 56 | + fuzz!(|data| { |
| 57 | + do_test(data); |
| 58 | + }); |
| 59 | + } |
| 60 | +} |
| 61 | + |
| 62 | +#[cfg(test)] |
| 63 | +mod tests { |
| 64 | + #[test] |
| 65 | + fn duplicate_crash() { crate::do_test(b"or(0@pk(09),0@TRIVIAL)") } |
| 66 | +} |
0 commit comments