#![ cfg( unix ) ]
use claude_runner_core::{ run_isolated, RunnerError, IsolatedModel };
#[ cfg( unix ) ]
fn fake_claude_dir( body : &str ) -> ( tempfile::TempDir, String )
{
use std::os::unix::fs::PermissionsExt as _;
let dir = tempfile::TempDir::new().expect( "tmpdir" );
let path = dir.path().join( "claude" );
let script = format!( "#!/bin/sh\n{body}\n" );
std::fs::write( &path, script.as_bytes() ).expect( "write fake-claude" );
std::fs::set_permissions( &path, std::fs::Permissions::from_mode( 0o755 ) )
.expect( "chmod fake-claude" );
let path_val = format!(
"{}:{}",
dir.path().display(),
std::env::var( "PATH" ).unwrap_or_default(),
);
( dir, path_val )
}
#[ test ]
#[ doc = "bug_reproducer(BUG-243)" ]
#[ allow( unsafe_code ) ]
fn timeout_includes_partial_stdout()
{
let ( _dir, path_val ) = fake_claude_dir( "printf 'partial-output-marker'; sleep 3" );
let creds_json = r#"{"accessToken":"fake","refreshToken":"fake","expiresAt":9999999999999}"#;
let orig_path = std::env::var( "PATH" ).unwrap_or_default();
unsafe { std::env::set_var( "PATH", &path_val ); }
let result = run_isolated( creds_json, vec![], 1, IsolatedModel::KeepCurrent );
unsafe { std::env::set_var( "PATH", &orig_path ); }
match result
{
Err( RunnerError::TimeoutWithOutput { secs : _, partial_stdout } ) =>
{
assert!(
partial_stdout.contains( "partial-output-marker" ),
"BUG-243: TimeoutWithOutput.partial_stdout must contain the marker; got:\n{partial_stdout}"
);
}
Err( RunnerError::Timeout { .. } ) =>
{
panic!( "BUG-243: expected TimeoutWithOutput (with content), got Timeout (empty)" );
}
other =>
{
panic!( "BUG-243: expected TimeoutWithOutput error; got: {other:?}" );
}
}
}