blob: 4e33b25a15286ba58da54cc7830a81de42e39497 [file] [log] [blame]
mod config;
use config::{hw_config, HardwareConfig};
use rstest::rstest;
use rstest_reuse::{self, apply, template};
use serialport::SerialPort;
use std::ops::Range;
const RESET_BAUD_RATE: u32 = 300;
/// Returs an acceptance interval for the actual baud rate returned from the device after setting
/// the supplied value. For example, the CP2102 driver on Linux returns the baud rate actually
/// configured a the device rather than the the value set.
fn accepted_actual_baud_for(baud: u32) -> Range<u32> {
let delta = baud / 200;
baud.checked_sub(delta).unwrap()..baud.checked_add(delta).unwrap()
}
fn check_baud_rate(port: &dyn SerialPort, baud: u32) {
let accepted = accepted_actual_baud_for(baud);
let actual = port.baud_rate().unwrap();
assert!(accepted.contains(&actual));
}
#[template]
#[rstest]
#[case(9600)]
#[case(57600)]
#[case(115200)]
fn standard_baud_rates(#[case] baud: u32) {}
#[template]
#[rstest]
#[case(1000)]
#[case(42000)]
#[case(100000)]
fn non_standard_baud_rates(#[case] baud: u32) {}
/// Test cases for setting the baud rate via [`SerialPortBuilder`].
mod builder {
use super::*;
#[apply(standard_baud_rates)]
#[cfg_attr(feature = "ignore-hardware-tests", ignore)]
fn test_standard_baud_rate(hw_config: HardwareConfig, #[case] baud: u32) {
let port = serialport::new(hw_config.port_1, RESET_BAUD_RATE)
.baud_rate(baud)
.open()
.unwrap();
check_baud_rate(port.as_ref(), baud);
}
#[apply(non_standard_baud_rates)]
#[cfg_attr(
any(
feature = "ignore-hardware-tests",
not(all(target_os = "linux", target_env = "musl")),
),
ignore
)]
fn test_non_standard_baud_rate_fails_where_not_supported(
hw_config: HardwareConfig,
#[case] baud: u32,
) {
let res = serialport::new(hw_config.port_1, RESET_BAUD_RATE)
.baud_rate(baud)
.open();
assert!(res.is_err());
}
#[apply(non_standard_baud_rates)]
#[cfg_attr(
any(
feature = "ignore-hardware-tests",
all(target_os = "linux", target_env = "musl"),
),
ignore
)]
fn test_non_standard_baud_rate_succeeds_where_supported(
hw_config: HardwareConfig,
#[case] baud: u32,
) {
let port = serialport::new(hw_config.port_1, RESET_BAUD_RATE)
.baud_rate(baud)
.open()
.unwrap();
check_baud_rate(port.as_ref(), baud);
}
}
/// Test cases for setting the baud rate via [`serialport::new`].
mod new {
use super::*;
#[apply(standard_baud_rates)]
#[cfg_attr(feature = "ignore-hardware-tests", ignore)]
fn test_standard_baud_rate(hw_config: HardwareConfig, #[case] baud: u32) {
let port = serialport::new(hw_config.port_1, baud).open().unwrap();
check_baud_rate(port.as_ref(), baud);
}
#[apply(non_standard_baud_rates)]
#[cfg_attr(
any(
feature = "ignore-hardware-tests",
not(all(target_os = "linux", target_env = "musl")),
),
ignore
)]
fn test_non_standard_baud_rate_fails_where_not_supported(
hw_config: HardwareConfig,
#[case] baud: u32,
) {
assert!(serialport::new(hw_config.port_1, baud).open().is_err());
}
#[apply(non_standard_baud_rates)]
#[cfg_attr(
any(
feature = "ignore-hardware-tests",
all(target_os = "linux", target_env = "musl"),
),
ignore
)]
fn test_non_standard_baud_rate_succeeds_where_supported(
hw_config: HardwareConfig,
#[case] baud: u32,
) {
let port = serialport::new(hw_config.port_1, baud).open().unwrap();
check_baud_rate(port.as_ref(), baud);
}
}
/// Test cases for setting the baud rate via [`SerialPort::set_baud`].
mod set_baud {
use super::*;
#[apply(standard_baud_rates)]
#[cfg_attr(feature = "ignore-hardware-tests", ignore)]
fn test_standard_baud_rate(hw_config: HardwareConfig, #[case] baud: u32) {
let mut port = serialport::new(hw_config.port_1, RESET_BAUD_RATE)
.open()
.unwrap();
check_baud_rate(port.as_ref(), RESET_BAUD_RATE);
port.set_baud_rate(baud).unwrap();
check_baud_rate(port.as_ref(), baud);
}
#[apply(non_standard_baud_rates)]
#[cfg_attr(
any(
feature = "ignore-hardware-tests",
not(all(target_os = "linux", target_env = "musl")),
),
ignore
)]
fn test_non_standard_baud_rate_fails_where_not_supported(
hw_config: HardwareConfig,
#[case] baud: u32,
) {
let mut port = serialport::new(hw_config.port_1, RESET_BAUD_RATE)
.open()
.unwrap();
check_baud_rate(port.as_ref(), RESET_BAUD_RATE);
assert!(port.set_baud_rate(baud).is_err());
check_baud_rate(port.as_ref(), RESET_BAUD_RATE);
}
#[apply(non_standard_baud_rates)]
#[cfg_attr(
any(
feature = "ignore-hardware-tests",
all(target_os = "linux", target_env = "musl"),
),
ignore
)]
fn test_non_standard_baud_rate_succeeds_where_supported(
hw_config: HardwareConfig,
#[case] baud: u32,
) {
let mut port = serialport::new(hw_config.port_1, RESET_BAUD_RATE)
.open()
.unwrap();
check_baud_rate(port.as_ref(), RESET_BAUD_RATE);
port.set_baud_rate(baud).unwrap();
check_baud_rate(port.as_ref(), baud);
}
}