Files
firezone/rust/libs/bin-shared/tests/network_notifiers.rs
Thomas Eizinger b7dc897eea refactor(rust): introduce libs/ directory (#10964)
The current Rust workspace isn't as consistent as it could be. To make
navigation a bit easier, we move a few crates around. Generally, we
follow the idea that entry-points should be at the top-level. `rust/`
now looks like this (directories only):

```
.
├── cli             # Firezone CLI
├── client-ffi      # Entry point for Apple & Android
├── gateway         # Gateway
├── gui-client      # GUI client
├── headless-client # Headless client
├── libs            # Library crates
├── relay           # Relay
├── target          # Compile artifacts
├── tests           # Crates for testing
└── tools           # Local tools
```

To further enforce this structure, we also drop the `firezone-` prefix
from all crates that are not top-level binary crates.
2025-11-25 10:59:11 +00:00

46 lines
1.6 KiB
Rust

#![allow(clippy::unwrap_used)]
use bin_shared::{DnsControlMethod, new_dns_notifier, new_network_notifier};
use futures::future::FutureExt as _;
use std::time::Duration;
use tokio::time::timeout;
/// Smoke test for the DNS and network change notifiers
///
/// Turn them on, wait a second, turn them off.
/// This tests that the threads quit gracefully when we call `close`, and they don't crash on startup.
#[tokio::test]
async fn notifiers() {
logging::test_global("debug");
let tokio_handle = tokio::runtime::Handle::current();
let mut dns = new_dns_notifier(tokio_handle.clone(), DnsControlMethod::default())
.await
.unwrap();
let mut net = new_network_notifier(tokio_handle, DnsControlMethod::default())
.await
.unwrap();
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
// The notifiers always notify once they start listening for changes, to avoid gaps during startup.
timeout(Duration::from_secs(1), dns.notified())
.await
.unwrap()
.unwrap();
timeout(Duration::from_secs(1), net.notified())
.await
.unwrap()
.unwrap();
// After that first notification, we shouldn't get any other notifications during a normal unit test.
assert!(dns.notified().now_or_never().is_none());
assert!(net.notified().now_or_never().is_none());
// `close` consumes the notifiers, so we can catch errors and can't call any methods on a closed notifier. If the notifier is dropped, we internally call the same code that `close` calls.
dns.close().unwrap();
net.close().unwrap();
}