wifi: Add enum round-trip tests

This commit is contained in:
Vicki Pfau 2024-05-23 19:35:18 -07:00
parent b7b09e6c17
commit 89a757b7fc
2 changed files with 73 additions and 3 deletions

View file

@ -9,6 +9,38 @@ thread_local! {
static TEST: RefCell<Option<Rc<Test>>> = RefCell::new(None);
}
#[macro_export]
macro_rules! enum_roundtrip {
($enum:ident => $value:literal : str = $variant:ident) => {
assert_eq!($enum::$variant.to_string(), $value);
assert_eq!($enum::from_str($value).unwrap(), $enum::$variant);
};
($enum:ident => $value:literal : $ty:ty = $variant:ident) => {
assert_eq!($enum::$variant as $ty, $value);
assert_eq!($enum::try_from($value), Ok($enum::$variant));
};
($enum:ident { $($value:literal : $ty:ident = $variant:ident,)+ }) => {
$(enum_roundtrip!($enum => $value : $ty = $variant);)+
};
}
#[macro_export]
macro_rules! enum_on_off {
($enum:ident => ($on:ident, $off:ident)) => {
assert_eq!($enum::from_str("on").unwrap(), $enum::$on);
assert_eq!($enum::from_str("On").unwrap(), $enum::$on);
assert_eq!($enum::from_str("enable").unwrap(), $enum::$on);
assert_eq!($enum::from_str("enabled").unwrap(), $enum::$on);
assert_eq!($enum::from_str("1").unwrap(), $enum::$on);
assert_eq!($enum::from_str("off").unwrap(), $enum::$off);
assert_eq!($enum::from_str("Off").unwrap(), $enum::$off);
assert_eq!($enum::from_str("disable").unwrap(), $enum::$off);
assert_eq!($enum::from_str("disabled").unwrap(), $enum::$off);
assert_eq!($enum::from_str("0").unwrap(), $enum::$off);
}
}
pub fn start() -> TestHandle {
TEST.with(|lock| {
assert!(lock.borrow().as_ref().is_none());

View file

@ -67,7 +67,7 @@ impl TryFrom<u32> for WifiDebugMode {
impl FromStr for WifiDebugMode {
type Err = Error;
fn from_str(input: &str) -> Result<WifiDebugMode, Self::Err> {
Ok(match input {
Ok(match input.to_lowercase().as_str() {
"enable" | "enabled" | "on" | "1" => WifiDebugMode::On,
"disable" | "disabled" | "off" | "0" => WifiDebugMode::Off,
v => bail!("No enum match for value {v}"),
@ -98,7 +98,7 @@ impl TryFrom<u32> for WifiPowerManagement {
impl FromStr for WifiPowerManagement {
type Err = Error;
fn from_str(input: &str) -> Result<WifiPowerManagement, Self::Err> {
Ok(match input {
Ok(match input.to_lowercase().as_str() {
"enable" | "enabled" | "on" | "1" => WifiPowerManagement::Enabled,
"disable" | "disabled" | "off" | "0" => WifiPowerManagement::Disabled,
v => bail!("No enum match for value {v}"),
@ -292,7 +292,7 @@ pub(crate) async fn set_wifi_power_management_state(state: WifiPowerManagement)
#[cfg(test)]
mod test {
use super::*;
use crate::testing;
use crate::{enum_on_off, enum_roundtrip, testing};
use tokio::fs::{create_dir_all, read_to_string, remove_dir, try_exists, write};
#[test]
@ -379,4 +379,42 @@ mod test {
WifiBackend::WPASupplicant
);
}
#[test]
fn wifi_debug_mode_roundtrip() {
enum_roundtrip!(WifiDebugMode {
0: u32 = Off,
1: u32 = On,
"Off": str = Off,
"On": str = On,
});
enum_on_off!(WifiDebugMode => (On, Off));
assert!(WifiDebugMode::try_from(2).is_err());
assert!(WifiDebugMode::from_str("onf").is_err());
}
#[test]
fn wifi_power_management_roundtrip() {
enum_roundtrip!(WifiPowerManagement {
0: u32 = Disabled,
1: u32 = Enabled,
"Disabled": str = Disabled,
"Enabled": str = Enabled,
});
enum_on_off!(WifiPowerManagement => (Enabled, Disabled));
assert!(WifiPowerManagement::try_from(2).is_err());
assert!(WifiPowerManagement::from_str("onf").is_err());
}
#[test]
fn wifi_backend_roundtrip() {
enum_roundtrip!(WifiBackend {
0: u32 = Iwd,
1: u32 = WPASupplicant,
"iwd": str = Iwd,
"wpa_supplicant": str = WPASupplicant,
});
assert!(WifiBackend::try_from(2).is_err());
assert!(WifiBackend::from_str("iwl").is_err());
}
}