fix: add --project/--program to BatchArgs and fix arg order in tests

BatchArgs was missing --project and --program fields, so batch commands
couldn't specify which project to use. Also fixed argument ordering in
all test files to place --project/--program after the subcommand name,
matching clap's per-subcommand argument parsing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Alexander Kiselev
2026-02-05 13:19:16 -08:00
co-authored by Claude Opus 4.6
parent 1e0837dd31
commit ae2d882f26
14 changed files with 108 additions and 100 deletions
+5 -5
View File
@@ -39,9 +39,9 @@ query --function main
Command::cargo_bin("ghidra")
.unwrap()
.arg("batch")
.arg("--project")
.arg(TEST_PROJECT)
.arg("batch")
.arg(batch_file.to_str().unwrap())
.assert()
.success()
@@ -72,9 +72,9 @@ fn test_batch_empty_file() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("batch")
.arg("--project")
.arg(TEST_PROJECT)
.arg("batch")
.arg(batch_file.to_str().unwrap())
.assert()
.success()
@@ -105,9 +105,9 @@ query --address 0x100000
Command::cargo_bin("ghidra")
.unwrap()
.arg("batch")
.arg("--project")
.arg(TEST_PROJECT)
.arg("batch")
.arg(batch_file.to_str().unwrap())
.assert()
.success()
@@ -129,9 +129,9 @@ fn test_batch_invalid_file() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("batch")
.arg("--project")
.arg(TEST_PROJECT)
.arg("batch")
.arg("/nonexistent/batch/file.txt")
.assert()
.failure()
@@ -159,9 +159,9 @@ query --address 0x100000
Command::cargo_bin("ghidra")
.unwrap()
.arg("batch")
.arg("--project")
.arg(TEST_PROJECT)
.arg("batch")
.arg(batch_file.to_str().unwrap())
.assert()
.success()
+12 -12
View File
@@ -24,12 +24,12 @@ fn test_comment_set_and_get() {
// Note: ELF entry is 0x18910, but Ghidra loads with base 0x100000
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("comment")
.arg("set")
.arg("0x00118910")
.arg("test comment from integration test")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -38,11 +38,11 @@ fn test_comment_set_and_get() {
// Get the comment back
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("comment")
.arg("get")
.arg("0x00118910")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -63,12 +63,12 @@ fn test_comment_list() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("comment")
.arg("set")
.arg("0x00118920") // Within executable range (Ghidra address space)
.arg("another comment")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -76,10 +76,10 @@ fn test_comment_list() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("comment")
.arg("list")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -100,12 +100,12 @@ fn test_comment_delete() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("comment")
.arg("set")
.arg("0x00118930") // Within executable range (Ghidra address space)
.arg("to be deleted")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -113,11 +113,11 @@ fn test_comment_delete() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("comment")
.arg("delete")
.arg("0x00118930") // Within executable range (Ghidra address space)
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
+10 -10
View File
@@ -23,9 +23,9 @@ fn test_daemon_start() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("status")
.arg("--project")
.arg(TEST_PROJECT)
.arg("status")
.assert()
.success();
@@ -44,9 +44,9 @@ fn test_daemon_status() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("status")
.arg("--project")
.arg(TEST_PROJECT)
.arg("status")
.assert()
.success()
.stdout(predicate::str::contains("running"));
@@ -66,9 +66,9 @@ fn test_daemon_ping() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("ping")
.arg("--project")
.arg(TEST_PROJECT)
.arg("ping")
.assert()
.success();
@@ -87,26 +87,26 @@ fn test_daemon_lifecycle() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("status")
.arg("--project")
.arg(TEST_PROJECT)
.arg("status")
.assert()
.success()
.stdout(predicate::str::contains("running"));
Command::cargo_bin("ghidra")
.unwrap()
.arg("ping")
.arg("--project")
.arg(TEST_PROJECT)
.arg("ping")
.assert()
.success();
Command::cargo_bin("ghidra")
.unwrap()
.arg("stop")
.arg("--project")
.arg(TEST_PROJECT)
.arg("stop")
.assert()
.success();
}
@@ -123,17 +123,17 @@ fn test_daemon_stop() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("stop")
.arg("--project")
.arg(TEST_PROJECT)
.arg("stop")
.assert()
.success();
Command::cargo_bin("ghidra")
.unwrap()
.arg("status")
.arg("--project")
.arg(TEST_PROJECT)
.arg("status")
.assert()
.success()
.stdout(predicate::str::contains("No bridge running"));
@@ -153,9 +153,9 @@ fn test_daemon_restart() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("restart")
.arg("--project")
.arg(TEST_PROJECT)
.arg("restart")
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -163,9 +163,9 @@ fn test_daemon_restart() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("stop")
.arg("--project")
.arg(TEST_PROJECT)
.arg("stop")
.assert()
.success();
+4 -4
View File
@@ -23,12 +23,12 @@ fn test_diff_programs() {
// diff programs compares two programs by name (no --program flag needed)
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("diff")
.arg("programs")
.arg(TEST_PROGRAM)
.arg(TEST_PROGRAM)
.arg("--project")
.arg(TEST_PROJECT)
.assert()
.success();
@@ -48,12 +48,12 @@ fn test_diff_functions() {
// Using _start (entry point) for both since we just want to verify command works
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("diff")
.arg("functions")
.arg("_start")
.arg("_start")
.arg("--project")
.arg(TEST_PROJECT)
.assert()
.success();
+16 -16
View File
@@ -22,11 +22,11 @@ fn test_find_string() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("find")
.arg("string")
.arg("test")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -47,11 +47,11 @@ fn test_find_bytes() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("find")
.arg("bytes")
.arg("4883ec08")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -72,11 +72,11 @@ fn test_find_function() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("find")
.arg("function")
.arg("main")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -97,11 +97,11 @@ fn test_find_function_glob() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("find")
.arg("function")
.arg("m*")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -122,11 +122,11 @@ fn test_find_calls() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("find")
.arg("calls")
.arg("printf")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -146,10 +146,10 @@ fn test_find_crypto() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("find")
.arg("crypto")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -170,10 +170,10 @@ fn test_find_interesting() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("find")
.arg("interesting")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -194,11 +194,11 @@ fn test_find_string_no_matches() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("find")
.arg("string")
.arg("nonexistent_string_xyz123")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
+8 -8
View File
@@ -22,10 +22,10 @@ fn test_graph_calls() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("graph")
.arg("calls")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -47,11 +47,11 @@ fn test_graph_callers() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("graph")
.arg("callers")
.arg("main")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -72,11 +72,11 @@ fn test_graph_callees() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("graph")
.arg("callees")
.arg("main")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -97,11 +97,11 @@ fn test_graph_export_dot() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("graph")
.arg("export")
.arg("dot")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
+8 -8
View File
@@ -22,10 +22,10 @@ fn test_program_info() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("program")
.arg("info")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -47,11 +47,11 @@ fn test_program_export_json() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("program")
.arg("export")
.arg("json")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -72,10 +72,10 @@ fn test_program_close() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("program")
.arg("close")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -95,10 +95,10 @@ fn test_program_info_no_program() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("program")
.arg("info")
.arg("--project")
.arg(TEST_PROJECT)
.assert()
.failure();
+4 -4
View File
@@ -28,9 +28,9 @@ fn test_stale_files_cleaned_on_restart() {
// Verify bridge is working
assert_cmd::Command::cargo_bin("ghidra")
.unwrap()
.arg("ping")
.arg("--project")
.arg(TEST_PROJECT)
.arg("ping")
.timeout(Duration::from_secs(30))
.assert()
.success();
@@ -49,9 +49,9 @@ fn test_stale_files_cleaned_on_restart() {
// Verify bridge is working
assert_cmd::Command::cargo_bin("ghidra")
.unwrap()
.arg("ping")
.arg("--project")
.arg(TEST_PROJECT)
.arg("ping")
.timeout(Duration::from_secs(30))
.assert()
.success();
@@ -76,9 +76,9 @@ fn test_recovery_after_crash() {
// Verify it's working
assert_cmd::Command::cargo_bin("ghidra")
.unwrap()
.arg("ping")
.arg("--project")
.arg(TEST_PROJECT)
.arg("ping")
.timeout(Duration::from_secs(30))
.assert()
.success();
@@ -97,9 +97,9 @@ fn test_recovery_after_crash() {
// Verify new bridge is working
assert_cmd::Command::cargo_bin("ghidra")
.unwrap()
.arg("ping")
.arg("--project")
.arg(TEST_PROJECT)
.arg("ping")
.timeout(Duration::from_secs(30))
.assert()
.success();
+8 -8
View File
@@ -47,10 +47,10 @@ fn test_script_list() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("script")
.arg("list")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -73,11 +73,11 @@ fn test_script_run() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("script")
.arg("run")
.arg(script_path.to_str().unwrap())
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -100,11 +100,11 @@ fn test_script_python_inline() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("script")
.arg("python")
.arg("output = 'Hello from Python'")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -125,11 +125,11 @@ fn test_script_run_nonexistent() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("script")
.arg("run")
.arg("/nonexistent/script.py")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
+3 -3
View File
@@ -22,9 +22,9 @@ fn test_stats_normal() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("stats")
.arg("--project")
.arg(TEST_PROJECT)
.arg("stats")
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -47,9 +47,9 @@ fn test_stats_has_all_fields() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("stats")
.arg("--project")
.arg(TEST_PROJECT)
.arg("stats")
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -77,9 +77,9 @@ fn test_stats_json_format() {
let output = Command::cargo_bin("ghidra")
.unwrap()
.arg("stats")
.arg("--project")
.arg(TEST_PROJECT)
.arg("stats")
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
+12 -12
View File
@@ -22,10 +22,10 @@ fn test_symbol_list() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("symbol")
.arg("list")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -46,12 +46,12 @@ fn test_symbol_create_and_get() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("symbol")
.arg("create")
.arg("0x1000")
.arg("test_symbol")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -59,11 +59,11 @@ fn test_symbol_create_and_get() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("symbol")
.arg("get")
.arg("test_symbol")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -84,12 +84,12 @@ fn test_symbol_rename() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("symbol")
.arg("create")
.arg("0x2000")
.arg("old_symbol")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -97,12 +97,12 @@ fn test_symbol_rename() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("symbol")
.arg("rename")
.arg("old_symbol")
.arg("new_symbol")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -122,11 +122,11 @@ fn test_symbol_get_nonexistent() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("symbol")
.arg("get")
.arg("nonexistent_symbol_12345")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
+10 -10
View File
@@ -22,10 +22,10 @@ fn test_type_list() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("type")
.arg("list")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -46,11 +46,11 @@ fn test_type_get_primitive() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("type")
.arg("get")
.arg("int")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -71,11 +71,11 @@ fn test_type_create() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("type")
.arg("create")
.arg("MyTestStruct")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -95,12 +95,12 @@ fn test_type_apply() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("type")
.arg("apply")
.arg("0x1000")
.arg("int")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()
@@ -120,11 +120,11 @@ fn test_type_get_nonexistent() {
Command::cargo_bin("ghidra")
.unwrap()
.arg("--project")
.arg(TEST_PROJECT)
.arg("type")
.arg("get")
.arg("NonexistentType12345")
.arg("--project")
.arg(TEST_PROJECT)
.arg("--program")
.arg(TEST_PROGRAM)
.assert()