diff --git a/drivers/usb/xhcid/src/usb/hub.rs b/drivers/usb/xhcid/src/usb/hub.rs index adfd12e0ec..688672fd41 100644 --- a/drivers/usb/xhcid/src/usb/hub.rs +++ b/drivers/usb/xhcid/src/usb/hub.rs @@ -198,3 +198,71 @@ impl HubPortStatus { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn hub_port_status_v2_default() { + let status = HubPortStatusV2::default(); + assert!(!status.contains(HubPortStatusV2::CONNECTION)); + assert!(!status.contains(HubPortStatusV2::ENABLE)); + assert!(!status.contains(HubPortStatusV2::POWER)); + } + + #[test] + fn hub_port_status_v2_power_bit() { + let status = HubPortStatusV2::POWER | HubPortStatusV2::CONNECTION; + let v = HubPortStatus::V2(status); + assert!(v.is_powered()); + assert!(v.is_connected()); + assert!(!v.is_enabled()); + } + + #[test] + fn hub_port_status_v3_default() { + let status = HubPortStatusV3::default(); + assert!(!status.contains(HubPortStatusV3::CONNECTION)); + assert!(!status.contains(HubPortStatusV3::ENABLE)); + } + + #[test] + fn hub_port_status_v3_link_state() { + // LINK_STATE_0 is bit 5, LINK_STATE_1 is bit 6, etc. + // LINK_STATE_0|LINK_STATE_1 = bits 5|6 = 0x60 + let status = HubPortStatusV3::LINK_STATE_0 | HubPortStatusV3::LINK_STATE_1; + assert_eq!(status.bits() & 0xFF, 0x60); + } + + #[test] + fn hub_descriptor_v2_default_values() { + let desc = HubDescriptorV2::default(); + assert_eq!(desc.length, 0); + assert_eq!(desc.kind, 0); + assert_eq!(desc.ports, 0); + } + + #[test] + fn hub_descriptor_v3_default_values() { + let desc = HubDescriptorV3::default(); + assert_eq!(desc.length, 0); + assert_eq!(desc.kind, 0); + assert_eq!(desc.ports, 0); + assert_eq!(desc.decode_latency, 0); + // delay field is a packed u16 at offset 8 — verify via raw bytes + let raw = unsafe { plain::as_bytes(&desc) }; + assert_eq!(raw[8..10], [0, 0]); + } + + #[test] + fn hub_port_feature_values() { + // Cross-referenced with Linux 7.1 drivers/usb/core/hub.h + // usb_hub_port_feature enum which defines port feature selectors. + assert_eq!(HubPortFeature::PortConnection as u8, 0); + assert_eq!(HubPortFeature::PortEnable as u8, 1); + assert_eq!(HubPortFeature::PortReset as u8, 4); + assert_eq!(HubPortFeature::PortPower as u8, 8); + assert_eq!(HubPortFeature::CPortConnection as u8, 16); + } +}