#![cfg(feature = "local")]
mod common;
use std::sync::Arc;
use alktty::local::LocalTtyBackend;
use common::{negotiate_pipe_json, spawn_session};
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn unknown_backend_error() {
let backend = Arc::new(LocalTtyBackend::new());
let (mut client, server) = spawn_session("local", backend);
client
.write_negotiation(
r#"{"carriage":"raw","backend":"kubernetes","tty":null,"cmd":["echo","hi"]}"#,
)
.await;
let err = client.read_error_frame().await;
assert_eq!(err["error"], "unknown_backend");
assert_eq!(err["backend"], "kubernetes");
client.assert_no_more_chunks().await;
let _ = server.await;
}
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn malformed_negotiation_bad_json() {
let backend = Arc::new(LocalTtyBackend::new());
let (mut client, server) = spawn_session("local", backend);
client.write_negotiation("not valid json").await;
let err = client.read_error_frame().await;
assert_eq!(err["error"], "malformed_negotiation");
client.assert_no_more_chunks().await;
let _ = server.await;
}
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn malformed_negotiation_carriage_not_raw() {
let backend = Arc::new(LocalTtyBackend::new());
let (mut client, server) = spawn_session("local", backend);
client
.write_negotiation(
r#"{"carriage":"json","backend":"local","tty":null,"cmd":["echo","hi"]}"#,
)
.await;
let err = client.read_error_frame().await;
assert_eq!(err["error"], "malformed_negotiation");
client.assert_no_more_chunks().await;
let _ = server.await;
}
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn malformed_negotiation_empty_cmd() {
let backend = Arc::new(LocalTtyBackend::new());
let (mut client, server) = spawn_session("local", backend);
client
.write_negotiation(r#"{"carriage":"raw","backend":"local","tty":null,"cmd":[]}"#)
.await;
let err = client.read_error_frame().await;
assert_eq!(err["error"], "malformed_negotiation");
client.assert_no_more_chunks().await;
let _ = server.await;
}
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn allocate_failed_nonexistent_binary() {
let backend = Arc::new(LocalTtyBackend::new());
let (mut client, server) = spawn_session("local", backend);
client
.write_negotiation(
negotiate_pipe_json("local", &["/nonexistent/binary/that/does/not/exist"]).as_str(),
)
.await;
let err = client.read_error_frame().await;
assert_eq!(err["error"], "allocate_failed");
client.assert_no_more_chunks().await;
let _ = server.await;
}