From 89a757b7fca91c72d002e854c65a4bdc63d2e873 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 23 May 2024 19:35:18 -0700 Subject: [PATCH] wifi: Add enum round-trip tests --- src/testing.rs | 32 ++++++++++++++++++++++++++++++++ src/wifi.rs | 44 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/src/testing.rs b/src/testing.rs index ae19cd2..b6eb302 100644 --- a/src/testing.rs +++ b/src/testing.rs @@ -9,6 +9,38 @@ thread_local! { static TEST: RefCell>> = 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()); diff --git a/src/wifi.rs b/src/wifi.rs index 33af2ae..2661211 100644 --- a/src/wifi.rs +++ b/src/wifi.rs @@ -67,7 +67,7 @@ impl TryFrom for WifiDebugMode { impl FromStr for WifiDebugMode { type Err = Error; fn from_str(input: &str) -> Result { - 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 for WifiPowerManagement { impl FromStr for WifiPowerManagement { type Err = Error; fn from_str(input: &str) -> Result { - 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()); + } }