//! Tests for find/search operations. use assert_cmd::Command; use predicates::prelude::*; use serial_test::serial; #[macro_use] mod common; use common::{ensure_test_project, DaemonTestHarness}; const TEST_PROJECT: &str = "find-test"; const TEST_PROGRAM: &str = "sample_binary"; #[test] #[serial] fn test_find_string() { require_ghidra!(); ensure_test_project(TEST_PROJECT, TEST_PROGRAM); let harness = DaemonTestHarness::new(TEST_PROJECT, TEST_PROGRAM).expect("Failed to start daemon"); Command::cargo_bin("ghidra") .unwrap() .arg("find") .arg("string") .arg("test") .arg("--project") .arg(TEST_PROJECT) .arg("--program") .arg(TEST_PROGRAM) .assert() .success(); drop(harness); } #[test] #[serial] fn test_find_bytes() { require_ghidra!(); ensure_test_project(TEST_PROJECT, TEST_PROGRAM); let harness = DaemonTestHarness::new(TEST_PROJECT, TEST_PROGRAM).expect("Failed to start daemon"); Command::cargo_bin("ghidra") .unwrap() .arg("find") .arg("bytes") .arg("4883ec08") .arg("--project") .arg(TEST_PROJECT) .arg("--program") .arg(TEST_PROGRAM) .assert() .success(); drop(harness); } #[test] #[serial] fn test_find_function() { require_ghidra!(); ensure_test_project(TEST_PROJECT, TEST_PROGRAM); let harness = DaemonTestHarness::new(TEST_PROJECT, TEST_PROGRAM).expect("Failed to start daemon"); Command::cargo_bin("ghidra") .unwrap() .arg("find") .arg("function") .arg("main") .arg("--project") .arg(TEST_PROJECT) .arg("--program") .arg(TEST_PROGRAM) .assert() .success() .stdout(predicate::str::contains("main")); drop(harness); } #[test] #[serial] fn test_find_function_glob() { require_ghidra!(); ensure_test_project(TEST_PROJECT, TEST_PROGRAM); let harness = DaemonTestHarness::new(TEST_PROJECT, TEST_PROGRAM).expect("Failed to start daemon"); Command::cargo_bin("ghidra") .unwrap() .arg("find") .arg("function") .arg("m*") .arg("--project") .arg(TEST_PROJECT) .arg("--program") .arg(TEST_PROGRAM) .assert() .success() .stdout(predicate::str::contains("main")); drop(harness); } #[test] #[serial] fn test_find_calls() { require_ghidra!(); ensure_test_project(TEST_PROJECT, TEST_PROGRAM); let harness = DaemonTestHarness::new(TEST_PROJECT, TEST_PROGRAM).expect("Failed to start daemon"); // Use add_numbers which exists in the sample binary Command::cargo_bin("ghidra") .unwrap() .arg("find") .arg("calls") .arg("add_numbers") .arg("--project") .arg(TEST_PROJECT) .arg("--program") .arg(TEST_PROGRAM) .assert() .success(); drop(harness); } #[test] #[serial] fn test_find_crypto() { require_ghidra!(); ensure_test_project(TEST_PROJECT, TEST_PROGRAM); let harness = DaemonTestHarness::new(TEST_PROJECT, TEST_PROGRAM).expect("Failed to start daemon"); Command::cargo_bin("ghidra") .unwrap() .arg("find") .arg("crypto") .arg("--project") .arg(TEST_PROJECT) .arg("--program") .arg(TEST_PROGRAM) .assert() .success(); drop(harness); } #[test] #[serial] fn test_find_interesting() { require_ghidra!(); ensure_test_project(TEST_PROJECT, TEST_PROGRAM); let harness = DaemonTestHarness::new(TEST_PROJECT, TEST_PROGRAM).expect("Failed to start daemon"); Command::cargo_bin("ghidra") .unwrap() .arg("find") .arg("interesting") .arg("--project") .arg(TEST_PROJECT) .arg("--program") .arg(TEST_PROGRAM) .assert() .success(); drop(harness); } #[test] #[serial] fn test_find_string_no_matches() { require_ghidra!(); ensure_test_project(TEST_PROJECT, TEST_PROGRAM); let harness = DaemonTestHarness::new(TEST_PROJECT, TEST_PROGRAM).expect("Failed to start daemon"); Command::cargo_bin("ghidra") .unwrap() .arg("find") .arg("string") .arg("nonexistent_string_xyz123") .arg("--project") .arg(TEST_PROJECT) .arg("--program") .arg(TEST_PROGRAM) .assert() .success(); drop(harness); }