#![cfg(feature = "test-support")]
#![allow(clippy::expect_used, clippy::panic, clippy::unwrap_used)]
use libtmux::test::TestServer;
use libtmux::{NewSessionOptions, NewWindowOptions, SplitDirection, SplitOptions};
use tempfile::TempDir;
const HOSTILE: &str = "evil#(echo pwned)";
#[tokio::test]
async fn a_session_name_reaches_tmux_literally() {
let guard = TestServer::builder().start().await.expect("tmux starts");
let session = guard
.server()
.new_session(HOSTILE)
.await
.expect("the session is created");
assert_eq!(session.name().to_string_lossy(), HOSTILE);
guard.shutdown().await.expect("the fixture shuts down");
}
#[tokio::test]
async fn a_hostile_name_round_trips_through_lookup() {
let guard = TestServer::builder().start().await.expect("tmux starts");
let server = guard.server();
let created = server
.new_session(HOSTILE)
.await
.expect("the session is created");
assert!(
server
.has_session(HOSTILE)
.await
.expect("the listing reads")
);
let found = server
.session(HOSTILE)
.await
.expect("the listing reads")
.expect("the session is found by the name it was given");
assert_eq!(found.id(), created.id());
guard.shutdown().await.expect("the fixture shuts down");
}
#[tokio::test]
async fn a_renamed_session_reaches_tmux_literally() {
let guard = TestServer::builder().start().await.expect("tmux starts");
let mut session = guard
.server()
.new_session("work")
.await
.expect("the session is created");
session.rename(HOSTILE).await.expect("the session renames");
assert_eq!(session.name().to_string_lossy(), HOSTILE);
guard.shutdown().await.expect("the fixture shuts down");
}
#[tokio::test]
async fn a_window_name_reaches_tmux_literally() {
let guard = TestServer::builder().start().await.expect("tmux starts");
let session = guard
.server()
.new_session("work")
.await
.expect("the session is created");
let created = session
.new_window(HOSTILE)
.await
.expect("the window is created");
assert_eq!(created.name().to_string_lossy(), HOSTILE);
let mut renamed = session
.new_window("second")
.await
.expect("the window is created");
renamed.rename(HOSTILE).await.expect("the window renames");
assert_eq!(renamed.name().to_string_lossy(), HOSTILE);
guard.shutdown().await.expect("the fixture shuts down");
}
#[tokio::test]
async fn a_first_window_name_reaches_tmux_literally() {
let guard = TestServer::builder().start().await.expect("tmux starts");
let session = guard
.server()
.new_session(NewSessionOptions::new("work").window_name(HOSTILE))
.await
.expect("the session is created");
let window = session
.active_window()
.await
.expect("the window is read")
.expect("a session has a window");
assert_eq!(window.name().to_string_lossy(), HOSTILE);
guard.shutdown().await.expect("the fixture shuts down");
}
#[tokio::test]
async fn a_pane_title_reaches_tmux_literally() {
let guard = TestServer::builder().start().await.expect("tmux starts");
let session = guard
.server()
.new_session("work")
.await
.expect("the session is created");
let mut pane = session.panes().await.expect("panes list").remove(0);
pane.set_title(HOSTILE).await.expect("the title is set");
assert_eq!(pane.title().to_string_lossy(), HOSTILE);
guard.shutdown().await.expect("the fixture shuts down");
}
#[tokio::test]
async fn a_start_directory_reaches_tmux_literally() {
let guard = TestServer::builder().start().await.expect("tmux starts");
let session = guard
.server()
.new_session("work")
.await
.expect("the session is created");
let scratch = TempDir::new().expect("a scratch directory");
let directory = scratch.path().join("dir#(echo pwned)");
std::fs::create_dir_all(&directory).expect("the directory is created");
let window = session
.new_window(NewWindowOptions::new("cwd").start_directory(&directory))
.await
.expect("the window is created");
let pane = window
.active_pane()
.await
.expect("the pane is read")
.expect("a window has a pane");
let expected = directory.canonicalize().expect("the directory resolves");
assert_eq!(
pane.current_path().map(|path| path.to_string_lossy()),
Some(expected.to_string_lossy()),
);
guard.shutdown().await.expect("the fixture shuts down");
}
#[tokio::test]
async fn a_split_start_directory_reaches_tmux_literally() {
let guard = TestServer::builder().start().await.expect("tmux starts");
let session = guard
.server()
.new_session("work")
.await
.expect("the session is created");
let pane = session.panes().await.expect("panes list").remove(0);
let scratch = TempDir::new().expect("a scratch directory");
let directory = scratch.path().join("split#(echo pwned)");
std::fs::create_dir_all(&directory).expect("the directory is created");
let split = pane
.split(SplitOptions::new(SplitDirection::Below).start_directory(&directory))
.await
.expect("the pane splits")
.refreshed()
.await
.expect("the pane is read back");
let expected = directory.canonicalize().expect("the directory resolves");
assert_eq!(
split.current_path().map(|path| path.to_string_lossy()),
Some(expected.to_string_lossy()),
);
guard.shutdown().await.expect("the fixture shuts down");
}