use bytecode_verifier::SignatureChecker;
use invalid_mutations::signature::{
ApplySignatureDoubleRefContext, ApplySignatureFieldRefContext, DoubleRefMutation,
FieldRefMutation,
};
use proptest::{collection::vec, prelude::*};
use solana_libra_bytecode_verifier as bytecode_verifier;
use vm::{errors::VMStaticViolation, file_format::CompiledModule};
proptest! {
#[test]
fn valid_signatures(module in CompiledModule::valid_strategy(20)) {
let signature_checker = SignatureChecker::new(&module);
prop_assert_eq!(signature_checker.verify(), vec![]);
}
#[test]
fn double_refs(
module in CompiledModule::valid_strategy(20),
mutations in vec(DoubleRefMutation::strategy(), 0..40),
) {
let mut module = module.into_inner();
let mut expected_violations = {
let context = ApplySignatureDoubleRefContext::new(&mut module, mutations);
context.apply()
};
expected_violations.sort();
let module = module.freeze().expect("should satisfy bounds checker");
let signature_checker = SignatureChecker::new(&module);
let actual_violations = signature_checker.verify();
let mut actual_violations: Vec<_> = actual_violations
.into_iter()
.filter(|err| match &err.err {
VMStaticViolation::InvalidFieldDefReference(..) => false,
_ => true,
})
.collect();
actual_violations.sort();
prop_assert_eq!(expected_violations, actual_violations);
}
#[test]
fn field_def_references(
module in CompiledModule::valid_strategy(20),
mutations in vec(FieldRefMutation::strategy(), 0..40),
) {
let mut module = module.into_inner();
let mut expected_violations = {
let context = ApplySignatureFieldRefContext::new(&mut module, mutations);
context.apply()
};
expected_violations.sort();
let module = module.freeze().expect("should satisfy bounds checker");
let signature_checker = SignatureChecker::new(&module);
let mut actual_violations = signature_checker.verify();
actual_violations.sort();
prop_assert_eq!(expected_violations, actual_violations);
}
}