mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-15 23:05:45 +00:00
c2dd5e21a4
* make types within `generate_solution_type` macro explicit Closes #8444. Just changes the parsing logic for that macro; does not change any emitted code. The associated types associated with the macro now require explicit, keyword-style declaration. **Old**: ```rust sp_npos_elections::generate_solution_type!( #[compact] pub struct TestCompact::<VoterIndex, TargetIndex, PerU16>(16) ); ``` **New**: ```rust sp_npos_elections::generate_solution_type!( #[compact] pub struct TestCompact::<VoterIndex = VoterIndex, CandidateIndex = TargetIndex, Accuracy = PerU16>(16) ); ``` * un-ignore doc-tests * use new form in bin/node/runtime/ * rename CandidateIndex -> TargetIndex * add tests demonstrating some potential compile failures
39 lines
1.5 KiB
Rust
39 lines
1.5 KiB
Rust
use honggfuzz::fuzz;
|
|
use sp_npos_elections::generate_solution_type;
|
|
use sp_npos_elections::sp_arithmetic::Percent;
|
|
use sp_runtime::codec::{Encode, Error};
|
|
|
|
fn main() {
|
|
generate_solution_type!(#[compact] pub struct InnerTestSolutionCompact::<
|
|
VoterIndex = u32,
|
|
TargetIndex = u32,
|
|
Accuracy = Percent,
|
|
>(16));
|
|
loop {
|
|
fuzz!(|fuzzer_data: &[u8]| {
|
|
let result_decoded: Result<InnerTestSolutionCompact, Error> =
|
|
<InnerTestSolutionCompact as codec::Decode>::decode(&mut &fuzzer_data[..]);
|
|
// Ignore errors as not every random sequence of bytes can be decoded as InnerTestSolutionCompact
|
|
if let Ok(decoded) = result_decoded {
|
|
// Decoding works, let's re-encode it and compare results.
|
|
let reencoded: std::vec::Vec<u8> = decoded.encode();
|
|
// The reencoded value may or may not be equal to the original fuzzer output. However, the
|
|
// original decoder should be optimal (in the sense that there is no shorter encoding of
|
|
// the same object). So let's see if the fuzzer can find something shorter:
|
|
if fuzzer_data.len() < reencoded.len() {
|
|
panic!("fuzzer_data.len() < reencoded.len()");
|
|
}
|
|
// The reencoded value should definitely be decodable (if unwrap() fails that is a valid
|
|
// panic/finding for the fuzzer):
|
|
let decoded2: InnerTestSolutionCompact =
|
|
<InnerTestSolutionCompact as codec::Decode>::decode(
|
|
&mut reencoded.as_slice(),
|
|
).unwrap();
|
|
// And it should be equal to the original decoded object (resulting from directly
|
|
// decoding fuzzer_data):
|
|
assert_eq!(decoded, decoded2);
|
|
}
|
|
});
|
|
}
|
|
}
|