irosh 0.1.0

SSH sessions over Iroh peer-to-peer transport
Documentation
use super::*;

#[tokio::test]
async fn session_state_transitions_from_authenticated_to_shell_ready_to_closed() {
    let server_state = temp_state_dir("server-session-state");
    let client_state = temp_state_dir("client-session-state");
    let (mut session, server_task) = connect_test_session(&server_state, &client_state).await;

    assert_eq!(session.state(), SessionState::Authenticated);
    session.start_shell().await.unwrap();
    assert_eq!(session.state(), SessionState::ShellReady);
    session.disconnect().await.unwrap();
    assert_eq!(session.state(), SessionState::Closed);

    let _ = server_task.await.unwrap();
}

#[tokio::test]
async fn exec_emits_stdout_and_close_events() {
    let server_state = temp_state_dir("server-exec");
    let client_state = temp_state_dir("client-exec");
    let (mut session, server_task) = connect_test_session(&server_state, &client_state).await;

    session.exec("printf exec-ok").await.unwrap();

    let mut stdout = Vec::new();
    loop {
        let Some(event) = session.next_event().await.unwrap() else {
            break;
        };
        match event {
            SessionEvent::Stdout(data) => stdout.extend_from_slice(&data),
            SessionEvent::Closed => break,
            SessionEvent::Stderr(_) | SessionEvent::ExitStatus(_) => {}
        }
    }

    let stdout = String::from_utf8(stdout).unwrap();
    assert!(stdout.contains("exec-ok"), "unexpected stdout: {stdout}");
    assert_eq!(session.state(), SessionState::Closed);

    let _ = server_task.await.unwrap();
}