use crate::hardware::PlpStatus;
#[cfg_attr(target_os = "macos", allow(dead_code))]
const PLP_DRIVE_TABLE: &[(&str, &str)] = &[
("INTEL", "SSDSC2KB"), ("INTEL", "SSDSC2KG"), ("SOLIDIGM", "SBFPF2BU"), ("SAMSUNG", "PM983"),
("SAMSUNG", "PM9A3"),
("SAMSUNG", "PM1735"),
("SAMSUNG", "PM1733"),
("SAMSUNG", "PM1725"),
("MICRON", "7300"),
("MICRON", "7400"),
("MICRON", "7450"),
("MICRON", "9300"),
("MICRON", "9400"),
("WDC", "ULTRASTAR DC SN"),
("HGST", "ULTRASTAR SN"),
("WESTERN DIGITAL", "ULTRASTAR DC SN"),
("KIOXIA", "CD"), ("KIOXIA", "CM"), ("TOSHIBA", "PX"), ("SEAGATE", "NYTRO"),
];
#[must_use]
#[cfg_attr(target_os = "macos", allow(dead_code))]
pub(crate) fn lookup_table(vendor: &str, model: &str) -> PlpStatus {
let v_upper = vendor.to_ascii_uppercase();
let m_upper = model.to_ascii_uppercase();
for (table_vendor, table_model) in PLP_DRIVE_TABLE {
if v_upper.contains(table_vendor) && m_upper.contains(table_model) {
return PlpStatus::Yes;
}
}
PlpStatus::Unknown
}
#[must_use]
#[allow(dead_code)]
pub(crate) fn merge(a: PlpStatus, b: PlpStatus) -> PlpStatus {
match (a, b) {
(PlpStatus::Yes, _) | (_, PlpStatus::Yes) => PlpStatus::Yes,
(PlpStatus::No, _) | (_, PlpStatus::No) => PlpStatus::No,
_ => PlpStatus::Unknown,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn lookup_table_matches_known_drives() {
assert_eq!(
lookup_table("INTEL", "SSDSC2KB019T801"),
PlpStatus::Yes,
"Intel D3-S4510 should be recognised"
);
assert_eq!(
lookup_table("Samsung", "SAMSUNG MZ PM9A3 960GB"),
PlpStatus::Yes,
"Samsung PM9A3 model strings should be recognised"
);
assert_eq!(
lookup_table("MICRON", "7450 PRO 960GB"),
PlpStatus::Yes,
"Micron 7450 should be recognised"
);
}
#[test]
fn lookup_table_case_insensitive() {
assert_eq!(lookup_table("intel", "ssdsc2kb"), PlpStatus::Yes);
assert_eq!(lookup_table("INTEL", "ssdsc2kb"), PlpStatus::Yes);
assert_eq!(lookup_table("Intel", "SSDSC2KB"), PlpStatus::Yes);
}
#[test]
fn lookup_table_misses_consumer_drives() {
assert_eq!(
lookup_table("Samsung", "980 PRO 1TB"),
PlpStatus::Unknown,
"consumer 980 Pro must NOT match"
);
assert_eq!(
lookup_table("WD", "BLACK SN770 1TB"),
PlpStatus::Unknown,
"consumer SN770 must NOT match"
);
assert_eq!(
lookup_table("CRUCIAL", "P5 PLUS 1TB"),
PlpStatus::Unknown,
"Crucial P5 Plus consumer SSD must NOT match"
);
}
#[test]
fn lookup_table_misses_empty_strings() {
assert_eq!(lookup_table("", ""), PlpStatus::Unknown);
assert_eq!(lookup_table("INTEL", ""), PlpStatus::Unknown);
assert_eq!(lookup_table("", "SSDSC2KB"), PlpStatus::Unknown);
}
#[test]
fn merge_yes_wins() {
assert_eq!(merge(PlpStatus::Yes, PlpStatus::Unknown), PlpStatus::Yes);
assert_eq!(merge(PlpStatus::Unknown, PlpStatus::Yes), PlpStatus::Yes);
assert_eq!(merge(PlpStatus::Yes, PlpStatus::No), PlpStatus::Yes);
assert_eq!(merge(PlpStatus::No, PlpStatus::Yes), PlpStatus::Yes);
}
#[test]
fn merge_no_beats_unknown() {
assert_eq!(merge(PlpStatus::No, PlpStatus::Unknown), PlpStatus::No);
assert_eq!(merge(PlpStatus::Unknown, PlpStatus::No), PlpStatus::No);
}
#[test]
fn merge_unknown_unknown_is_unknown() {
assert_eq!(
merge(PlpStatus::Unknown, PlpStatus::Unknown),
PlpStatus::Unknown
);
}
}