blob: f2647084aaab9df6f23d9e67f3cca376ba6d1b32 [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause
// SPDX-FileCopyrightText: 2022 Linaro Ltd.
// SPDX-FileCopyrightText: 2022 Viresh Kumar <viresh.kumar@linaro.org>
mod common;
mod chip {
use libc::{ENODEV, ENOENT, ENOTTY};
use std::path::PathBuf;
use gpiosim_sys::Sim;
use libgpiod::{chip::Chip, Error as ChipError, OperationType};
mod open {
use super::*;
#[test]
fn nonexistent_file() {
assert_eq!(
Chip::open(&PathBuf::from("/dev/nonexistent")).unwrap_err(),
ChipError::OperationFailed(OperationType::ChipOpen, errno::Errno(ENOENT))
);
}
#[test]
fn no_dev_file() {
assert_eq!(
Chip::open(&PathBuf::from("/tmp")).unwrap_err(),
ChipError::OperationFailed(OperationType::ChipOpen, errno::Errno(ENOTTY))
);
}
#[test]
fn non_gpio_char_dev_file() {
assert_eq!(
Chip::open(&PathBuf::from("/dev/null")).unwrap_err(),
ChipError::OperationFailed(OperationType::ChipOpen, errno::Errno(ENODEV))
);
}
#[test]
fn gpiosim_file() {
let sim = Sim::new(None, None, true).unwrap();
assert!(Chip::open(&sim.dev_path()).is_ok());
}
}
mod verify {
use super::*;
const NGPIO: usize = 16;
const LABEL: &str = "foobar";
#[test]
fn basic_helpers() {
let sim = Sim::new(Some(NGPIO), Some(LABEL), true).unwrap();
let chip = Chip::open(&sim.dev_path()).unwrap();
let info = chip.info().unwrap();
assert_eq!(info.label().unwrap(), LABEL);
assert_eq!(info.name().unwrap(), sim.chip_name());
assert_eq!(chip.path().unwrap(), sim.dev_path().to_str().unwrap());
assert_eq!(info.num_lines(), NGPIO as usize);
}
#[test]
fn find_line() {
let sim = Sim::new(Some(NGPIO), None, false).unwrap();
sim.set_line_name(0, "zero").unwrap();
sim.set_line_name(2, "two").unwrap();
sim.set_line_name(3, "three").unwrap();
sim.set_line_name(5, "five").unwrap();
sim.set_line_name(10, "ten").unwrap();
sim.set_line_name(11, "ten").unwrap();
sim.enable().unwrap();
let chip = Chip::open(&sim.dev_path()).unwrap();
// Success case
assert_eq!(chip.line_offset_from_name("zero").unwrap(), 0);
assert_eq!(chip.line_offset_from_name("two").unwrap(), 2);
assert_eq!(chip.line_offset_from_name("three").unwrap(), 3);
assert_eq!(chip.line_offset_from_name("five").unwrap(), 5);
// Success with duplicate names, should return first entry
assert_eq!(chip.line_offset_from_name("ten").unwrap(), 10);
// Failure
assert_eq!(
chip.line_offset_from_name("nonexistent").unwrap_err(),
ChipError::OperationFailed(
OperationType::ChipGetLineOffsetFromName,
errno::Errno(ENOENT),
)
);
}
}
}