#[cfg(feature = "dangerous-suspend-mode")]
mod suspend_tests {
use brlapi::{BrlApiError, Connection, suspend::SuspendMode};
fn try_connect() -> Result<Connection, BrlApiError> {
Connection::open().or_else(|_| {
Err(BrlApiError::custom(
"No BrlAPI daemon available for testing",
))
})
}
#[test]
fn test_driver_support_detection() {
assert!(!SuspendMode::is_driver_supported("nb"));
assert!(!SuspendMode::is_driver_supported("NoBraille"));
assert!(!SuspendMode::is_driver_supported("fake"));
assert!(!SuspendMode::is_driver_supported("test"));
assert!(!SuspendMode::is_driver_supported("dummy"));
assert!(SuspendMode::is_driver_supported("baum"));
assert!(SuspendMode::is_driver_supported("hims"));
assert!(SuspendMode::is_driver_supported("alva"));
assert!(SuspendMode::is_driver_supported("papenmeier"));
assert!(SuspendMode::is_driver_supported("freedom"));
assert!(SuspendMode::is_driver_supported("unknown_driver"));
}
#[test]
fn test_input_validation() {
let connection = try_connect();
if connection.is_err() {
println!("Skipping suspend mode input validation tests - no BrlAPI daemon");
return;
}
let connection = connection.unwrap();
let result = SuspendMode::enter(&connection, "");
assert!(result.is_err());
if let Err(e) = result {
assert!(e.to_string().contains("empty"));
}
let result = SuspendMode::enter(&connection, "driver\0name");
assert!(result.is_err());
if let Err(e) = result {
assert!(e.to_string().contains("null bytes"));
}
}
#[test]
fn test_suspend_mode_with_current_driver() {
let connection = try_connect();
if connection.is_err() {
println!("Skipping suspend mode current driver test - no BrlAPI daemon");
return;
}
let connection = connection.unwrap();
let current_driver = match connection.display_driver() {
Ok(driver) => driver,
Err(e) => {
println!("Cannot get current driver: {} - skipping test", e);
return;
}
};
println!(
"Testing suspend mode with current driver: {}",
current_driver
);
match SuspendMode::enter(&connection, ¤t_driver) {
Ok(suspend_mode) => {
println!(
"SUCCESS: Entered suspend mode with driver '{}'",
current_driver
);
assert!(suspend_mode.is_suspended());
assert_eq!(suspend_mode.driver_name(), current_driver);
println!("Suspend mode will be automatically resumed via Drop trait");
}
Err(e) => {
println!(
"EXPECTED: Suspend mode failed with driver '{}': {}",
current_driver, e
);
println!("This is normal for most drivers/configurations");
if current_driver == "nb" || current_driver == "NoBraille" {
assert!(
e.to_string().contains("not currently active")
|| e.to_string().contains("suspend")
|| e.to_string().contains("not supported")
);
}
}
}
}
#[test]
fn test_suspend_mode_with_wrong_driver() {
let connection = try_connect();
if connection.is_err() {
println!("Skipping suspend mode wrong driver test - no BrlAPI daemon");
return;
}
let connection = connection.unwrap();
let current_driver = match connection.display_driver() {
Ok(driver) => driver,
Err(e) => {
println!("Cannot get current driver: {} - skipping test", e);
return;
}
};
let wrong_driver = if current_driver == "baum" {
"hims"
} else {
"baum"
};
println!(
"Testing suspend mode with wrong driver: {} (current: {})",
wrong_driver, current_driver
);
let result = SuspendMode::enter(&connection, &wrong_driver);
assert!(result.is_err());
if let Err(e) = result {
let error_msg = e.to_string();
assert!(error_msg.contains("not currently active") || error_msg.contains("not found"));
println!("EXPECTED: Got appropriate error for wrong driver: {}", e);
}
}
#[test]
fn test_manual_resume() {
let connection = try_connect();
if connection.is_err() {
println!("Skipping manual resume test - no BrlAPI daemon");
return;
}
let connection = connection.unwrap();
let current_driver = match connection.display_driver() {
Ok(driver) => driver,
Err(e) => {
println!("Cannot get current driver: {} - skipping test", e);
return;
}
};
match SuspendMode::enter(&connection, ¤t_driver) {
Ok(mut suspend_mode) => {
println!("Testing manual resume with driver '{}'", current_driver);
assert!(suspend_mode.is_suspended());
match suspend_mode.resume() {
Ok(()) => {
println!("SUCCESS: Manual resume succeeded");
assert!(!suspend_mode.is_suspended());
let double_resume = suspend_mode.resume();
assert!(double_resume.is_err());
if let Err(e) = double_resume {
assert!(e.to_string().contains("not currently suspended"));
}
}
Err(e) => {
println!("Manual resume failed: {}", e);
}
}
}
Err(e) => {
println!("Cannot enter suspend mode for manual resume test: {}", e);
println!("This is expected for most test configurations");
}
}
}
#[test]
fn test_suspend_mode_state_tracking() {
let connection = try_connect();
if connection.is_err() {
println!("Skipping state tracking test - no BrlAPI daemon");
return;
}
let connection = connection.unwrap();
let current_driver = match connection.display_driver() {
Ok(driver) => driver,
Err(e) => {
println!("Cannot get current driver: {} - skipping test", e);
return;
}
};
match SuspendMode::enter(&connection, ¤t_driver) {
Ok(suspend_mode) => {
println!("Testing state tracking with driver '{}'", current_driver);
assert!(suspend_mode.is_suspended());
assert_eq!(suspend_mode.driver_name(), current_driver);
assert!(suspend_mode.is_suspended());
assert_eq!(suspend_mode.driver_name(), current_driver);
println!("State tracking test passed");
}
Err(e) => {
println!("Cannot enter suspend mode for state tracking test: {}", e);
println!("This is expected for most test configurations");
}
}
}
#[test]
fn test_suspend_mode_drop_cleanup() {
let connection = try_connect();
if connection.is_err() {
println!("Skipping drop cleanup test - no BrlAPI daemon");
return;
}
let connection = connection.unwrap();
let current_driver = match connection.display_driver() {
Ok(driver) => driver,
Err(e) => {
println!("Cannot get current driver: {} - skipping test", e);
return;
}
};
match SuspendMode::enter(&connection, ¤t_driver) {
Ok(suspend_mode) => {
println!(
"Testing automatic cleanup via Drop trait with driver '{}'",
current_driver
);
assert!(suspend_mode.is_suspended());
drop(suspend_mode);
println!("Drop cleanup completed - driver should be resumed");
}
Err(e) => {
println!("Cannot enter suspend mode for drop cleanup test: {}", e);
println!("This is expected for most test configurations");
}
}
}
#[test]
fn test_error_conditions() {
let connection = try_connect();
if connection.is_err() {
println!("Skipping error conditions test - no BrlAPI daemon");
return;
}
let connection = connection.unwrap();
let error_cases = [
("", "empty driver name"),
("nonexistent_driver_123", "nonexistent driver"),
("driver\0with\0nulls", "null bytes in name"),
];
for (driver_name, description) in error_cases.iter() {
println!("Testing error condition: {}", description);
let result = SuspendMode::enter(&connection, driver_name);
assert!(result.is_err(), "Expected error for {}", description);
if let Err(e) = result {
println!("Got expected error for {}: {}", description, e);
}
}
}
#[test]
fn test_concurrent_suspend_prevention() {
let connection = try_connect();
if connection.is_err() {
println!("Skipping concurrent suspend test - no BrlAPI daemon");
return;
}
let connection = connection.unwrap();
let current_driver = match connection.display_driver() {
Ok(driver) => driver,
Err(e) => {
println!("Cannot get current driver: {} - skipping test", e);
return;
}
};
match SuspendMode::enter(&connection, ¤t_driver) {
Ok(_suspend_mode1) => {
println!("First suspend mode entered successfully");
let result2 = SuspendMode::enter(&connection, ¤t_driver);
match result2 {
Ok(_) => {
println!(
"WARNING: Second suspend mode succeeded - this may not be expected"
);
}
Err(e) => {
println!("EXPECTED: Second suspend mode failed: {}", e);
}
}
}
Err(e) => {
println!("Cannot enter suspend mode for concurrent test: {}", e);
println!("This is expected for most test configurations");
}
}
}
}
#[test]
fn test_feature_flag_requirement() {
#[cfg(feature = "dangerous-suspend-mode")]
{
let _ = brlapi::suspend::SuspendMode::is_driver_supported("test");
println!("Suspend mode feature is enabled");
}
#[cfg(not(feature = "dangerous-suspend-mode"))]
{
println!("Suspend mode feature is disabled (as expected without feature flag)");
}
}