From fa886c04f0bf891d4575ef534dda46344e0f86c1 Mon Sep 17 00:00:00 2001 From: Ankita Sahu Date: Sat, 16 May 2026 23:20:04 +0530 Subject: [PATCH 1/7] Improve hardware bridge safety and inscribe validation tests --- arbiter-bridge/Cargo.toml | 2 +- arbiter-bridge/src/hand.rs | 159 ++++++++++++++++++++++++++++++++- arbiter-bridge/src/inscribe.rs | 68 ++++++++++++++ 3 files changed, 226 insertions(+), 3 deletions(-) diff --git a/arbiter-bridge/Cargo.toml b/arbiter-bridge/Cargo.toml index 68ec997..ccc63ec 100644 --- a/arbiter-bridge/Cargo.toml +++ b/arbiter-bridge/Cargo.toml @@ -7,7 +7,7 @@ license.workspace = true description = "The Hand, Inscribe, and Shell — the mechanical execution bridge." [dependencies] -arbiter-core = { path = "../arbiter-core" } +arbiter-core = { path = "../arbiter-core", features= ["signet", "vigil-fs", "vigil-keys"]} enigo = { workspace = true } walkdir = { workspace = true } regex = { workspace = true } diff --git a/arbiter-bridge/src/hand.rs b/arbiter-bridge/src/hand.rs index fda9ffe..037837e 100644 --- a/arbiter-bridge/src/hand.rs +++ b/arbiter-bridge/src/hand.rs @@ -176,12 +176,12 @@ impl Drop for HardwareBridge { #[cfg(test)] mod tests { use super::*; - use arbiter_core::decree::{Action, ActionType}; + use arbiter_core::decree::{Action, ActionType, Point}; #[tokio::test] async fn coordinate_guard_rejects_out_of_bounds() { let bridge = HardwareBridge::new(1920, 1080); - // Direct call to the guard — no enigo interaction + assert!(bridge.validate_coordinate(2000, 500).is_err()); assert!(bridge.validate_coordinate(-1, 0).is_err()); assert!(bridge.validate_coordinate(960, 540).is_ok()); @@ -190,11 +190,166 @@ mod tests { #[tokio::test] async fn wait_action_does_not_need_coordinates() { let mut bridge = HardwareBridge::new(1920, 1080); + let action = Action { action_type: ActionType::Wait(10), point: None, delay_ms: 0, }; + + assert!(bridge.execute(&action).await.is_ok()); + } + + #[tokio::test] + async fn coordinate_guard_accepts_boundary_values() { + let bridge = HardwareBridge::new(1920, 1080); + + assert!(bridge.validate_coordinate(0, 0).is_ok()); + assert!(bridge.validate_coordinate(1920, 1080).is_ok()); + } + + #[tokio::test] + async fn coordinate_guard_rejects_negative_values() { + let bridge = HardwareBridge::new(1920, 1080); + + assert!(bridge.validate_coordinate(-100, 200).is_err()); + assert!(bridge.validate_coordinate(200, -50).is_err()); + } + + #[tokio::test] + async fn coordinate_guard_rejects_values_beyond_screen() { + let bridge = HardwareBridge::new(1920, 1080); + + assert!(bridge.validate_coordinate(2500, 100).is_err()); + assert!(bridge.validate_coordinate(100, 2000).is_err()); + } + + #[tokio::test] + async fn execute_rejects_invalid_coordinates_before_input_execution() { + let mut bridge = HardwareBridge::new(1920, 1080); + + let action = Action { + action_type: ActionType::Click, + point: Some(Point { x: 5000, y: 5000 }), + delay_ms: 0, + }; + + let result = bridge.execute(&action).await; + + assert!(result.is_err()); + } + + #[tokio::test] + async fn empty_type_action_returns_ok() { + let mut bridge = HardwareBridge::new(1920, 1080); + + let action = Action { + action_type: ActionType::Type(String::new()), + point: None, + delay_ms: 0, + }; + + assert!(bridge.execute(&action).await.is_ok()); + } + // ---------------- NEW IPC STATE TRANSITION TESTS ---------------- + + #[tokio::test] + async fn valid_ipc_click_flow_executes_successfully() { + let mut bridge = HardwareBridge::new(1920, 1080); + + let action = Action { + action_type: ActionType::Click, + point: Some(Point { x: 100, y: 100 }), + delay_ms: 0, + }; + assert!(bridge.execute(&action).await.is_ok()); } + + #[tokio::test] + async fn valid_ipc_navigation_flow_executes_successfully() { + let mut bridge = HardwareBridge::new(1920, 1080); + + let action = Action { + action_type: ActionType::Navigate("ctrl+c".to_string()), + point: Some(Point { x: 50, y: 50 }), + delay_ms: 0, + }; + + assert!(bridge.execute(&action).await.is_ok()); + } + + #[tokio::test] + async fn mixed_ipc_actions_work_correctly() { + let mut bridge = HardwareBridge::new(1920, 1080); + + let actions = vec![ + Action { + action_type: ActionType::Click, + point: Some(Point { x: 10, y: 10 }), + delay_ms: 0, + }, + Action { + action_type: ActionType::Type("hi".to_string()), + point: None, + delay_ms: 0, + }, + Action { + action_type: ActionType::Scroll(5), + point: None, + delay_ms: 0, + }, + ]; + + for action in actions { + assert!(bridge.execute(&action).await.is_ok()); + } + } + #[tokio::test] + async fn execute_fails_when_coordinates_are_invalid() { + let mut bridge = HardwareBridge::new(1920, 1080); + + let action = Action { + action_type: ActionType::RightClick, + point: Some(Point { x: 99999, y: 99999 }), + delay_ms: 0, + }; + + let result = bridge.execute(&action).await; + + assert!(result.is_err()); + + let err = result.unwrap_err(); + + assert!(err.contains("outside monitor bounds")); + } + #[tokio::test] + async fn invalid_navigation_key_does_not_crash() { + let mut bridge = HardwareBridge::new(1920, 1080); + + let action = Action { + action_type: ActionType::Navigate("ctrl+unknownkey".to_string()), + point: None, + delay_ms: 0, + }; + + let result = bridge.execute(&action).await; + + assert!(result.is_ok()); + } + + #[tokio::test] + async fn type_action_with_special_characters_executes() { + let mut bridge = HardwareBridge::new(1920, 1080); + + let action = Action { + action_type: ActionType::Type("hello\nworld\t!".to_string()), + point: None, + delay_ms: 0, + }; + + let result = bridge.execute(&action).await; + + assert!(result.is_ok()); + } } diff --git a/arbiter-bridge/src/inscribe.rs b/arbiter-bridge/src/inscribe.rs index fd0abe7..dea51b3 100644 --- a/arbiter-bridge/src/inscribe.rs +++ b/arbiter-bridge/src/inscribe.rs @@ -258,4 +258,72 @@ mod tests { .iter() .any(|w| w.contains("System-critical"))); } + #[tokio::test] + async fn missing_source_file_returns_error() { + let root = tempdir().unwrap(); + + let trusted = vec![root.path().to_string_lossy().to_string()]; + + let src = root.path().join("missing.txt"); + let dst = root.path().join("out.txt"); + + let res = move_file(&src, &dst, &trusted).await; + + assert!(matches!(res, Err(InscribeError::SourceNotFound(_)))); + } + + #[tokio::test] + async fn delete_file_removes_file() { + let root = tempdir().unwrap(); + + let trusted = vec![root.path().to_string_lossy().to_string()]; + + let file = root.path().join("temp.txt"); + + File::create(&file).unwrap(); + + let res = delete_file(&file, &trusted).await; + + assert!(res.is_ok()); + assert!(!file.exists()); + } + + #[test] + fn dry_run_detects_matching_files() { + let root = tempdir().unwrap(); + + let file1 = root.path().join("a.log"); + let file2 = root.path().join("b.txt"); + + File::create(&file1).unwrap(); + File::create(&file2).unwrap(); + + let report = dry_run_walk(root.path(), "*.log"); + + assert_eq!(report.affected.len(), 1); + assert!(report.affected[0].to_string_lossy().contains("a.log")); + } + + #[tokio::test] + async fn copy_file_returns_bytes_and_creates_destination() { + let root = tempdir().unwrap(); + + let trusted = vec![root.path().to_string_lossy().to_string()]; + + let src = root.path().join("source.txt"); + let dst = root.path().join("copied.txt"); + + std::fs::write(&src, "hello world").unwrap(); + + let result = copy_file(&src, &dst, &trusted).await; + + assert!(result.is_ok()); + + let (returned_path, bytes) = result.unwrap(); + + assert_eq!(returned_path, dst); + assert_eq!(bytes, 11); + + assert!(dst.exists()); + } } From 3059e221ab1adee39887af894e0b10bdec88e5b1 Mon Sep 17 00:00:00 2001 From: Ankita Sahu Date: Fri, 29 May 2026 08:32:48 +0530 Subject: [PATCH 2/7] fix: remove stray branch text from hand.rs --- arbiter-bridge/src/hand.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/arbiter-bridge/src/hand.rs b/arbiter-bridge/src/hand.rs index 037837e..56539c3 100644 --- a/arbiter-bridge/src/hand.rs +++ b/arbiter-bridge/src/hand.rs @@ -8,6 +8,7 @@ pub struct HardwareBridge { screen_height: i32, } + impl HardwareBridge { pub fn new(width: i32, height: i32) -> Self { let enigo = Enigo::new(&Settings::default()) From 1e501eb0b3201ef5f26dc53a8b56b0e30ac938c2 Mon Sep 17 00:00:00 2001 From: Ankita Sahu Date: Fri, 29 May 2026 11:11:22 +0530 Subject: [PATCH 3/7] fix: remove duplicate test and clean CI issues --- arbiter-bridge/src/hand.rs | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/arbiter-bridge/src/hand.rs b/arbiter-bridge/src/hand.rs index e2d21c1..7d4096f 100644 --- a/arbiter-bridge/src/hand.rs +++ b/arbiter-bridge/src/hand.rs @@ -227,9 +227,8 @@ mod tests { assert!(bridge.validate_coordinate(100, 2000).is_err()); } - + #[tokio::test] - main async fn execute_rejects_invalid_coordinates_before_input_execution() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -245,8 +244,6 @@ mod tests { } #[tokio::test] - - async fn empty_type_action_returns_ok() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -261,9 +258,9 @@ mod tests { } // ---------------- NEW IPC STATE TRANSITION TESTS ---------------- + #[tokio::test] -main async fn valid_ipc_click_flow_executes_successfully() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -287,29 +284,12 @@ main delay_ms: 0, }; - -main assert!(bridge.execute(&action).await.is_ok()); } - #[tokio::test] - - #[ignore] - async fn valid_ipc_navigation_flow_executes_successfully() { - let mut bridge = HardwareBridge::new(1920, 1080); - - let action = Action { - action_type: ActionType::Navigate("ctrl+c".to_string()), - point: Some(Point { x: 50, y: 50 }), - delay_ms: 0, - }; - - assert!(bridge.execute(&action).await.is_ok()); - } #[tokio::test] - main async fn mixed_ipc_actions_work_correctly() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -338,7 +318,6 @@ main #[tokio::test] - main async fn execute_fails_when_coordinates_are_invalid() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -358,7 +337,6 @@ main } #[tokio::test] -main async fn invalid_navigation_key_does_not_crash() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -375,8 +353,6 @@ main #[tokio::test] - - main async fn type_action_with_special_characters_executes() { let mut bridge = HardwareBridge::new(1920, 1080); From ed852477c3487085b726fa4613296066591d0d2b Mon Sep 17 00:00:00 2001 From: Ankita Sahu Date: Fri, 29 May 2026 11:18:40 +0530 Subject: [PATCH 4/7] style: apply cargo fmt formatting --- arbiter-bridge/src/hand.rs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/arbiter-bridge/src/hand.rs b/arbiter-bridge/src/hand.rs index 7d4096f..228a312 100644 --- a/arbiter-bridge/src/hand.rs +++ b/arbiter-bridge/src/hand.rs @@ -8,7 +8,6 @@ pub struct HardwareBridge { screen_height: i32, } - impl HardwareBridge { pub fn new(width: i32, height: i32) -> Self { let enigo = Enigo::new(&Settings::default()) @@ -227,7 +226,7 @@ mod tests { assert!(bridge.validate_coordinate(100, 2000).is_err()); } - #[tokio::test] + #[tokio::test] async fn execute_rejects_invalid_coordinates_before_input_execution() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -258,7 +257,6 @@ mod tests { } // ---------------- NEW IPC STATE TRANSITION TESTS ---------------- - #[tokio::test] async fn valid_ipc_click_flow_executes_successfully() { @@ -270,7 +268,6 @@ mod tests { delay_ms: 0, }; - assert!(bridge.execute(&action).await.is_ok()); } @@ -287,9 +284,8 @@ mod tests { assert!(bridge.execute(&action).await.is_ok()); } - #[tokio::test] - + async fn mixed_ipc_actions_work_correctly() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -317,7 +313,6 @@ mod tests { } #[tokio::test] - async fn execute_fails_when_coordinates_are_invalid() { let mut bridge = HardwareBridge::new(1920, 1080); From 7c28d2ef7721e4af80c22b327400d6f1085f77a3 Mon Sep 17 00:00:00 2001 From: Ankita sahu Date: Fri, 29 May 2026 11:23:10 +0530 Subject: [PATCH 5/7] Update hand.rs --- arbiter-bridge/src/hand.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arbiter-bridge/src/hand.rs b/arbiter-bridge/src/hand.rs index 228a312..8bcc49e 100644 --- a/arbiter-bridge/src/hand.rs +++ b/arbiter-bridge/src/hand.rs @@ -189,7 +189,7 @@ mod tests { } #[tokio::test] - #[ignore] + async fn wait_action_does_not_need_coordinates() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -311,6 +311,7 @@ mod tests { assert!(bridge.execute(&action).await.is_ok()); } } + #[tokio::test] async fn execute_fails_when_coordinates_are_invalid() { @@ -330,6 +331,7 @@ mod tests { assert!(err.contains("outside monitor bounds")); } + #[tokio::test] async fn invalid_navigation_key_does_not_crash() { From 139c07fdb7c02666a03fa7f02bddee6d1ae8db63 Mon Sep 17 00:00:00 2001 From: Ankita sahu Date: Fri, 29 May 2026 11:41:15 +0530 Subject: [PATCH 6/7] Add tests for coordinate validation in HardwareBridge --- arbiter-bridge/src/hand.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/arbiter-bridge/src/hand.rs b/arbiter-bridge/src/hand.rs index 8bcc49e..2b5079e 100644 --- a/arbiter-bridge/src/hand.rs +++ b/arbiter-bridge/src/hand.rs @@ -203,6 +203,7 @@ mod tests { } #[tokio::test] + async fn coordinate_guard_accepts_boundary_values() { let bridge = HardwareBridge::new(1920, 1080); @@ -211,6 +212,7 @@ mod tests { } #[tokio::test] + async fn coordinate_guard_rejects_negative_values() { let bridge = HardwareBridge::new(1920, 1080); @@ -219,6 +221,7 @@ mod tests { } #[tokio::test] + async fn coordinate_guard_rejects_values_beyond_screen() { let bridge = HardwareBridge::new(1920, 1080); @@ -272,6 +275,7 @@ mod tests { } #[tokio::test] + async fn valid_ipc_navigation_flow_executes_successfully() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -324,11 +328,8 @@ mod tests { }; let result = bridge.execute(&action).await; - assert!(result.is_err()); - let err = result.unwrap_err(); - assert!(err.contains("outside monitor bounds")); } From 5f0a3237d4c23c2d453a2f9a1206cefc3be5c9b6 Mon Sep 17 00:00:00 2001 From: Ankita Sahu Date: Fri, 29 May 2026 12:30:31 +0530 Subject: [PATCH 7/7] fix: sync branch with remote and resolve CI state --- arbiter-bridge/src/hand.rs | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/arbiter-bridge/src/hand.rs b/arbiter-bridge/src/hand.rs index 2b5079e..15be958 100644 --- a/arbiter-bridge/src/hand.rs +++ b/arbiter-bridge/src/hand.rs @@ -189,7 +189,6 @@ mod tests { } #[tokio::test] - async fn wait_action_does_not_need_coordinates() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -203,7 +202,7 @@ mod tests { } #[tokio::test] - + async fn coordinate_guard_accepts_boundary_values() { let bridge = HardwareBridge::new(1920, 1080); @@ -212,7 +211,7 @@ mod tests { } #[tokio::test] - + async fn coordinate_guard_rejects_negative_values() { let bridge = HardwareBridge::new(1920, 1080); @@ -221,7 +220,7 @@ mod tests { } #[tokio::test] - + async fn coordinate_guard_rejects_values_beyond_screen() { let bridge = HardwareBridge::new(1920, 1080); @@ -230,7 +229,6 @@ mod tests { } #[tokio::test] - async fn execute_rejects_invalid_coordinates_before_input_execution() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -246,7 +244,6 @@ mod tests { } #[tokio::test] - async fn empty_type_action_returns_ok() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -261,7 +258,6 @@ mod tests { // ---------------- NEW IPC STATE TRANSITION TESTS ---------------- #[tokio::test] - async fn valid_ipc_click_flow_executes_successfully() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -275,7 +271,7 @@ mod tests { } #[tokio::test] - + async fn valid_ipc_navigation_flow_executes_successfully() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -289,7 +285,6 @@ mod tests { } #[tokio::test] - async fn mixed_ipc_actions_work_correctly() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -315,9 +310,8 @@ mod tests { assert!(bridge.execute(&action).await.is_ok()); } } - - #[tokio::test] + #[tokio::test] async fn execute_fails_when_coordinates_are_invalid() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -332,9 +326,8 @@ mod tests { let err = result.unwrap_err(); assert!(err.contains("outside monitor bounds")); } - - #[tokio::test] + #[tokio::test] async fn invalid_navigation_key_does_not_crash() { let mut bridge = HardwareBridge::new(1920, 1080); @@ -350,7 +343,6 @@ mod tests { } #[tokio::test] - async fn type_action_with_special_characters_executes() { let mut bridge = HardwareBridge::new(1920, 1080);