use rustchain::assert_invariant;
use rustchain::invariant_ppt::*;
use std::path::Path;
#[cfg(test)]
mod security_invariants {
use super::*;
#[test]
pub fn invariant_no_xor_crypto() {
clear_invariant_log();
let crypto_source = std::fs::read_to_string("src/security/encryption.rs")
.expect("encryption.rs must exist");
assert_invariant!(
crypto_source.contains("aes_gcm::") && !crypto_source.contains("XOR"),
"Encryption must use proper AES-GCM from aes_gcm crate, not XOR operations",
Some("security_integrity")
);
}
#[test]
pub fn invariant_sandbox_boundaries() {
clear_invariant_log();
let sandbox_source =
std::fs::read_to_string("src/sandbox/mod.rs").expect("sandbox/mod.rs must exist");
assert_invariant!(
sandbox_source.contains("canonicalize"),
"Sandbox path validation must use canonical path checking",
Some("security_sandbox")
);
assert_invariant!(
sandbox_source.contains("starts_with"),
"Sandbox path validation must use prefix validation",
Some("security_sandbox")
);
let path_validation_code = sandbox_source
.lines()
.skip_while(|line| !line.contains("fn is_path_allowed"))
.take_while(|line| !line.contains("fn ") || line.contains("fn is_path_allowed"))
.collect::<Vec<_>>()
.join("\n");
assert_invariant!(
!path_validation_code.contains("return true;")
|| path_validation_code.contains("if ")
|| path_validation_code.contains("for "),
"Path validation must not have unconditional returns without proper checks",
Some("security_sandbox")
);
assert_invariant!(
sandbox_source.contains("is_path_allowed")
|| sandbox_source.contains("validate_path")
|| sandbox_source.contains("path_allowed"),
"Sandbox must have path validation functions, not just pass-through logic",
Some("security_sandbox")
);
assert_invariant!(
!sandbox_source.contains("../../../") && !sandbox_source.contains("../"),
"Sandbox must not contain hardcoded dangerous path patterns",
Some("security_sandbox")
);
}
#[test]
pub fn invariant_audit_chain_integrity() {
clear_invariant_log();
let audit_source =
std::fs::read_to_string("src/core/audit.rs").expect("audit.rs must exist");
assert_invariant!(
audit_source.contains("Sha256"),
"Audit system must use cryptographic hashing for verification",
Some("security_audit")
);
assert_invariant!(
audit_source.contains("persist")
|| audit_source.contains("save")
|| audit_source.contains("store"),
"Audit system must have persistence methods, not just in-memory storage",
Some("security_audit")
);
assert_invariant!(
audit_source.contains("verify")
|| audit_source.contains("validate")
|| audit_source.contains("check"),
"Audit system must have verification methods for integrity checking",
Some("security_audit")
);
}
}
#[cfg(test)]
mod integrity_invariants {
use super::*;
#[test]
pub fn invariant_no_todo_error_parsing() {
clear_invariant_log();
let cli_handlers =
std::fs::read_to_string("src/cli/handlers/mod.rs").expect("CLI handlers must exist");
assert_invariant!(
!cli_handlers.contains("TODO: parse actual error count"),
"Build dashboard must parse actual error counts, not use TODO placeholder",
Some("implementation_integrity")
);
let test_output =
"test result: ok. 5 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out";
let parts: Vec<&str> = test_output.split(';').collect();
let total = if parts.len() >= 4 {
let passed: u32 = parts[0]
.split_whitespace()
.find(|s| s.parse::<u32>().is_ok())
.unwrap_or("0")
.parse()
.unwrap_or(0);
let failed: u32 = parts[1]
.split_whitespace()
.find(|s| s.parse::<u32>().is_ok())
.unwrap_or("0")
.parse()
.unwrap_or(0);
let ignored: u32 = parts[2]
.split_whitespace()
.find(|s| s.parse::<u32>().is_ok())
.unwrap_or("0")
.parse()
.unwrap_or(0);
passed + failed + ignored
} else {
0
};
assert_invariant!(
total == 7,
"Error parsing must actually work, not return hardcoded values",
Some("implementation_integrity")
);
}
#[test]
pub fn invariant_no_placeholder_cli() {
clear_invariant_log();
let pretty_handlers = std::fs::read_to_string("src/cli/handlers_pretty.rs")
.expect("Pretty handlers must exist");
assert_invariant!(
!pretty_handlers.contains("Placeholder implementations for remaining methods"),
"CLI pretty printing must have real implementations, not placeholders",
Some("implementation_integrity")
);
let test_error = rustchain::core::error::RustChainError::Unknown {
message: "Test error".to_string(),
};
let formatted = format!("{}", test_error);
assert_invariant!(
!formatted.is_empty(),
"Error formatting must produce actual output, not empty strings",
Some("implementation_integrity")
);
}
pub fn invariant_no_simulated_benchmarks() {
clear_invariant_log();
let benchmarks =
std::fs::read_to_string("src/benchmarks/mod.rs").expect("Benchmarks must exist");
assert_invariant!(
!benchmarks.contains("Simulate GitHub Actions runner startup"),
"Benchmarks must measure real performance, not simulate scenarios",
Some("implementation_integrity")
);
assert_invariant!(
!benchmarks.contains("Simulate Jenkins pipeline execution"),
"Benchmarks must measure real performance, not simulate scenarios",
Some("implementation_integrity")
);
assert_invariant!(
benchmarks.contains("measure")
|| benchmarks.contains("time")
|| benchmarks.contains("duration")
|| benchmarks.contains("performance"),
"Benchmarks must contain actual measurement and timing logic",
Some("implementation_integrity")
);
}
}
#[cfg(test)]
mod reliability_invariants {
use super::*;
#[test]
pub fn invariant_no_panic_in_tests() {
clear_invariant_log();
let functional_tests = std::fs::read_to_string("tests/functional_tool_tests.rs")
.expect("Functional tests must exist");
assert_invariant!(
!functional_tests.contains("panic!("),
"Tests must use proper assertions, not panic! calls",
Some("reliability_testing")
);
let tool_registry = rustchain::core::tools::ToolRegistry::new();
let result = tool_registry.get_tool("nonexistent_tool");
assert_invariant!(
result.is_none(),
"Tool registry must return None for nonexistent tools, not panic",
Some("reliability_testing")
);
}
#[test]
pub fn invariant_no_unreachable_assertions() {
clear_invariant_log();
let safety_mod =
std::fs::read_to_string("src/safety/mod.rs").expect("Safety module must exist");
assert_invariant!(
!safety_mod.contains("unreachable!("),
"Production code must handle all possible cases, not use unreachable! assertions",
Some("reliability_error_handling")
);
let validator = rustchain::safety::SafetyValidator::new();
let mission = rustchain::engine::Mission {
version: "1.0".to_string(),
name: "Test Mission".to_string(),
description: None,
steps: vec![rustchain::engine::MissionStep {
id: "test".to_string(),
name: "Test".to_string(),
step_type: rustchain::engine::StepType::CreateFile,
parameters: serde_json::json!({"path": "/tmp/test.txt", "content": "test"}),
depends_on: None,
timeout_seconds: Some(30),
continue_on_error: None,
}],
config: None,
};
let result =
validator.validate_mission(&mission, rustchain::safety::ValidationMode::Standard);
assert_invariant!(
result.is_ok(),
"Safety validation must handle all step types without panicking",
Some("reliability_error_handling")
);
}
}
#[cfg(test)]
mod cross_platform_invariants {
use super::*;
#[test]
pub fn invariant_no_hardcoded_unix_paths() {
clear_invariant_log();
let transpiler_export = std::fs::read_to_string("src/transpiler/export.rs")
.expect("Transpiler export must exist");
assert_invariant!(
!transpiler_export.contains("/tmp/test.txt"),
"Generated workflows must not hardcode Unix /tmp/ paths",
Some("cross_platform_compatibility")
);
let bash_parser =
std::fs::read_to_string("src/transpiler/bash.rs").expect("Bash parser must exist");
assert_invariant!(
!bash_parser.contains("/var/log/app.log"),
"Documentation must not assume Unix /var/log/ paths exist",
Some("cross_platform_compatibility")
);
let test_path = Path::new("/tmp/test.txt");
let components: Vec<_> = test_path.components().collect();
assert_invariant!(
!components.is_empty(),
"Path handling must work on all platforms",
Some("cross_platform_compatibility")
);
}
}
#[cfg(test)]
mod performance_invariants {
use super::*;
pub fn invariant_no_infinite_loops() {
clear_invariant_log();
let engine_source =
std::fs::read_to_string("src/engine/mod.rs").expect("Engine module must exist");
assert_invariant!(
!engine_source.contains("loop {")
|| engine_source.contains("break")
|| engine_source.contains("return"),
"Infinite loops must have proper exit conditions",
Some("performance_bounds")
);
assert_invariant!(
engine_source.contains("timeout") || engine_source.contains("Timeout"),
"Engine must support timeout mechanisms to prevent hangs",
Some("performance_bounds")
);
}
}
#[cfg(test)]
mod compliance_invariants {
}
#[tokio::test]
async fn comprehensive_system_invariant_test() {
start_metrics();
clear_invariant_log();
println!("๐งช RUNNING COMPREHENSIVE SYSTEM INVARIANT TEST");
println!("This test verifies all core properties that must hold for RustChain to be production-ready");
security_invariants::invariant_no_xor_crypto();
security_invariants::invariant_sandbox_boundaries();
security_invariants::invariant_audit_chain_integrity();
integrity_invariants::invariant_no_todo_error_parsing();
integrity_invariants::invariant_no_placeholder_cli();
integrity_invariants::invariant_no_simulated_benchmarks();
reliability_invariants::invariant_no_panic_in_tests();
reliability_invariants::invariant_no_unreachable_assertions();
cross_platform_invariants::invariant_no_hardcoded_unix_paths();
performance_invariants::invariant_no_infinite_loops();
let metrics = finish_metrics();
let log = get_invariant_log();
println!("๐ INVARIANT TEST RESULTS:");
println!(" โ
Invariants logged: {}", metrics.invariants_logged);
println!(" ๐งช Properties tested: {}", metrics.properties_run);
println!(" ๐ Metamorphic runs: {}", metrics.metamorphic_runs);
assert_invariant!(
metrics.invariants_logged >= 20,
"Comprehensive test must verify at least 20 core invariants",
Some("comprehensive_coverage")
);
let critical_failures = log.iter().filter(|r| r.msg.contains("FAILED")).count();
assert_invariant!(
critical_failures == 0,
"No critical invariant failures allowed in comprehensive test",
Some("comprehensive_coverage")
);
println!("๐ฏ COMPREHENSIVE INVARIANT TEST PASSED");
println!("RustChain core invariants verified - system is structurally sound");
}