use super::Method;
#[must_use]
pub(super) fn resolve_auto() -> Method {
use crate::hardware;
let io = hardware::io_primitives();
let drive = hardware::drive();
resolve_auto_inner(drive.kind, io.io_uring)
}
#[cfg(target_os = "linux")]
fn resolve_auto_inner(kind: crate::hardware::drive::DriveKind, io_uring_available: bool) -> Method {
use crate::hardware::drive::DriveKind;
match kind {
DriveKind::Nvme if io_uring_available => Method::Direct,
DriveKind::Nvme => Method::Data,
DriveKind::SataSsd => Method::Data,
DriveKind::Hdd | DriveKind::Unknown => Method::Sync,
}
}
#[cfg(target_os = "macos")]
fn resolve_auto_inner(
kind: crate::hardware::drive::DriveKind,
_io_uring_available: bool,
) -> Method {
use crate::hardware::drive::DriveKind;
match kind {
DriveKind::Nvme => Method::Direct,
DriveKind::SataSsd | DriveKind::Hdd | DriveKind::Unknown => Method::Sync,
}
}
#[cfg(target_os = "windows")]
fn resolve_auto_inner(
kind: crate::hardware::drive::DriveKind,
_io_uring_available: bool,
) -> Method {
use crate::hardware::drive::DriveKind;
match kind {
DriveKind::Nvme | DriveKind::SataSsd => Method::Direct,
DriveKind::Hdd | DriveKind::Unknown => Method::Sync,
}
}
#[cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows")))]
fn resolve_auto_inner(
_kind: crate::hardware::drive::DriveKind,
_io_uring_available: bool,
) -> Method {
Method::Sync
}
#[cfg(test)]
mod tests {
use super::*;
use crate::hardware::drive::DriveKind;
#[test]
fn test_resolve_auto_returns_concrete() {
let r = resolve_auto();
assert!(
matches!(r, Method::Sync | Method::Data | Method::Direct),
"Auto must resolve to Sync/Data/Direct; got {:?}",
r
);
}
#[test]
#[cfg(target_os = "linux")]
fn test_linux_nvme_with_io_uring_picks_direct() {
assert_eq!(resolve_auto_inner(DriveKind::Nvme, true), Method::Direct);
}
#[test]
#[cfg(target_os = "linux")]
fn test_linux_nvme_without_io_uring_picks_data() {
assert_eq!(resolve_auto_inner(DriveKind::Nvme, false), Method::Data);
}
#[test]
#[cfg(target_os = "linux")]
fn test_linux_sata_ssd_picks_data() {
assert_eq!(resolve_auto_inner(DriveKind::SataSsd, true), Method::Data);
assert_eq!(resolve_auto_inner(DriveKind::SataSsd, false), Method::Data);
}
#[test]
#[cfg(target_os = "linux")]
fn test_linux_hdd_picks_sync() {
assert_eq!(resolve_auto_inner(DriveKind::Hdd, true), Method::Sync);
assert_eq!(resolve_auto_inner(DriveKind::Hdd, false), Method::Sync);
}
#[test]
#[cfg(target_os = "linux")]
fn test_linux_unknown_picks_sync() {
assert_eq!(resolve_auto_inner(DriveKind::Unknown, true), Method::Sync);
assert_eq!(resolve_auto_inner(DriveKind::Unknown, false), Method::Sync);
}
#[test]
#[cfg(target_os = "macos")]
fn test_macos_nvme_picks_direct() {
assert_eq!(resolve_auto_inner(DriveKind::Nvme, false), Method::Direct);
}
#[test]
#[cfg(target_os = "macos")]
fn test_macos_non_nvme_picks_sync() {
assert_eq!(resolve_auto_inner(DriveKind::SataSsd, false), Method::Sync);
assert_eq!(resolve_auto_inner(DriveKind::Hdd, false), Method::Sync);
assert_eq!(resolve_auto_inner(DriveKind::Unknown, false), Method::Sync);
}
#[test]
#[cfg(target_os = "windows")]
fn test_windows_nvme_picks_direct() {
assert_eq!(resolve_auto_inner(DriveKind::Nvme, false), Method::Direct);
}
#[test]
#[cfg(target_os = "windows")]
fn test_windows_sata_ssd_picks_direct() {
assert_eq!(
resolve_auto_inner(DriveKind::SataSsd, false),
Method::Direct
);
}
#[test]
#[cfg(target_os = "windows")]
fn test_windows_hdd_or_unknown_picks_sync() {
assert_eq!(resolve_auto_inner(DriveKind::Hdd, false), Method::Sync);
assert_eq!(resolve_auto_inner(DriveKind::Unknown, false), Method::Sync);
}
}