usbfs 0.1.1

Port of the usbfs Linux userspace library in pure Rust
Documentation
use usbfs::*;

// FIXME: currently returns a constant, it should dynamically detect a valid USB file descriptor.
//
// Most relevant is the CI context, where a pseudo-device needs to be mocked for deterministic tests.
fn get_usb_fd() -> i32 {
    0
}

#[test]
fn test_control() -> Result<()> {
    let fd = get_usb_fd();
    let mut control = UsbfsCtrlTransfer::new()
        // ENDPOINT_IN
        .with_request_type(0x80)
        // USB_GET_CONFIGURATION
        .with_request(0x08)
        .with_timeout(1000)
        .with_data([0u8]);

    usbfs_control(fd, &mut control).ok();

    Ok(())
}

#[test]
fn test_set_release_iface() -> Result<()> {
    let fd = get_usb_fd();
    let mut set_iface = UsbfsSetInterface::create(1, 0);

    usbfs_set_interface(fd, &mut set_iface).ok();
    usbfs_claim_interface(fd, set_iface.interface_mut()).ok();
    usbfs_release_interface(fd, set_iface.interface_mut()).ok();

    Ok(())
}

#[test]
fn test_set_configuration() -> Result<()> {
    let fd = get_usb_fd();
    let mut config = 0u32;

    usbfs_set_configuration(fd, &mut config).ok();

    Ok(())
}

#[test]
fn test_get_driver() -> Result<()> {
    let fd = get_usb_fd();
    let mut driver = UsbfsGetDriver::new().with_interface(0);

    usbfs_get_driver(fd, &mut driver).ok();

    Ok(())
}

#[test]
fn test_submit_urb() -> Result<()> {
    let fd = get_usb_fd();
    let mut urb = Urb::new()
        // URB_TYPE_CONTROL
        .with_urb_type(2)
        .with_buffer([0; 4]);

    usbfs_submit_urb(fd, &mut urb).ok();

    Ok(())
}

#[test]
fn test_discard_urb() -> Result<()> {
    let fd = get_usb_fd();

    usbfs_discard_urb(fd).ok();

    Ok(())
}

#[test]
fn test_reap_urb_ndelay() -> Result<()> {
    let fd = get_usb_fd();
    let mut urb = Urb::new()
        // URB_TYPE_CONTROL
        .with_urb_type(2)
        .with_buffer([0; 4]);

    usbfs_reap_urb_ndelay(fd, &mut urb).ok();

    Ok(())
}

#[test]
fn test_connect_info() -> Result<()> {
    let fd = get_usb_fd();
    let mut info = UsbfsConnectInfo::create(1, 42);

    usbfs_connect_info(fd, &mut info).ok();

    Ok(())
}

#[test]
fn test_ioctl() -> Result<()> {
    let fd = get_usb_fd();
    let mut ioctl = UsbfsIoctl::new().with_ifno(1).with_ioctl_code(18);

    usbfs_ioctl(fd, &mut ioctl).ok();

    Ok(())
}

#[test]
fn test_reset() -> Result<()> {
    let fd = get_usb_fd();

    usbfs_reset(fd).ok();

    Ok(())
}

#[test]
fn test_clear_halt() -> Result<()> {
    let fd = get_usb_fd();
    let mut iface = 1u32;

    usbfs_clear_halt(fd, &mut iface).ok();

    Ok(())
}

#[test]
fn test_disconnect() -> Result<()> {
    let fd = get_usb_fd();

    usbfs_disconnect(fd).ok();

    Ok(())
}

#[test]
fn test_connect() -> Result<()> {
    let fd = get_usb_fd();

    usbfs_connect(fd).ok();

    Ok(())
}

#[test]
fn test_get_capabilities() -> Result<()> {
    let fd = get_usb_fd();
    let mut iface = 1u32;

    usbfs_get_capabilities(fd, &mut iface).ok();

    Ok(())
}

#[test]
fn test_disconnect_claim() -> Result<()> {
    let fd = get_usb_fd();
    let mut claim = UsbfsDisconnectClaim::new();

    usbfs_disconnect_claim(fd, &mut claim).ok();

    Ok(())
}

#[test]
fn test_alloc_streams() -> Result<()> {
    let fd = get_usb_fd();
    let mut streams = UsbfsStreams::new();

    usbfs_alloc_streams(fd, &mut streams).ok();

    Ok(())
}

#[test]
fn test_free_streams() -> Result<()> {
    let fd = get_usb_fd();
    let mut streams = UsbfsStreams::new();

    usbfs_free_streams(fd, &mut streams).ok();

    Ok(())
}

#[test]
fn test_drop_privileges() -> Result<()> {
    let fd = get_usb_fd();
    let privileges = 0u64;

    usbfs_drop_privileges(fd, privileges).ok();

    Ok(())
}

#[test]
fn test_get_speed() -> Result<()> {
    let fd = get_usb_fd();

    usbfs_get_speed(fd).ok();

    Ok(())
}