Skip to content

Commit

Permalink
Share test durations between all tests
Browse files Browse the repository at this point in the history
  • Loading branch information
sirhcel committed Aug 2, 2024
1 parent b622588 commit 00e9da0
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 50 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ categories = ["hardware-support"]

[target."cfg(unix)".dependencies]
bitflags = "2.4.0"
cfg-if = "1.0.0"
nix = { version = "0.26", default-features = false, features = ["fs", "ioctl", "poll", "signal", "term"] }

[target.'cfg(all(target_os = "linux", not(target_env = "musl")))'.dependencies]
Expand All @@ -36,6 +35,7 @@ features = [
]

[dependencies]
cfg-if = "1.0.0"
scopeguard = "1.1"
serde = { version = "1.0", features = ["derive"], optional = true }

Expand Down
3 changes: 3 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ mod windows;
#[cfg(windows)]
pub use windows::COMPort;

#[cfg(test)]
pub(crate) mod tests;

/// A type for results generated by interacting with serial ports
///
/// The `Err` type is hard-wired to [`serialport::Error`](struct.Error.html).
Expand Down
28 changes: 3 additions & 25 deletions src/posix/poll.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,35 +108,13 @@ fn clamped_millis_c_int(duration: Duration) -> c_int {
#[cfg(test)]
mod tests {
use super::*;

// TODO: Harmonize with corresponding tests for Windows.
fn monotonicity_test_durations() -> Vec<Duration> {
vec![
Duration::ZERO,
Duration::from_nanos(1),
Duration::from_millis(1),
Duration::from_secs(1),
Duration::from_secs(i16::MAX as u64 - 1),
Duration::from_secs(i16::MAX as u64),
Duration::from_secs(i16::MAX as u64 + 1),
Duration::from_secs(i32::MAX as u64 - 1),
Duration::from_secs(i32::MAX as u64),
Duration::from_secs(i32::MAX as u64 + 1),
Duration::from_secs(i64::MAX as u64 - 1),
Duration::from_secs(i64::MAX as u64),
Duration::from_secs(i64::MAX as u64 + 1),
Duration::from_secs(u64::MAX - 1),
Duration::from_secs(u64::MAX),
Duration::from_secs(u64::MAX) + Duration::from_millis(1),
Duration::MAX,
]
}
use crate::tests::timeout::MONOTONIC_DURATIONS;

#[test]
fn clamped_millis_c_int_is_monotonic() {
let mut last = clamped_millis_c_int(Duration::ZERO);

for (i, d) in monotonicity_test_durations().iter().enumerate() {
for (i, d) in MONOTONIC_DURATIONS.iter().enumerate() {
let next = clamped_millis_c_int(*d);
dbg!((i, d));
assert!(
Expand All @@ -156,7 +134,7 @@ mod tests {
fn clamped_time_spec_is_monotonic() {
let mut last = clamped_time_spec(Duration::ZERO);

for (i, d) in monotonicity_test_durations().iter().enumerate() {
for (i, d) in MONOTONIC_DURATIONS.iter().enumerate() {
let next = clamped_time_spec(*d);
dbg!((i, d));
assert!(
Expand Down
7 changes: 7 additions & 0 deletions src/tests/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
use cfg_if::cfg_if;

cfg_if! {
if #[cfg(test)] {
pub(crate) mod timeout;
}
}
41 changes: 41 additions & 0 deletions src/tests/timeout.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
use std::time::Duration;

/// A sequence of strongly monotonic inrceasing durations. Introduced for testing conversions from
/// `Duration` to platform-specific types.
pub(crate) const MONOTONIC_DURATIONS: [Duration; 17] = [
Duration::ZERO,
Duration::from_nanos(1),
Duration::from_millis(1),
Duration::from_secs(1),
Duration::from_secs(i16::MAX as u64 - 1),
Duration::from_secs(i16::MAX as u64),
Duration::from_secs(i16::MAX as u64 + 1),
Duration::from_secs(i32::MAX as u64 - 1),
Duration::from_secs(i32::MAX as u64),
Duration::from_secs(i32::MAX as u64 + 1),
Duration::from_secs(i64::MAX as u64 - 1),
Duration::from_secs(i64::MAX as u64),
Duration::from_secs(i64::MAX as u64 + 1),
Duration::from_secs(u64::MAX - 1),
Duration::from_secs(u64::MAX),
Duration::new(u64::MAX, 1_000_000),
Duration::MAX,
];

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn basic_durations_properties() {
assert_eq!(Duration::ZERO, *MONOTONIC_DURATIONS.first().unwrap());
assert_eq!(Duration::MAX, *MONOTONIC_DURATIONS.last().unwrap());

// Check that this array is monotonic.
let mut last = MONOTONIC_DURATIONS[0];
for next in MONOTONIC_DURATIONS {
assert!(last <= next);
last = next;
}
}
}
26 changes: 2 additions & 24 deletions src/windows/com.rs
Original file line number Diff line number Diff line change
Expand Up @@ -458,35 +458,13 @@ impl SerialPort for COMPort {
#[cfg(test)]
mod tests {
use super::*;

// TODO: Harmonize with corresponding tests for POSIX.
fn monotonicity_test_durations() -> Vec<Duration> {
vec![
Duration::ZERO,
Duration::from_nanos(1),
Duration::from_millis(1),
Duration::from_secs(1),
Duration::from_secs(i16::MAX as u64 - 1),
Duration::from_secs(i16::MAX as u64),
Duration::from_secs(i16::MAX as u64 + 1),
Duration::from_secs(i32::MAX as u64 - 1),
Duration::from_secs(i32::MAX as u64),
Duration::from_secs(i32::MAX as u64 + 1),
Duration::from_secs(i64::MAX as u64 - 1),
Duration::from_secs(i64::MAX as u64),
Duration::from_secs(i64::MAX as u64 + 1),
Duration::from_secs(u64::MAX - 1),
Duration::from_secs(u64::MAX),
Duration::from_secs(u64::MAX) + Duration::from_millis(1),
Duration::MAX,
]
}
use crate::tests::timeout::MONOTONIC_DURATIONS;

#[test]
fn timeout_constant_is_monotonic() {
let mut last = COMPort::timeout_constant(Duration::ZERO);

for (i, d) in monotonicity_test_durations().iter().enumerate() {
for (i, d) in MONOTONIC_DURATIONS.iter().enumerate() {
let next = COMPort::timeout_constant(*d);
dbg!((i, d));
assert!(
Expand Down

0 comments on commit 00e9da0

Please sign in to comment.