use keyhog_scanner::testing::{
assignment_keywords_for_test as assignment_keywords, build_generic_re_for_test,
compile_generic_re_for_test, force_generic_re, generic_keyword_alternation_for_test,
generic_re_vendor_suffix_arm, is_strong_keyword_anchored_encoded_text_secret_for_test,
};
use std::collections::BTreeSet;
fn alternation_keyword_set() -> BTreeSet<String> {
let alternation = generic_keyword_alternation_for_test();
let literals = alternation
.strip_suffix(&format!("|{}", generic_re_vendor_suffix_arm()))
.expect("the vendor structural arm is appended last");
literals
.split('|')
.map(|escaped| escaped.replace('\\', ""))
.collect()
}
#[test]
fn generic_re_keyword_set_equals_the_derived_vocabulary() {
let from_regex = alternation_keyword_set();
let derived: BTreeSet<String> = assignment_keywords().iter().cloned().collect();
assert_eq!(
from_regex, derived,
"GENERIC_RE keyword alternation diverged from the derived vocabulary"
);
assert!(
derived.len() >= 40,
"expected the full derived vocab (>=40 spellings), got {}",
derived.len()
);
}
#[test]
fn every_derived_keyword_that_appears_in_the_alternation_is_a_real_vocab_entry() {
let derived: BTreeSet<&str> = assignment_keywords().iter().map(String::as_str).collect();
for keyword in alternation_keyword_set() {
assert!(
derived.contains(keyword.as_str()),
"alternation carries a keyword `{keyword}` not present in the derived vocab"
);
}
}
#[test]
fn every_derived_keyword_captures_its_assigned_value() {
let re = build_generic_re_for_test().expect("GENERIC_RE compiles from the derived vocab");
let value = "Xh8Kd93mZq0Lp2Rt";
for keyword in assignment_keywords() {
let line = format!("{keyword}={value}");
let caps = re
.captures(&line)
.unwrap_or_else(|| panic!("keyword `{keyword}` failed to bridge line `{line}`"));
assert_eq!(
caps.get(1).unwrap().as_str().to_ascii_lowercase(),
keyword.to_ascii_lowercase(),
"keyword capture mismatch for `{keyword}`"
);
assert_eq!(
caps.get(2).unwrap().as_str(),
value,
"value capture mismatch for `{keyword}`"
);
}
}
#[test]
fn shipped_detector_ceiling_captures_long_values_whole_without_prefix_truncation() {
let re = build_generic_re_for_test().expect("detector-owned generic bridge compiles");
let long_value = "aB3dE5fG7hJ9kL2m".repeat(16);
assert_eq!(long_value.len(), 256);
let line = format!("api_key={long_value}");
let captures = re
.captures(&line)
.expect("the shipped 512-byte API-key ceiling admits a 256-byte value");
assert_eq!(captures.get(2).expect("value capture").as_str(), long_value);
let sentinel = "a".repeat(513);
let sentinel_line = format!("api_key={sentinel}");
let sentinel_captures = re
.captures(&sentinel_line)
.expect("one byte beyond the ceiling is captured as the rejection sentinel");
assert_eq!(
sentinel_captures
.get(2)
.expect("sentinel value capture")
.as_str(),
sentinel,
"the rejection sentinel must preserve the whole value"
);
let beyond_sentinel = "a".repeat(514);
assert!(
re.captures(&format!("api_key={beyond_sentinel}")).is_none(),
"a value beyond the sentinel must not yield a truncated 513-byte prefix"
);
}
#[test]
fn vendor_prefixed_key_bridges_via_the_structural_arm() {
let re = build_generic_re_for_test().unwrap();
let caps = re
.captures("stripe_publishable_key = Xh8Kd93mZq0Lp2Rt")
.expect("vendor-prefixed *_key must bridge via the structural arm");
assert_eq!(caps.get(1).unwrap().as_str(), "stripe_publishable_key");
assert_eq!(caps.get(2).unwrap().as_str(), "Xh8Kd93mZq0Lp2Rt");
}
#[test]
fn multi_segment_vendor_secret_captures_the_complete_key_and_padded_value() {
let re = build_generic_re_for_test().expect("GENERIC_RE compiles");
let value = "Y2FsaWNvLW9uLWt1YmUtYXV0aC1rZXk=";
let line = format!("K8S_FULL_SECRET=\"{value}\"");
let caps = re
.captures(&line)
.expect("vendor-prefixed *_secret must bridge");
assert_eq!(
caps.get(1).expect("keyword capture").as_str(),
"K8S_FULL_SECRET"
);
assert_eq!(caps.get(2).expect("value capture").as_str(), value);
assert!(is_strong_keyword_anchored_encoded_text_secret_for_test(
caps.get(1).expect("keyword capture").as_str(),
caps.get(2).expect("value capture").as_str(),
));
}
#[test]
fn a_non_keyword_assignment_does_not_bridge() {
let re = build_generic_re_for_test().unwrap();
assert!(
re.captures("hostname = Xh8Kd93mZq0Lp2Rt").is_none(),
"a non-credential key must not bridge"
);
}
#[test]
fn real_vocabulary_and_detector_ceiling_compile_fail_closed() {
force_generic_re();
assert!(build_generic_re_for_test().is_ok());
}
#[test]
fn a_malformed_alternation_fails_compilation_so_the_lazylock_panics_closed() {
assert!(compile_generic_re_for_test("(?P<broken").is_err());
assert!(compile_generic_re_for_test("secret").is_ok());
}