Skip to content

Commit 4fc229f

Browse files
test(apollo_network): unit tests for the EventWakerManager struct
1 parent a02b0d2 commit 4fc229f

File tree

6 files changed

+78
-0
lines changed

6 files changed

+78
-0
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ unsigned-varint = "0.8.0"
310310
url = "2.5.0"
311311
validator = "0.12"
312312
void = "1.0.2"
313+
waker-fn = "1"
313314
workspace_tests.path = "workspace_tests"
314315
zstd = "0.13.1"
315316

crates/apollo_network/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ rstest.workspace = true
5454
tokio = { workspace = true, features = ["full", "sync", "test-util"] }
5555
tokio-stream.workspace = true
5656
void.workspace = true
57+
waker-fn.workspace = true
5758

5859
[lints]
5960
workspace = true
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
use super::EventWakerManager;
2+
use crate::discovery::behaviours::test_util::MockWakerWrapper;
3+
4+
#[test]
5+
fn no_wakers_added() {
6+
let mut waker_manager = EventWakerManager::default();
7+
waker_manager.wake();
8+
}
9+
10+
#[test]
11+
fn wakes_all_wakers() {
12+
let waker_wrapper1 = MockWakerWrapper::new();
13+
let waker_wrapper2 = MockWakerWrapper::new();
14+
15+
let mut waker_manager = EventWakerManager::default();
16+
waker_manager.add_waker(waker_wrapper1.get_waker());
17+
waker_manager.add_waker(waker_wrapper2.get_waker());
18+
19+
assert_eq!(waker_wrapper1.times_woken(), 0);
20+
assert_eq!(waker_wrapper2.times_woken(), 0);
21+
22+
waker_manager.wake();
23+
24+
assert_eq!(waker_wrapper1.times_woken(), 1);
25+
assert_eq!(waker_wrapper2.times_woken(), 1);
26+
}
27+
28+
#[test]
29+
fn does_not_wake_waker_twice() {
30+
let waker_wrapper = MockWakerWrapper::new();
31+
32+
let mut waker_manager = EventWakerManager::default();
33+
waker_manager.add_waker(waker_wrapper.get_waker());
34+
35+
waker_manager.wake();
36+
assert_eq!(waker_wrapper.times_woken(), 1);
37+
38+
waker_manager.wake();
39+
assert_eq!(waker_wrapper.times_woken(), 1);
40+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
pub mod bootstrapping;
22
mod event_waker_manager;
33
pub mod kad_requesting;
4+
mod test_util;
45
mod time_waker_manager;
56

7+
#[cfg(test)]
8+
mod event_waker_manager_test;
9+
610
use event_waker_manager::EventWakerManager;
711
use time_waker_manager::TimeWakerManager;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
use std::sync::atomic::{AtomicUsize, Ordering};
2+
use std::sync::Arc;
3+
use std::task::Waker;
4+
5+
use waker_fn::waker_fn;
6+
7+
#[cfg(test)]
8+
pub(super) struct MockWakerWrapper {
9+
times_woken: Arc<AtomicUsize>,
10+
waker: Waker,
11+
}
12+
13+
#[cfg(test)]
14+
impl MockWakerWrapper {
15+
pub fn new() -> Self {
16+
let times_woken = Arc::new(AtomicUsize::new(0));
17+
let times_woken_clone = times_woken.clone();
18+
let waker = waker_fn(move || {
19+
times_woken_clone.fetch_add(1, Ordering::SeqCst);
20+
});
21+
Self { times_woken, waker }
22+
}
23+
24+
pub fn get_waker(&self) -> &Waker {
25+
&self.waker
26+
}
27+
28+
pub fn times_woken(&self) -> usize {
29+
self.times_woken.load(Ordering::SeqCst)
30+
}
31+
}

0 commit comments

Comments
 (0)