use tools_bash::BashSession; #[tokio::test] async fn bash_persists_env_between_calls() { let mut session = BashSession::new().await.unwrap(); // Set an environment variable let output1 = session.execute("export TEST_VAR=hello", None).await.unwrap(); assert!(output1.success); // Verify it persists in next command let output2 = session.execute("echo $TEST_VAR", None).await.unwrap(); assert!(output2.success); assert!(output2.stdout.contains("hello")); session.close().await.unwrap(); } #[tokio::test] async fn bash_persists_cwd_between_calls() { let mut session = BashSession::new().await.unwrap(); // Change to /tmp let output1 = session.execute("cd /tmp", None).await.unwrap(); assert!(output1.success); // Verify cwd persists let output2 = session.execute("pwd", None).await.unwrap(); assert!(output2.success); assert!(output2.stdout.trim().ends_with("/tmp")); session.close().await.unwrap(); } #[tokio::test] async fn bash_command_timeout() { let mut session = BashSession::new().await.unwrap(); // Command that sleeps for 5 seconds, but with 1 second timeout let result = session.execute("sleep 5", Some(1000)).await; assert!(result.is_err()); let err_msg = result.unwrap_err().to_string(); assert!(err_msg.contains("timeout") || err_msg.contains("timed out")); session.close().await.unwrap(); } #[tokio::test] async fn bash_output_truncation() { let mut session = BashSession::new().await.unwrap(); // Generate a lot of output let output = session .execute("for i in {1..100}; do echo 'Line '$i; done", None) .await .unwrap(); assert!(output.success); // Should have output but might be truncated assert!(!output.stdout.is_empty()); session.close().await.unwrap(); } #[tokio::test] async fn bash_command_failure_returns_error_code() { let mut session = BashSession::new().await.unwrap(); let output = session.execute("false", None).await.unwrap(); assert!(!output.success); assert_eq!(output.exit_code, 1); session.close().await.unwrap(); } #[tokio::test] async fn bash_stderr_captured() { let mut session = BashSession::new().await.unwrap(); let output = session .execute("echo 'error message' >&2", None) .await .unwrap(); assert!(output.success); assert!(output.stderr.contains("error message")); session.close().await.unwrap(); } #[tokio::test] async fn bash_multiple_commands_in_sequence() { let mut session = BashSession::new().await.unwrap(); // Set a variable session.execute("X=1", None).await.unwrap(); // Increment it session.execute("X=$((X + 1))", None).await.unwrap(); // Verify final value let output = session.execute("echo $X", None).await.unwrap(); assert!(output.stdout.contains("2")); session.close().await.unwrap(); }