lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

commit 5b03042ddd2d0a538c42b3769656113d4879ce31
parent 151c84b967b34c029711dccd790924426f2dd4d3
Author: triesap <tyson@radroots.org>
Date:   Wed,  3 Jun 2026 14:47:44 -0700

sdk: preserve config test env values

- save local SDK env values as OsString
- restore original env values losslessly
- cover portable OsString restore behavior
- cover Unix non-Unicode env restore behavior

Diffstat:
Mcrates/sdk/tests/config.rs | 79++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 76 insertions(+), 3 deletions(-)

diff --git a/crates/sdk/tests/config.rs b/crates/sdk/tests/config.rs @@ -4,7 +4,10 @@ use radroots_sdk::{ RADROOTS_SDK_STAGING_RADROOTSD_ENDPOINT, RADROOTS_SDK_STAGING_RELAY_URL, RadrootsSdkConfig, RadrootsdAuth, SdkConfigError, SdkEnvironment, SdkTransportMode, SignerConfig, }; -use std::sync::{Mutex, OnceLock}; +use std::{ + ffi::OsString, + sync::{Mutex, OnceLock}, +}; const LOCAL_SDK_ENV_KEYS: &[&str] = &[ "NOSTR_RS_RELAY_PUBLIC_SCHEME", @@ -21,14 +24,14 @@ fn sdk_env_lock() -> &'static Mutex<()> { } struct LocalSdkEnvRestore { - saved: Vec<(&'static str, Option<String>)>, + saved: Vec<(&'static str, Option<OsString>)>, } impl LocalSdkEnvRestore { fn apply(pairs: &[(&str, &str)]) -> Self { let saved = LOCAL_SDK_ENV_KEYS .iter() - .map(|key| (*key, std::env::var(key).ok())) + .map(|key| (*key, std::env::var_os(key))) .collect::<Vec<_>>(); for key in LOCAL_SDK_ENV_KEYS { @@ -65,6 +68,33 @@ impl Drop for LocalSdkEnvRestore { } } +struct EnvKeyRestore { + key: &'static str, + saved: Option<OsString>, +} + +impl EnvKeyRestore { + fn capture(key: &'static str) -> Self { + Self { + key, + saved: std::env::var_os(key), + } + } +} + +impl Drop for EnvKeyRestore { + fn drop(&mut self) { + match &self.saved { + Some(value) => unsafe { + std::env::set_var(self.key, value); + }, + None => unsafe { + std::env::remove_var(self.key); + }, + } + } +} + fn with_local_sdk_env<F>(pairs: &[(&str, &str)], test: F) where F: FnOnce(), @@ -76,6 +106,49 @@ where } #[test] +fn local_sdk_env_restore_preserves_original_os_string_values() { + let _guard = sdk_env_lock().lock().expect("sdk env lock"); + let key = "NOSTR_RS_RELAY_PUBLIC_HOST"; + let _restore_key = EnvKeyRestore::capture(key); + let original = OsString::from("relay.before.example"); + + unsafe { + std::env::set_var(key, &original); + } + + { + let _env_restore = LocalSdkEnvRestore::apply(&[("RADROOTSD_RPC_PORT", "18080")]); + + assert_eq!(std::env::var_os(key), None); + } + + assert_eq!(std::env::var_os(key), Some(original)); +} + +#[cfg(unix)] +#[test] +fn local_sdk_env_restore_preserves_non_unicode_original_values() { + use std::os::unix::ffi::OsStringExt; + + let _guard = sdk_env_lock().lock().expect("sdk env lock"); + let key = "NOSTR_RS_RELAY_PUBLIC_HOST"; + let _restore_key = EnvKeyRestore::capture(key); + let original = OsString::from_vec(vec![b'r', b'e', b'l', b'a', b'y', 0x80]); + + unsafe { + std::env::set_var(key, &original); + } + + { + let _env_restore = LocalSdkEnvRestore::apply(&[("RADROOTSD_RPC_PORT", "18080")]); + + assert_eq!(std::env::var_os(key), None); + } + + assert_eq!(std::env::var_os(key), Some(original)); +} + +#[test] fn default_config_uses_production_relay_direct_draft_only() { let config = RadrootsSdkConfig::default();