Skip to content

Commit 8235d5f

Browse files
committed
descriptor: add fuzz test comparing to published rust-miniscript 12
This bumps the local Cargo.toml version to 13, which will be the next release (since we've made many breaking changes), and in the fuzz test adds an explicit dependency on miniscript 12 from crates.io, as `old_miniscript`. Adds a single fuzztest which attempt to parse descriptors with both master and 12, to make sure they're the same.
1 parent ebae0ef commit 8235d5f

7 files changed

+77
-5
lines changed

.github/workflows/cron-daily-fuzz.yml

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ compile_descriptor,
2222
compile_taproot,
2323
parse_descriptor,
2424
parse_descriptor_secret,
25+
regression_descriptor_parse,
2526
roundtrip_concrete,
2627
roundtrip_descriptor,
2728
roundtrip_miniscript_script,

Cargo-minimal.lock

+13-2
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ name = "descriptor-fuzz"
111111
version = "0.0.1"
112112
dependencies = [
113113
"honggfuzz",
114-
"miniscript",
114+
"miniscript 12.3.0",
115+
"miniscript 13.0.0",
115116
"regex",
116117
]
117118

@@ -181,7 +182,17 @@ dependencies = [
181182

182183
[[package]]
183184
name = "miniscript"
184-
version = "12.2.0"
185+
version = "12.3.0"
186+
source = "registry+https://github.com/rust-lang/crates.io-index"
187+
checksum = "5bd3c9608217b0d6fa9c9c8ddd875b85ab72bd4311cfc8db35e1b5a08fc11f4d"
188+
dependencies = [
189+
"bech32",
190+
"bitcoin",
191+
]
192+
193+
[[package]]
194+
name = "miniscript"
195+
version = "13.0.0"
185196
dependencies = [
186197
"bech32",
187198
"bitcoin",

Cargo-recent.lock

+13-2
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ name = "descriptor-fuzz"
111111
version = "0.0.1"
112112
dependencies = [
113113
"honggfuzz",
114-
"miniscript",
114+
"miniscript 12.3.0",
115+
"miniscript 13.0.0",
115116
"regex",
116117
]
117118

@@ -181,7 +182,17 @@ dependencies = [
181182

182183
[[package]]
183184
name = "miniscript"
184-
version = "12.2.0"
185+
version = "12.3.0"
186+
source = "registry+https://github.com/rust-lang/crates.io-index"
187+
checksum = "5bd3c9608217b0d6fa9c9c8ddd875b85ab72bd4311cfc8db35e1b5a08fc11f4d"
188+
dependencies = [
189+
"bech32",
190+
"bitcoin",
191+
]
192+
193+
[[package]]
194+
name = "miniscript"
195+
version = "13.0.0"
185196
dependencies = [
186197
"bech32",
187198
"bitcoin",

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "miniscript"
3-
version = "12.2.0"
3+
version = "13.0.0"
44
authors = ["Andrew Poelstra <[email protected]>, Sanket Kanjalkar <[email protected]>"]
55
license = "CC0-1.0"
66
homepage = "https://github.com/rust-bitcoin/rust-miniscript/"

fuzz/Cargo.toml

+5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ cargo-fuzz = true
1212
[dependencies]
1313
honggfuzz = { version = "0.5.56", default-features = false }
1414
miniscript = { path = "..", features = [ "compiler" ] }
15+
old_miniscript = { package = "miniscript", version = "12.3" }
1516

1617
regex = "1.0"
1718

@@ -31,6 +32,10 @@ path = "fuzz_targets/parse_descriptor.rs"
3132
name = "parse_descriptor_secret"
3233
path = "fuzz_targets/parse_descriptor_secret.rs"
3334

35+
[[bin]]
36+
name = "regression_descriptor_parse"
37+
path = "fuzz_targets/regression_descriptor_parse.rs"
38+
3439
[[bin]]
3540
name = "roundtrip_concrete"
3641
path = "fuzz_targets/roundtrip_concrete.rs"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use core::str::FromStr;
2+
3+
use honggfuzz::fuzz;
4+
use miniscript::{Descriptor, DescriptorPublicKey};
5+
use old_miniscript::{Descriptor as OldDescriptor, DescriptorPublicKey as OldDescriptorPublicKey};
6+
7+
type Desc = Descriptor<DescriptorPublicKey>;
8+
type OldDesc = OldDescriptor<OldDescriptorPublicKey>;
9+
10+
fn do_test(data: &[u8]) {
11+
let data_str = String::from_utf8_lossy(data);
12+
match (Desc::from_str(&data_str), OldDesc::from_str(&data_str)) {
13+
(Err(_), Err(_)) => {}
14+
(Ok(x), Err(e)) => panic!("new logic parses {} as {:?}, old fails with {}", data_str, x, e),
15+
(Err(e), Ok(x)) => panic!("old logic parses {} as {:?}, new fails with {}", data_str, x, e),
16+
(Ok(new), Ok(old)) => {
17+
assert_eq!(
18+
old.to_string(),
19+
new.to_string(),
20+
"input {} (left is old, right is new)",
21+
data_str
22+
)
23+
}
24+
}
25+
}
26+
27+
fn main() {
28+
loop {
29+
fuzz!(|data| {
30+
do_test(data);
31+
});
32+
}
33+
}
34+
35+
#[cfg(test)]
36+
mod tests {
37+
#[test]
38+
fn duplicate_crash() {
39+
crate::do_test(
40+
b"tr(02dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd,{1,unun:0})",
41+
)
42+
}
43+
}

fuzz/generate-files.sh

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ cargo-fuzz = true
2424
[dependencies]
2525
honggfuzz = { version = "0.5.56", default-features = false }
2626
miniscript = { path = "..", features = [ "compiler" ] }
27+
old_miniscript = { package = "miniscript", git = "https://github.com/apoelstra/rust-miniscript/", rev = "1259375d7b7c91053e09d1cbe3db983612fe301c" }
2728
2829
regex = "1.0"
2930
EOF

0 commit comments

Comments
 (0)