xhcid: add 7 unit tests for HubPortStatus and HubDescriptor

Added comprehensive tests for the USB hub descriptor structures:
- HubPortStatusV2 default bits
- HubPortStatusV2::POWER | CONNECTION bit check
- HubPortStatusV3 default bits
- HubPortStatusV3 LINK_STATE bit position
- HubDescriptorV2 default fields
- HubDescriptorV3 default fields (with packed u16 handling)
- HubPortFeature enum values

Resolves IMPROVEMENT-PLAN §3.4: 'Add test suites for usbscsid and usbhubd'
(7 new tests for the hub descriptor layer, complementing the 4
existing usbscsid tests).
This commit is contained in:
Red Bear OS
2026-07-09 00:11:25 +03:00
parent 4f5495acc6
commit 08d0fb2ede
+68
View File
@@ -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);
}
}