#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod property_tests {
use proptest::prelude::*;
proptest! {
#[test]
fn basic_property_stability(_input in ".*") {
prop_assert!(true);
}
#[test]
fn module_consistency_check(_x in 0u32..1000) {
prop_assert!(_x < 1001);
}
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod coverage_tests {
use super::*;
fn minimal_wasm_module() -> Vec<u8> {
vec![
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, ]
}
fn simple_function_wasm() -> Vec<u8> {
vec![
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x05, 0x01, 0x60, 0x00, 0x01, 0x7f, 0x03, 0x02, 0x01, 0x00, 0x0a, 0x09, 0x01, 0x07, 0x00, 0x41, 0x01, 0x41, 0x02, 0x6a, 0x0b, ]
}
fn memory_load_wasm() -> Vec<u8> {
vec![
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x05, 0x01, 0x60, 0x00, 0x01, 0x7f, 0x03, 0x02, 0x01, 0x00, 0x05, 0x03, 0x01, 0x00, 0x01, 0x0a, 0x09, 0x01, 0x07, 0x00, 0x41, 0x00, 0x28, 0x02, 0x00, 0x0b, ]
}
fn memory_store_wasm() -> Vec<u8> {
vec![
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0x05, 0x03, 0x01, 0x00, 0x01, 0x0a, 0x0b, 0x01, 0x09, 0x00, 0x41, 0x00, 0x41, 0x2a, 0x36, 0x02, 0x00, 0x0b, ]
}
#[test]
fn test_incremental_verifier_new() {
let verifier = IncrementalVerifier::new();
assert!(verifier.is_ok());
}
#[test]
fn test_verify_minimal_module() {
let verifier = IncrementalVerifier::new().unwrap();
let result = verifier.verify_module(&minimal_wasm_module());
assert!(result.is_ok());
assert!(result.unwrap().is_safe());
}
#[test]
fn test_verify_simple_function() {
let verifier = IncrementalVerifier::new().unwrap();
let result = verifier.verify_module(&simple_function_wasm());
assert!(result.is_ok());
assert!(result.unwrap().is_safe());
}
#[test]
fn test_verify_memory_load() {
let verifier = IncrementalVerifier::new().unwrap();
let result = verifier.verify_module(&memory_load_wasm());
assert!(result.is_ok());
}
#[test]
fn test_verify_memory_store() {
let verifier = IncrementalVerifier::new().unwrap();
let result = verifier.verify_module(&memory_store_wasm());
assert!(result.is_ok());
}
#[test]
fn test_verify_invalid_wasm() {
let verifier = IncrementalVerifier::new().unwrap();
let invalid_wasm = vec![0x00, 0x01, 0x02, 0x03]; let result = verifier.verify_module(&invalid_wasm);
assert!(result.is_err());
}
#[test]
fn test_verify_empty_input() {
let verifier = IncrementalVerifier::new().unwrap();
let result = verifier.verify_module(&[]);
assert!(result.is_err());
}
#[test]
fn test_verification_result_safe_is_safe() {
let result = VerificationResult::Safe;
assert!(result.is_safe());
}
#[test]
fn test_verification_result_out_of_bounds_not_safe() {
let result = VerificationResult::OutOfBounds {
offset: 100,
size: 50,
};
assert!(!result.is_safe());
}
#[test]
fn test_verification_result_type_error_not_safe() {
let result = VerificationResult::TypeError {
expected: "i32".to_string(),
found: Some("i64".to_string()),
};
assert!(!result.is_safe());
}
#[test]
fn test_verification_result_type_error_none_found() {
let result = VerificationResult::TypeError {
expected: "i32".to_string(),
found: None,
};
assert!(!result.is_safe());
}
#[test]
fn test_verification_result_stack_underflow_not_safe() {
let result = VerificationResult::StackUnderflow;
assert!(!result.is_safe());
}
#[test]
fn test_verification_result_stack_overflow_not_safe() {
let result = VerificationResult::StackOverflow;
assert!(!result.is_safe());
}
#[test]
fn test_verification_result_invalid_indirect_call_not_safe() {
let result = VerificationResult::InvalidIndirectCall;
assert!(!result.is_safe());
}
#[test]
fn test_verification_result_integer_overflow_not_safe() {
let result = VerificationResult::IntegerOverflow;
assert!(!result.is_safe());
}
#[test]
fn test_verification_result_serialization() {
let result = VerificationResult::Safe;
let serialized = serde_json::to_string(&result).unwrap();
let deserialized: VerificationResult = serde_json::from_str(&serialized).unwrap();
assert_eq!(result, deserialized);
}
#[test]
fn test_verification_result_out_of_bounds_serialization() {
let result = VerificationResult::OutOfBounds {
offset: 1000,
size: 65536,
};
let serialized = serde_json::to_string(&result).unwrap();
let deserialized: VerificationResult = serde_json::from_str(&serialized).unwrap();
assert_eq!(result, deserialized);
}
#[test]
fn test_differential_tester_new() {
let tester = DifferentialTester::new();
assert!(std::mem::size_of_val(&tester) > 0);
}
#[test]
fn test_differential_tester_default() {
let tester = DifferentialTester::default();
assert!(std::mem::size_of_val(&tester) > 0);
}
#[test]
fn test_generate_test_cases_zero() {
let mut tester = DifferentialTester::new();
let cases = tester.generate_test_cases(&minimal_wasm_module(), 0);
assert!(cases.is_empty());
}
#[test]
fn test_generate_test_cases_multiple() {
let mut tester = DifferentialTester::new();
let cases = tester.generate_test_cases(&minimal_wasm_module(), 5);
assert_eq!(cases.len(), 5);
}
#[test]
fn test_generate_test_cases_values() {
let mut tester = DifferentialTester::new();
let cases = tester.generate_test_cases(&minimal_wasm_module(), 3);
assert_eq!(cases[0].inputs, vec![0, 0]);
assert_eq!(cases[1].inputs, vec![1, 2]);
assert_eq!(cases[2].inputs, vec![2, 4]);
for case in &cases {
assert!(case.expected_output.is_none());
}
}
#[test]
fn test_differential_test_consistent() {
let tester = DifferentialTester::new();
let result = tester.differential_test(&minimal_wasm_module());
assert_eq!(result, DifferentialResult::Consistent);
}
#[test]
fn test_test_case_equality() {
let case1 = TestCase {
inputs: vec![1, 2, 3],
expected_output: Some(vec![6]),
};
let case2 = TestCase {
inputs: vec![1, 2, 3],
expected_output: Some(vec![6]),
};
assert_eq!(case1, case2);
}
#[test]
fn test_test_case_inequality() {
let case1 = TestCase {
inputs: vec![1, 2, 3],
expected_output: Some(vec![6]),
};
let case2 = TestCase {
inputs: vec![1, 2, 4],
expected_output: Some(vec![6]),
};
assert_ne!(case1, case2);
}
#[test]
fn test_test_case_clone() {
let case = TestCase {
inputs: vec![1, 2, 3],
expected_output: Some(vec![6]),
};
let cloned = case.clone();
assert_eq!(case, cloned);
}
#[test]
fn test_differential_result_consistent() {
let result = DifferentialResult::Consistent;
assert_eq!(result, DifferentialResult::Consistent);
}
#[test]
fn test_differential_result_divergence() {
let result = DifferentialResult::Divergence {
test_case: TestCase {
inputs: vec![1],
expected_output: None,
},
runtime1_result: vec![1],
runtime2_result: vec![2],
};
assert!(matches!(result, DifferentialResult::Divergence { .. }));
}
#[test]
fn test_differential_result_clone() {
let result = DifferentialResult::Consistent;
let cloned = result.clone();
assert_eq!(result, cloned);
}
#[test]
fn test_invariant_checker_new() {
let checker = InvariantChecker::new();
assert_eq!(checker.invariants.len(), 4);
}
}