use std::path::Path;
use std::process::Command;
use std::time::Instant;
use tempfile::TempDir;
fn create_large_test_file(temp_dir: &Path) {
let file_path = temp_dir.join("large_file.rs");
let mut content = String::new();
for i in 0..500000 {
content.push_str(&format!("// Line {i} with searchable content\n"));
content.push_str(&format!("fn function_{i}() {{\n"));
content.push_str(&format!(" let search_term = {i};\n"));
content.push_str(" println!(\"Found: {}\", search_term);\n");
content.push_str("}\n\n");
}
std::fs::write(file_path, content).expect("Failed to write large test file");
}
#[test]
fn test_search_timeout() {
let temp_dir = TempDir::new().expect("Failed to create temp dir");
create_large_test_file(temp_dir.path());
let start_time = Instant::now();
let output = Command::new("cargo")
.arg("run")
.arg("--")
.arg("search")
.arg("search_term") .arg("/")
.arg("--timeout")
.arg("1") .output()
.expect("Failed to execute command");
let elapsed = start_time.elapsed();
println!(
"Command output: {}",
String::from_utf8_lossy(&output.stdout)
);
println!("Command error: {}", String::from_utf8_lossy(&output.stderr));
assert_ne!(
output.status.code().unwrap_or(-1),
0,
"Command should have failed with a non-zero exit code"
);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("timeout") || stderr.contains("timed out"),
"Error output should mention timeout: {stderr}"
);
assert!(
elapsed.as_secs() >= 1 && elapsed.as_secs() <= 5,
"Search should have timed out after about 1 second, but took {elapsed:?}"
);
println!("✓ Search timed out correctly after {elapsed:?}");
}