Skip to content

Commit eecfe2f

Browse files
feat(swarm): report outcome of handling SwarmEvent
Previously, a user wouldn't know whether passing a `SwarmEvent` to `ListenAddresses` or `ExternalAddresses` changed the state. We now return a boolean where `true` indicates that we handled the event **and** changed state as a result. The API is inspired by `HashSet::insert` and the like. Pull-Request: #3865.
1 parent 1eb929b commit eecfe2f

File tree

5 files changed

+110
-8
lines changed

5 files changed

+110
-8
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.

swarm/CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@
77
This type enforces invariants on protocol names, such as leading forward slashes and correct UTF8 encoding.
88
See [PR 3746].
99

10-
[PR 3746]: https://github.com/libp2p/rust-libp2p/pull/3746
10+
- Return a bool from `ExternalAddresses::on_swarm_event` and `ListenAddresses::on_swarm_event` indicating whether any state was changed.
11+
See [PR 3865].
12+
1113
[PR 3715]: https://github.com/libp2p/rust-libp2p/pull/3715
14+
[PR 3746]: https://github.com/libp2p/rust-libp2p/pull/3746
15+
[PR 3865]: https://github.com/libp2p/rust-libp2p/pull/3865
1216

1317
## 0.42.2
1418

swarm/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ libp2p-swarm-test = { workspace = true }
5151
libp2p-yamux = { workspace = true }
5252
quickcheck = { workspace = true }
5353
void = "1"
54+
once_cell = "1.17.1"
5455

5556
[[test]]
5657
name = "swarm_derive"

swarm/src/behaviour/external_addresses.rs

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,21 +32,67 @@ impl ExternalAddresses {
3232
}
3333

3434
/// Feed a [`FromSwarm`] event to this struct.
35+
///
36+
/// Returns whether the event changed our set of external addresses.
3537
#[allow(deprecated)]
36-
pub fn on_swarm_event<THandler>(&mut self, event: &FromSwarm<THandler>)
38+
pub fn on_swarm_event<THandler>(&mut self, event: &FromSwarm<THandler>) -> bool
3739
where
3840
THandler: IntoConnectionHandler,
3941
{
4042
match event {
4143
FromSwarm::NewExternalAddr(NewExternalAddr { addr, .. }) => {
4244
if self.addresses.len() < self.limit {
43-
self.addresses.insert((*addr).clone());
45+
return self.addresses.insert((*addr).clone());
4446
}
4547
}
4648
FromSwarm::ExpiredExternalAddr(ExpiredExternalAddr { addr, .. }) => {
47-
self.addresses.remove(addr);
49+
return self.addresses.remove(addr)
4850
}
4951
_ => {}
5052
}
53+
54+
false
55+
}
56+
}
57+
58+
#[cfg(test)]
59+
mod tests {
60+
use super::*;
61+
use crate::dummy;
62+
use libp2p_core::multiaddr::Protocol;
63+
use once_cell::sync::Lazy;
64+
65+
#[test]
66+
fn new_external_addr_returns_correct_changed_value() {
67+
let mut addresses = ExternalAddresses::default();
68+
69+
let changed = addresses.on_swarm_event(&new_external_addr());
70+
assert!(changed);
71+
72+
let changed = addresses.on_swarm_event(&new_external_addr());
73+
assert!(!changed)
74+
}
75+
76+
#[test]
77+
fn expired_external_addr_returns_correct_changed_value() {
78+
let mut addresses = ExternalAddresses::default();
79+
addresses.on_swarm_event(&new_external_addr());
80+
81+
let changed = addresses.on_swarm_event(&expired_external_addr());
82+
assert!(changed);
83+
84+
let changed = addresses.on_swarm_event(&expired_external_addr());
85+
assert!(!changed)
86+
}
87+
88+
fn new_external_addr() -> FromSwarm<'static, dummy::ConnectionHandler> {
89+
FromSwarm::NewExternalAddr(NewExternalAddr { addr: &MEMORY_ADDR })
90+
}
91+
92+
fn expired_external_addr() -> FromSwarm<'static, dummy::ConnectionHandler> {
93+
FromSwarm::ExpiredExternalAddr(ExpiredExternalAddr { addr: &MEMORY_ADDR })
5194
}
95+
96+
static MEMORY_ADDR: Lazy<Multiaddr> =
97+
Lazy::new(|| Multiaddr::empty().with(Protocol::Memory(1000)));
5298
}

swarm/src/behaviour/listen_addresses.rs

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,69 @@ impl ListenAddresses {
1717
}
1818

1919
/// Feed a [`FromSwarm`] event to this struct.
20+
///
21+
/// Returns whether the event changed our set of listen addresses.
2022
#[allow(deprecated)]
21-
pub fn on_swarm_event<THandler>(&mut self, event: &FromSwarm<THandler>)
23+
pub fn on_swarm_event<THandler>(&mut self, event: &FromSwarm<THandler>) -> bool
2224
where
2325
THandler: IntoConnectionHandler,
2426
{
2527
match event {
2628
FromSwarm::NewListenAddr(NewListenAddr { addr, .. }) => {
27-
self.addresses.insert((*addr).clone());
29+
self.addresses.insert((*addr).clone())
2830
}
2931
FromSwarm::ExpiredListenAddr(ExpiredListenAddr { addr, .. }) => {
30-
self.addresses.remove(addr);
32+
self.addresses.remove(addr)
3133
}
32-
_ => {}
34+
_ => false,
3335
}
3436
}
3537
}
38+
39+
#[cfg(test)]
40+
mod tests {
41+
use super::*;
42+
use crate::dummy;
43+
use libp2p_core::multiaddr::Protocol;
44+
use once_cell::sync::Lazy;
45+
46+
#[test]
47+
fn new_listen_addr_returns_correct_changed_value() {
48+
let mut addresses = ListenAddresses::default();
49+
50+
let changed = addresses.on_swarm_event(&new_listen_addr());
51+
assert!(changed);
52+
53+
let changed = addresses.on_swarm_event(&new_listen_addr());
54+
assert!(!changed)
55+
}
56+
57+
#[test]
58+
fn expired_listen_addr_returns_correct_changed_value() {
59+
let mut addresses = ListenAddresses::default();
60+
addresses.on_swarm_event(&new_listen_addr());
61+
62+
let changed = addresses.on_swarm_event(&expired_listen_addr());
63+
assert!(changed);
64+
65+
let changed = addresses.on_swarm_event(&expired_listen_addr());
66+
assert!(!changed)
67+
}
68+
69+
fn new_listen_addr() -> FromSwarm<'static, dummy::ConnectionHandler> {
70+
FromSwarm::NewListenAddr(NewListenAddr {
71+
listener_id: Default::default(),
72+
addr: &MEMORY_ADDR,
73+
})
74+
}
75+
76+
fn expired_listen_addr() -> FromSwarm<'static, dummy::ConnectionHandler> {
77+
FromSwarm::ExpiredListenAddr(ExpiredListenAddr {
78+
listener_id: Default::default(),
79+
addr: &MEMORY_ADDR,
80+
})
81+
}
82+
83+
static MEMORY_ADDR: Lazy<Multiaddr> =
84+
Lazy::new(|| Multiaddr::empty().with(Protocol::Memory(1000)));
85+
}

0 commit comments

Comments
 (0)