use radb::client::AdbClient;
use radb::utils::start_adb_server;
#[cfg(test)]
mod tests {
use super::*;
use radb::client::{AdbClient, AdbDevice};
use radb::utils::start_adb_server;
use std::io::Write;
use tempfile::NamedTempFile;
const TEST_DEVICE_SERIAL: &str = "3508719615000K5";
const TEST_PACKAGE: &str = "com.android.chrome";
const TEST_DIR: &str = "/data/local/tmp";
const DEFAULT_ADB_ADDR: &str = "127.0.0.1:5037";
fn setup_test_environment() {
start_adb_server();
std::thread::sleep(std::time::Duration::from_secs(1));
}
fn create_test_file(content: &str) -> std::io::Result<NamedTempFile> {
let mut file = NamedTempFile::new()?;
file.write_all(content.as_bytes())?;
file.flush()?;
Ok(file)
}
#[cfg(feature = "blocking")]
mod blocking_tests {
use super::*;
#[test]
fn test_client_creation() {
setup_test_environment();
let client = AdbClient::default();
assert!(client.stream.peer_addr().is_ok());
}
#[test]
fn test_client_with_custom_addr() {
setup_test_environment();
let client = AdbClient::new(DEFAULT_ADB_ADDR);
assert!(client.stream.peer_addr().is_ok());
}
#[test]
fn test_server_version() {
setup_test_environment();
let mut client = AdbClient::default();
let version = client.server_version();
assert!(version.is_ok());
println!("ADB Server Version: {}", version.unwrap());
}
#[test]
fn test_list_devices() {
setup_test_environment();
let mut client = AdbClient::default();
let devices = client.list_devices();
assert!(devices.is_ok());
let devices = devices.unwrap();
println!("Found {} devices", devices.len());
for device in &devices {
println!("Device: {:?}", device.serial);
}
}
#[test]
fn test_iter_devices() {
setup_test_environment();
let mut client = AdbClient::default();
let devices_iter = client.iter_devices();
assert!(devices_iter.is_ok());
let mut count = 0;
for device in devices_iter.unwrap() {
count += 1;
println!("Device {}: {:?}", count, device.serial);
}
println!("Total devices: {}", count);
}
}
#[cfg(feature = "tokio_async")]
mod async_tests {
use super::*;
use futures_util::StreamExt;
use radb::client::AdbClient;
use tokio;
#[tokio::test]
async fn test_async_client_creation() {
setup_test_environment();
let client = AdbClient::default().await;
assert!(client.stream.peer_addr().is_ok());
}
#[tokio::test]
async fn test_async_server_version() {
setup_test_environment();
let mut client = AdbClient::default().await;
let version = client.server_version().await;
assert!(version.is_ok());
println!("ADB Server Version: {}", version.unwrap());
}
#[tokio::test]
async fn test_async_list_devices() {
setup_test_environment();
let mut client = AdbClient::default().await;
let devices = client.list_devices().await;
assert!(devices.is_ok());
let devices = devices.unwrap();
println!("Found {} devices", devices.len());
for device in &devices {
println!("Device: {:?}", device.serial);
}
}
#[tokio::test]
async fn test_async_iter_devices() {
setup_test_environment();
let mut client = AdbClient::default().await;
let mut devices_stream = client.iter_devices().await;
let mut count = 0;
while let Some(device) = devices_stream.next().await {
count += 1;
println!("Device {}: {:?}", count, device.serial);
}
println!("Total devices: {}", count);
}
}
#[cfg(feature = "blocking")]
mod device_blocking_tests {
use super::*;
use radb::beans::command::AdbCommand;
use std::path::PathBuf;
fn create_test_device() -> AdbDevice<&'static str> {
AdbDevice::new(TEST_DEVICE_SERIAL, DEFAULT_ADB_ADDR)
}
#[test]
fn test_device_creation() {
let device = create_test_device();
assert_eq!(device.serial, Some(TEST_DEVICE_SERIAL.to_string()));
}
#[test]
fn test_device_state() {
setup_test_environment();
let mut device = create_test_device();
let state = device.get_state();
assert!(state.is_ok());
println!("Device state: {}", state.unwrap());
}
#[test]
fn test_device_serial() {
setup_test_environment();
let mut device = create_test_device();
let serial = device.get_serialno();
assert!(serial.is_ok());
assert_eq!(serial.unwrap().trim(), TEST_DEVICE_SERIAL);
}
#[test]
fn test_device_features() {
setup_test_environment();
let mut device = create_test_device();
let features = device.get_features();
assert!(features.is_ok());
println!("Device features: {}", features.unwrap());
}
#[test]
fn test_shell_command() {
setup_test_environment();
let mut device = create_test_device();
let result = device.shell(["echo", "hello"]);
assert!(result.is_ok());
assert_eq!(result.unwrap().trim(), "hello");
}
#[test]
fn test_shell_trim() {
setup_test_environment();
let mut device = create_test_device();
let result = device.shell_trim(["echo", "hello world"]);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "hello world");
}
#[test]
fn test_device_properties() {
setup_test_environment();
let mut device = create_test_device();
let sdk_version = device.get_sdk_version();
assert!(sdk_version.is_ok());
println!("SDK Version: {}", sdk_version.unwrap());
let android_version = device.get_android_version();
assert!(android_version.is_ok());
println!("Android Version: {}", android_version.unwrap());
let model = device.get_device_model();
assert!(model.is_ok());
println!("Device Model: {}", model.unwrap());
let brand = device.get_device_brand();
assert!(brand.is_ok());
println!("Device Brand: {}", brand.unwrap());
let abi = device.get_device_abi();
assert!(abi.is_ok());
println!("Device ABI: {}", abi.unwrap());
}
#[test]
fn test_file_operations() {
setup_test_environment();
let mut device = create_test_device();
let exists = device.exists(TEST_DIR);
assert!(exists.is_ok());
if exists.unwrap() {
println!("Test directory {} exists", TEST_DIR);
let files = device.list(TEST_DIR);
assert!(files.is_ok());
println!("Files in {}: {:?}", TEST_DIR, files.unwrap().len());
}
}
#[test]
fn test_stat_file() {
setup_test_environment();
let mut device = create_test_device();
let stat = device.stat(TEST_DIR);
assert!(stat.is_ok());
let file_info = stat.unwrap();
println!(
"File info for {}: size={}, mtime={}",
file_info.path, file_info.size, file_info.mtime
);
}
#[test]
fn test_push_pull_file() {
setup_test_environment();
let mut device = create_test_device();
let test_content = "Hello, ADB test!";
let temp_file = create_test_file(test_content).unwrap();
let temp_path = temp_file.path().to_str().unwrap();
let remote_path = format!("{}/test_file.txt", TEST_DIR);
let push_result = device.push(temp_path, &remote_path);
assert!(push_result.is_ok());
let exists = device.exists(&remote_path);
assert!(exists.is_ok());
assert!(exists.unwrap());
let pull_dest = PathBuf::from("/tmp/pulled_test_file.txt");
let pull_result = device.pull(&remote_path, &pull_dest);
assert!(pull_result.is_ok());
let _ = device.remove(&remote_path);
let _ = std::fs::remove_file(&pull_dest);
}
#[test]
fn test_screen_operations() {
setup_test_environment();
let mut device = create_test_device();
let screen_on = device.if_screen_on();
assert!(screen_on.is_ok());
println!("Screen on: {}", screen_on.unwrap());
let keyevent_result = device.keyevent("4"); assert!(keyevent_result.is_ok());
}
#[test]
fn test_click_and_swipe() {
setup_test_environment();
let mut device = create_test_device();
let click_result = device.click(100, 100);
assert!(click_result.is_ok());
let swipe_result = device.swipe(100, 100, 200, 200, 500);
assert!(swipe_result.is_ok());
}
#[test]
fn test_app_operations() {
setup_test_environment();
let mut device = create_test_device();
let app_info = device.app_info(TEST_PACKAGE);
if app_info.is_some() {
let info = app_info.unwrap();
println!(
"App info for {}: version={:?}",
info.package_name, info.version_name
);
}
let stop_result = device.app_stop(TEST_PACKAGE);
assert!(stop_result.is_ok());
let start_result = device.app_start(TEST_PACKAGE);
println!("App start result: {:?}", start_result);
}
#[test]
fn test_network_operations() {
setup_test_environment();
let mut device = create_test_device();
let wlan_ip = device.wlan_ip();
if wlan_ip.is_ok() {
println!("WLAN IP: {}", wlan_ip.unwrap());
}
let forward_result = device.forward("tcp:8080", "tcp:8080", false);
assert!(forward_result.is_ok());
let forward_list = device.forward_list();
assert!(forward_list.is_ok());
println!("Forward list: {:?}", forward_list.unwrap());
}
#[test]
fn test_screenshot() {
setup_test_environment();
let mut device = create_test_device();
let screenshot_result = device.screenshot();
if screenshot_result.is_ok() {
let image = screenshot_result.unwrap();
println!("Screenshot taken: {}x{}", image.width(), image.height());
}
}
#[test]
fn test_logcat() {
setup_test_environment();
let mut device = create_test_device();
let logcat_result = device.logcat(true, None);
assert!(logcat_result.is_ok());
let mut logcat_iter = logcat_result.unwrap();
let mut count = 0;
for line in logcat_iter {
if line.is_ok() {
count += 1;
if count >= 5 {
break;
}
}
}
println!("Read {} logcat lines", count);
}
#[test]
fn test_wifi_operations() {
setup_test_environment();
let mut device = create_test_device();
let wifi_result = device.switch_wifi(true);
println!("WiFi switch result: {:?}", wifi_result);
}
#[test]
fn test_command_types() {
setup_test_environment();
let mut device = create_test_device();
let cmd1 = AdbCommand::single("echo hello");
let result1 = device.shell(cmd1);
println!("Shell command result: {:?}", result1);
assert!(result1.is_ok());
let cmd2 = AdbCommand::multiple(vec!["echo", "world"]);
let result2 = device.shell(cmd2);
assert!(result2.is_ok());
let cmd3 = AdbCommand::from(["echo", "test"]);
let result3 = device.shell(cmd3);
assert!(result3.is_ok());
}
#[test]
fn test_list2cmdline() {
let args = ["echo", "hello world", "test"];
let cmdline = AdbDevice::<&str>::list2cmdline(&args);
assert!(cmdline.contains("\"hello world\""));
println!("Command line: {}", cmdline);
}
}
#[cfg(feature = "tokio_async")]
mod device_async_tests {
use super::*;
use futures_util::{pin_mut, StreamExt};
use radb::beans::NetworkType;
use radb::client::AdbDevice;
use tokio;
async fn create_test_device() -> AdbDevice<&'static str> {
AdbDevice::new(TEST_DEVICE_SERIAL, DEFAULT_ADB_ADDR)
}
#[tokio::test]
async fn test_async_device_state() {
setup_test_environment();
let mut device = create_test_device().await;
let state = device.get_state().await;
assert!(state.is_ok());
println!("Device state: {}", state.unwrap());
}
#[tokio::test]
async fn test_async_shell_command() {
setup_test_environment();
let mut device = create_test_device().await;
let result = device.shell(["echo", "hello"]).await;
assert!(result.is_ok());
assert_eq!(result.unwrap().trim(), "hello");
}
#[tokio::test]
async fn test_async_file_operations() {
setup_test_environment();
let mut device = create_test_device().await;
let exists = device.exists(TEST_DIR).await;
assert!(exists.is_ok());
if exists.unwrap() {
let files = device.list(TEST_DIR).await;
assert!(files.is_ok());
println!("Files in {}: {:?}", TEST_DIR, files.unwrap().len());
}
}
#[tokio::test]
async fn test_async_iter_content() {
setup_test_environment();
let mut device = create_test_device().await;
let test_file = format!("{}/async_test.txt", TEST_DIR);
let _ = device
.shell(["echo", "test content", ">", &test_file])
.await;
let content_stream = device.iter_content(&test_file).await;
assert!(content_stream.is_ok());
let mut content = String::new();
let mut stream = content_stream.unwrap();
pin_mut!(stream);
while let Some(chunk) = stream.next().await {
if let Ok(chunk) = chunk {
content.push_str(&String::from_utf8_lossy(&chunk));
}
}
println!("File content: {}", content);
let _ = device.remove(&test_file).await;
}
#[tokio::test]
async fn test_async_screenshot() {
setup_test_environment();
let mut device = create_test_device().await;
let screenshot_result = device.screenshot().await;
if screenshot_result.is_ok() {
let image = screenshot_result.unwrap();
println!("Screenshot taken: {}x{}", image.width(), image.height());
}
}
#[tokio::test]
async fn test_async_logcat_stream() {
setup_test_environment();
let mut device = create_test_device().await;
let logcat_result = device.logcat(true, None).await;
assert!(logcat_result.is_ok());
let mut logcat_stream = logcat_result.unwrap();
let mut count = 0;
pin_mut!(logcat_stream);
while let Some(line) = logcat_stream.next().await {
if line.is_ok() {
count += 1;
if count >= 3 {
break;
}
}
}
println!("Read {} logcat lines", count);
}
#[tokio::test]
async fn test_async_forward_operations() {
setup_test_environment();
let mut device = create_test_device().await;
let forward_result = device.forward("tcp:9090", "tcp:9090", false).await;
assert!(forward_result.is_ok());
let forward_list = device.forward_list().await;
assert!(forward_list.is_ok());
let remote_port_result = device.forward_remote_port(8080).await;
if remote_port_result.is_ok() {
println!(
"Remote port forwarded to local port: {}",
remote_port_result.unwrap()
);
}
}
#[tokio::test]
async fn test_async_app_operations() {
setup_test_environment();
let mut device = create_test_device().await;
let app_info = device.app_info(TEST_PACKAGE).await;
if app_info.is_some() {
let info = app_info.unwrap();
println!(
"App info for {}: version={:?}",
info.package_name, info.version_name
);
}
let stop_result = device.app_stop(TEST_PACKAGE).await;
assert!(stop_result.is_ok());
}
#[tokio::test]
async fn test_async_network_connection() {
setup_test_environment();
let mut device = create_test_device().await;
let connection_result = device
.create_connection(NetworkType::Tcp, "127.0.0.1:8080")
.await;
println!("Connection result: {:?}", connection_result);
}
#[tokio::test]
async fn test_async_tcpip_mode() {
setup_test_environment();
let mut device = create_test_device().await;
let tcpip_result = device.tcpip(5555).await;
println!("TCPIP mode result: {:?}", tcpip_result);
}
}
#[cfg(feature = "blocking")]
#[test]
fn test_client_device_integration() {
setup_test_environment();
let mut client = AdbClient::default();
let devices = client.list_devices().unwrap();
assert!(!devices.is_empty(), "No devices found for testing");
let mut device = devices.into_iter().next().unwrap();
let state = device.get_state().unwrap();
assert_eq!(state.trim(), "device");
let serial = device.get_serialno().unwrap();
assert!(!serial.trim().is_empty());
println!("Integration test passed with device: {}", serial);
}
#[cfg(feature = "tokio_async")]
#[tokio::test]
async fn test_async_client_device_integration() {
setup_test_environment();
let mut client = AdbClient::default().await;
let devices = client.list_devices().await.unwrap();
assert!(!devices.is_empty(), "No devices found for testing");
let mut device = devices.into_iter().next().unwrap();
let state = device.get_state().await.unwrap();
assert_eq!(state.trim(), "device");
let serial = device.get_serialno().await.unwrap();
assert!(!serial.trim().is_empty());
println!("Async integration test passed with device: {}", serial);
}
#[cfg(feature = "blocking")]
#[test]
fn test_performance_multiple_commands() {
setup_test_environment();
let mut device = AdbDevice::new(TEST_DEVICE_SERIAL, DEFAULT_ADB_ADDR);
let start = std::time::Instant::now();
for i in 0..10 {
let result = device.shell(["echo", &format!("test_{}", i)]);
assert!(result.is_ok());
}
let duration = start.elapsed();
println!("10 commands took: {:?}", duration);
assert!(duration < std::time::Duration::from_secs(10));
}
}
#[cfg(test)]
pub fn run_basic_tests() {
println!("Running basic ADB tests...");
start_adb_server();
#[cfg(feature = "blocking")]
{
let mut client = AdbClient::default();
let devices = client.list_devices().expect("Failed to list devices");
println!("Found {} devices", devices.len());
if !devices.is_empty() {
let mut device = devices.into_iter().next().unwrap();
let state = device.get_state().expect("Failed to get device state");
println!("Device state: {}", state);
}
}
println!("Basic tests completed!");
}