From e21153671bccfb98c3cdc5d4104197de10c77ee5 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 30 May 2025 16:05:47 -0700 Subject: [PATCH 1/2] screenreader: Enable or disable orca unit as needed --- src/screenreader.rs | 54 +++++++++++++++++++++++++++++++-------------- src/systemd.rs | 2 -- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/screenreader.rs b/src/screenreader.rs index 9331216..6183b52 100644 --- a/src/screenreader.rs +++ b/src/screenreader.rs @@ -267,51 +267,71 @@ impl<'dbus> OrcaManager<'dbus> { Ok(write(self.settings_path()?, data.as_bytes()).await?) } - #[cfg(not(test))] async fn restart_orca(&self) -> Result<()> { trace!("Restarting orca..."); + self.orca_unit.enable().await?; self.orca_unit.restart().await } - #[cfg(test)] - async fn restart_orca(&self) -> Result<()> { - Ok(()) - } - - #[cfg(not(test))] async fn stop_orca(&self) -> Result<()> { trace!("Stopping orca..."); + self.orca_unit.disable().await?; self.orca_unit.stop().await } - - #[cfg(test)] - async fn stop_orca(&self) -> Result<()> { - Ok(()) - } } #[cfg(test)] mod test { use super::*; + use crate::systemd::test::{MockManager, MockUnit}; + use crate::systemd::EnableState; use crate::testing; + use std::time::Duration; use tokio::fs::{copy, remove_file}; + use tokio::time::sleep; #[tokio::test] async fn test_enable_disable() { let mut h = testing::start(); + let mut unit = MockUnit::default(); + unit.active = String::from("inactive"); + unit.unit_file = String::from("disabled"); + let connection = h.new_dbus().await.expect("dbus"); + connection + .request_name("org.freedesktop.systemd1") + .await + .expect("request_name"); + let object_server = connection.object_server(); + object_server + .at("/org/freedesktop/systemd1/unit/orca_2eservice", unit) + .await + .expect("at"); + object_server + .at("/org/freedesktop/systemd1", MockManager::default()) + .await + .expect("at"); + + sleep(Duration::from_millis(10)).await; + + let unit = SystemdUnit::new(connection.clone(), "orca.service") + .await + .expect("unit"); copy(TEST_ORCA_SETTINGS, h.test.path().join(ORCA_SETTINGS)) .await .unwrap(); - let mut manager = OrcaManager::new(&h.new_dbus().await.expect("new_dbus")) + + let mut manager = OrcaManager::new(&connection) .await .expect("OrcaManager::new"); - let enable_result = manager.set_enabled(true).await; - assert!(enable_result.is_ok()); + manager.set_enabled(true).await.unwrap(); assert_eq!(manager.enabled(), true); + assert_eq!(unit.active().await.unwrap(), true); + assert_eq!(unit.enabled().await.unwrap(), EnableState::Enabled); - let disable_result = manager.set_enabled(false).await; - assert!(disable_result.is_ok()); + manager.set_enabled(false).await.unwrap(); assert_eq!(manager.enabled(), false); + assert_eq!(unit.active().await.unwrap(), false); + assert_eq!(unit.enabled().await.unwrap(), EnableState::Disabled); } #[tokio::test] diff --git a/src/systemd.rs b/src/systemd.rs index 310b82a..879b836 100644 --- a/src/systemd.rs +++ b/src/systemd.rs @@ -115,7 +115,6 @@ impl<'dbus> SystemdUnit<'dbus> { Ok(()) } - #[allow(unused)] pub async fn enable(&self) -> Result { let manager = SystemdManagerProxy::new(&self.connection).await?; let (_, res) = manager @@ -124,7 +123,6 @@ impl<'dbus> SystemdUnit<'dbus> { Ok(!res.is_empty()) } - #[allow(unused)] pub async fn disable(&self) -> Result { let manager = SystemdManagerProxy::new(&self.connection).await?; let res = manager From 874b79900530308f46bd2fc72ac0198cf227c90d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 30 May 2025 17:32:19 -0700 Subject: [PATCH 2/2] screenreader: Don't fail enabling if orca settings aren't present --- src/screenreader.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/screenreader.rs b/src/screenreader.rs index 6183b52..afb3666 100644 --- a/src/screenreader.rs +++ b/src/screenreader.rs @@ -10,6 +10,7 @@ use gio::{prelude::SettingsExt, Settings}; use lazy_static::lazy_static; use serde_json::{Map, Value}; use std::collections::HashMap; +use std::io::ErrorKind; use std::ops::RangeInclusive; use std::path::PathBuf; use tokio::fs::{read_to_string, write}; @@ -105,7 +106,12 @@ impl<'dbus> OrcaManager<'dbus> { .set_boolean(SCREEN_READER_SETTING, enable) .map_err(|e| anyhow!("Unable to set screen reader enabled gsetting, {e}"))?; } - self.set_orca_enabled(enable).await?; + if let Err(e) = self.set_orca_enabled(enable).await { + match e.downcast_ref::() { + Some(e) if e.kind() == ErrorKind::NotFound => (), + _ => return Err(e), + } + } if enable { self.restart_orca().await?; } else { @@ -316,9 +322,6 @@ mod test { let unit = SystemdUnit::new(connection.clone(), "orca.service") .await .expect("unit"); - copy(TEST_ORCA_SETTINGS, h.test.path().join(ORCA_SETTINGS)) - .await - .unwrap(); let mut manager = OrcaManager::new(&connection) .await @@ -332,6 +335,21 @@ mod test { assert_eq!(manager.enabled(), false); assert_eq!(unit.active().await.unwrap(), false); assert_eq!(unit.enabled().await.unwrap(), EnableState::Disabled); + + copy(TEST_ORCA_SETTINGS, h.test.path().join(ORCA_SETTINGS)) + .await + .unwrap(); + manager.load_values().await.unwrap(); + + manager.set_enabled(true).await.unwrap(); + assert_eq!(manager.enabled(), true); + assert_eq!(unit.active().await.unwrap(), true); + assert_eq!(unit.enabled().await.unwrap(), EnableState::Enabled); + + manager.set_enabled(false).await.unwrap(); + assert_eq!(manager.enabled(), false); + assert_eq!(unit.active().await.unwrap(), false); + assert_eq!(unit.enabled().await.unwrap(), EnableState::Disabled); } #[tokio::test]