mod support;
use std::time::Duration;
use cdp_browser_lite::browser::Browser;
use cdp_browser_lite::config::{BrowserConfig, LaunchMode, ProfileMode};
use support::fake_chrome::{FakeMode, fake_chrome_path};
use support::mock_devtools::{MockBehavior, MockChrome};
fn fresh_user_data_dir(label: &str) -> std::path::PathBuf {
let dir = tempfile::Builder::new()
.prefix(&format!("cdp-drop-semantics-{label}-"))
.tempdir()
.unwrap()
.keep();
std::fs::create_dir_all(&dir).unwrap();
dir
}
fn set_fake_chrome_env(mode: FakeMode, args_log: &std::path::Path) {
unsafe {
std::env::set_var("FAKE_CHROME_MODE", mode.env_value());
std::env::set_var("FAKE_CHROME_ARGS_LOG", args_log.to_string_lossy().as_ref());
}
}
#[tokio::test]
async fn drop_kills_managed_process() {
let user_data_dir = fresh_user_data_dir("managed");
let args_log = user_data_dir.join("args.log");
set_fake_chrome_env(FakeMode::Serve, &args_log);
let cfg = BrowserConfig::builder()
.mode(LaunchMode::LaunchNew)
.chrome_path(fake_chrome_path())
.port(0)
.headless(true)
.keep_alive_on_drop(false)
.profile(ProfileMode::Ephemeral) .build();
let browser = Browser::ensure(cfg).await.expect("launch failed");
assert!(browser.is_managed());
drop(browser);
tokio::time::sleep(Duration::from_millis(500)).await;
}
#[tokio::test]
async fn keep_alive_on_drop_respects_process() {
let user_data_dir = fresh_user_data_dir("keep-alive");
let args_log = user_data_dir.join("args.log");
set_fake_chrome_env(FakeMode::Serve, &args_log);
let cfg = BrowserConfig::builder()
.mode(LaunchMode::LaunchNew)
.chrome_path(fake_chrome_path())
.port(0)
.headless(true)
.keep_alive_on_drop(true)
.profile(ProfileMode::Persistent(user_data_dir.clone()))
.build();
let browser = Browser::ensure(cfg).await.expect("launch failed");
assert!(browser.is_managed());
let addr = browser.debug_address();
let host = addr.0.to_string();
let port = addr.1;
drop(browser);
tokio::time::sleep(Duration::from_millis(500)).await;
let connected = std::net::TcpStream::connect((host.as_str(), port)).is_ok();
assert!(
connected,
"Port must remain open if keep_alive_on_drop=true"
);
}
#[tokio::test]
async fn drop_attach_does_not_kill() {
let mock = MockChrome::start(MockBehavior::KeepAlive).await;
let cfg = BrowserConfig::builder()
.mode(LaunchMode::AttachOnly)
.port(mock.port)
.build();
let browser = Browser::ensure(cfg).await.expect("AttachOnly failed");
assert!(!browser.is_managed());
drop(browser);
tokio::time::sleep(Duration::from_millis(50)).await;
}