pub const AC_ZEROGATE_FORBIDDEN_PHRASES: [&str; 4] = [
"feature not enabled",
"requires --features",
"enable the",
"compile with --features",
];
pub const AC_ZEROGATE_REQUIRED_DEFAULT_FEATURES: [&str; 2] = ["inference", "training"];
pub const AC_ZEROGATE_FORBIDDEN_DEFAULT_FEATURES: [&str; 2] = ["cuda", "code"];
pub const AC_ZEROGATE_GPU_ERROR_KEYWORDS: [&str; 4] =
["cuda", "gpu not found", "gpu missing", "no gpu"];
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HelpResponseVerdict {
Pass,
Fail,
}
#[must_use]
pub fn verdict_from_help_response(help_results: &[(&str, i32)]) -> HelpResponseVerdict {
if help_results.is_empty() {
return HelpResponseVerdict::Fail;
}
for (_cmd, exit) in help_results {
if *exit != 0 {
return HelpResponseVerdict::Fail;
}
}
HelpResponseVerdict::Pass
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NoFeatureGateErrorVerdict {
Pass,
Fail,
}
#[must_use]
pub fn verdict_from_no_feature_gate_error(combined_output: &str) -> NoFeatureGateErrorVerdict {
let lower = combined_output.to_lowercase();
for phrase in AC_ZEROGATE_FORBIDDEN_PHRASES {
if lower.contains(phrase) {
return NoFeatureGateErrorVerdict::Fail;
}
}
NoFeatureGateErrorVerdict::Pass
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GpuFallbackVerdict {
Pass,
Fail,
}
#[must_use]
pub fn verdict_from_gpu_fallback(combined_output: &str) -> GpuFallbackVerdict {
let lower = combined_output.to_lowercase();
for kw in AC_ZEROGATE_GPU_ERROR_KEYWORDS {
if lower.contains(kw) {
return GpuFallbackVerdict::Fail;
}
}
GpuFallbackVerdict::Pass
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DefaultFeaturesVerdict {
Pass,
Fail,
}
#[must_use]
pub fn verdict_from_default_features(default_features: &[&str]) -> DefaultFeaturesVerdict {
use std::collections::HashSet;
let set: HashSet<&&str> = default_features.iter().collect();
for required in AC_ZEROGATE_REQUIRED_DEFAULT_FEATURES {
if !set.contains(&required) {
return DefaultFeaturesVerdict::Fail;
}
}
for forbidden in AC_ZEROGATE_FORBIDDEN_DEFAULT_FEATURES {
if set.contains(&forbidden) {
return DefaultFeaturesVerdict::Fail;
}
}
DefaultFeaturesVerdict::Pass
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn provenance_forbidden_phrases_count_4() {
assert_eq!(AC_ZEROGATE_FORBIDDEN_PHRASES.len(), 4);
}
#[test]
fn provenance_required_features_count_2() {
assert_eq!(AC_ZEROGATE_REQUIRED_DEFAULT_FEATURES.len(), 2);
}
#[test]
fn provenance_forbidden_features_count_2() {
assert_eq!(AC_ZEROGATE_FORBIDDEN_DEFAULT_FEATURES.len(), 2);
}
#[test]
fn provenance_required_forbidden_disjoint() {
for r in AC_ZEROGATE_REQUIRED_DEFAULT_FEATURES {
assert!(!AC_ZEROGATE_FORBIDDEN_DEFAULT_FEATURES.contains(&r));
}
}
#[test]
fn fz001_pass_all_commands_zero() {
let r = [("run", 0), ("serve", 0), ("chat", 0), ("finetune", 0)];
assert_eq!(verdict_from_help_response(&r), HelpResponseVerdict::Pass);
}
#[test]
fn fz001_fail_one_command_nonzero() {
let r = [("run", 0), ("finetune", 1)];
assert_eq!(verdict_from_help_response(&r), HelpResponseVerdict::Fail);
}
#[test]
fn fz001_fail_panic_exit() {
let r = [("run", 0), ("profile", 101)];
assert_eq!(verdict_from_help_response(&r), HelpResponseVerdict::Fail);
}
#[test]
fn fz001_fail_empty() {
let r: [(&str, i32); 0] = [];
assert_eq!(verdict_from_help_response(&r), HelpResponseVerdict::Fail);
}
#[test]
fn fz002_pass_clean_output() {
let out = "Usage: apr run [OPTIONS] <MODEL>\n\nOptions:\n --json Emit JSON";
assert_eq!(
verdict_from_no_feature_gate_error(out),
NoFeatureGateErrorVerdict::Pass
);
}
#[test]
fn fz002_fail_feature_not_enabled() {
let out = "Error: feature not enabled — recompile with --features inference";
assert_eq!(
verdict_from_no_feature_gate_error(out),
NoFeatureGateErrorVerdict::Fail
);
}
#[test]
fn fz002_fail_requires_features() {
let out = "This command requires --features cuda";
assert_eq!(
verdict_from_no_feature_gate_error(out),
NoFeatureGateErrorVerdict::Fail
);
}
#[test]
fn fz002_fail_compile_with_features() {
let out = "compile with --features training";
assert_eq!(
verdict_from_no_feature_gate_error(out),
NoFeatureGateErrorVerdict::Fail
);
}
#[test]
fn fz002_fail_enable_the_feature() {
let out = "enable the inference feature";
assert_eq!(
verdict_from_no_feature_gate_error(out),
NoFeatureGateErrorVerdict::Fail
);
}
#[test]
fn fz003_pass_clean_cpu_fallback() {
let out = "Running on CPU SIMD backend";
assert_eq!(verdict_from_gpu_fallback(out), GpuFallbackVerdict::Pass);
}
#[test]
fn fz003_pass_invalid_model_error() {
let out = "Error: invalid model file at /dev/null";
assert_eq!(verdict_from_gpu_fallback(out), GpuFallbackVerdict::Pass);
}
#[test]
fn fz003_fail_cuda_error() {
let out = "Error: CUDA driver not available";
assert_eq!(verdict_from_gpu_fallback(out), GpuFallbackVerdict::Fail);
}
#[test]
fn fz003_fail_gpu_not_found() {
let out = "Error: GPU not found";
assert_eq!(verdict_from_gpu_fallback(out), GpuFallbackVerdict::Fail);
}
#[test]
fn fz003_fail_no_gpu_error() {
let out = "Error: No GPU detected, refusing to run";
assert_eq!(verdict_from_gpu_fallback(out), GpuFallbackVerdict::Fail);
}
#[test]
fn fz004_pass_canonical_defaults() {
let f = [
"hf-hub",
"safetensors-compare",
"inference",
"training",
"visualization",
"zram",
];
assert_eq!(verdict_from_default_features(&f), DefaultFeaturesVerdict::Pass);
}
#[test]
fn fz004_pass_minimal_required() {
let f = ["inference", "training"];
assert_eq!(verdict_from_default_features(&f), DefaultFeaturesVerdict::Pass);
}
#[test]
fn fz004_fail_missing_inference() {
let f = ["training", "visualization"];
assert_eq!(verdict_from_default_features(&f), DefaultFeaturesVerdict::Fail);
}
#[test]
fn fz004_fail_missing_training() {
let f = ["inference", "visualization"];
assert_eq!(verdict_from_default_features(&f), DefaultFeaturesVerdict::Fail);
}
#[test]
fn fz004_fail_cuda_in_default() {
let f = ["inference", "training", "cuda"];
assert_eq!(verdict_from_default_features(&f), DefaultFeaturesVerdict::Fail);
}
#[test]
fn fz004_fail_code_in_default() {
let f = ["inference", "training", "code"];
assert_eq!(verdict_from_default_features(&f), DefaultFeaturesVerdict::Fail);
}
#[test]
fn fz004_fail_empty_default() {
let f: [&str; 0] = [];
assert_eq!(verdict_from_default_features(&f), DefaultFeaturesVerdict::Fail);
}
#[test]
fn realistic_healthy_install_passes_all_4() {
let cmds = [
("run", 0), ("serve", 0), ("chat", 0), ("finetune", 0),
("train", 0), ("distill", 0), ("profile", 0), ("trace", 0),
];
assert_eq!(verdict_from_help_response(&cmds), HelpResponseVerdict::Pass);
let clean_help = "Usage: apr run [OPTIONS] <MODEL>\n\nOptions:\n --no-gpu";
assert_eq!(
verdict_from_no_feature_gate_error(clean_help),
NoFeatureGateErrorVerdict::Pass
);
let cpu_run = "Backend: CPU SIMD (AVX2)\nGenerating...";
assert_eq!(verdict_from_gpu_fallback(cpu_run), GpuFallbackVerdict::Pass);
let canonical = [
"hf-hub", "safetensors-compare", "inference", "training",
"visualization", "zram",
];
assert_eq!(verdict_from_default_features(&canonical), DefaultFeaturesVerdict::Pass);
}
#[test]
fn realistic_pre_fix_all_4_failures() {
let bad = [("finetune", 1)];
assert_eq!(verdict_from_help_response(&bad), HelpResponseVerdict::Fail);
let bad_help = "Error: feature not enabled, requires --features inference";
assert_eq!(
verdict_from_no_feature_gate_error(bad_help),
NoFeatureGateErrorVerdict::Fail
);
let bad_run = "Error: CUDA driver not loaded";
assert_eq!(verdict_from_gpu_fallback(bad_run), GpuFallbackVerdict::Fail);
let bad_features = ["inference", "training", "cuda"];
assert_eq!(
verdict_from_default_features(&bad_features),
DefaultFeaturesVerdict::Fail
);
}
}