Skip to content

Commit 66c2755

Browse files
swarm/: Fix rare test failure of multiple_addresses_err (#2882)
In case we accidentally generate the same port twice, we will try to issue two dial attempts to the same address but also expect two dial errors which is exactly what this test is trying to catch. Unfortunately, the assertion is badly written and does not catch duplicate inputs.
1 parent 457fb51 commit 66c2755

File tree

1 file changed

+28
-38
lines changed

1 file changed

+28
-38
lines changed

swarm/src/lib.rs

Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,7 +1624,6 @@ mod tests {
16241624
use libp2p_core::transport::TransportEvent;
16251625
use libp2p_core::Endpoint;
16261626
use quickcheck::{quickcheck, Arbitrary, Gen, QuickCheck};
1627-
use rand::prelude::SliceRandom;
16281627
use rand::Rng;
16291628

16301629
// Test execution state.
@@ -2425,60 +2424,51 @@ mod tests {
24252424
assert!(!swarm.is_connected(&peer_id));
24262425
}
24272426

2428-
#[test]
2429-
fn multiple_addresses_err() {
2427+
#[async_std::test]
2428+
async fn multiple_addresses_err() {
24302429
// Tries dialing multiple addresses, and makes sure there's one dialing error per address.
24312430

24322431
let target = PeerId::random();
24332432

24342433
let mut swarm = new_test_swarm::<_, ()>(DummyConnectionHandler::default()).build();
24352434

2436-
let mut addresses = Vec::new();
2437-
for _ in 0..3 {
2438-
addresses.push(multiaddr![Ip4([0, 0, 0, 0]), Tcp(rand::random::<u16>())]);
2439-
}
2440-
for _ in 0..5 {
2441-
addresses.push(multiaddr![Udp(rand::random::<u16>())]);
2442-
}
2443-
addresses.shuffle(&mut rand::thread_rng());
2435+
let addresses = HashSet::from([
2436+
multiaddr![Ip4([0, 0, 0, 0]), Tcp(rand::random::<u16>())],
2437+
multiaddr![Ip4([0, 0, 0, 0]), Tcp(rand::random::<u16>())],
2438+
multiaddr![Ip4([0, 0, 0, 0]), Tcp(rand::random::<u16>())],
2439+
multiaddr![Udp(rand::random::<u16>())],
2440+
multiaddr![Udp(rand::random::<u16>())],
2441+
multiaddr![Udp(rand::random::<u16>())],
2442+
multiaddr![Udp(rand::random::<u16>())],
2443+
multiaddr![Udp(rand::random::<u16>())],
2444+
]);
24442445

24452446
swarm
24462447
.dial(
24472448
DialOpts::peer_id(target)
2448-
.addresses(addresses.clone())
2449+
.addresses(addresses.iter().cloned().collect())
24492450
.build(),
24502451
)
24512452
.unwrap();
24522453

2453-
futures::executor::block_on(future::poll_fn(|cx| -> Poll<Result<(), io::Error>> {
2454-
loop {
2455-
match swarm.poll_next_unpin(cx) {
2456-
Poll::Ready(Some(SwarmEvent::OutgoingConnectionError {
2457-
peer_id,
2458-
// multiaddr,
2459-
error: DialError::Transport(errors),
2460-
})) => {
2461-
assert_eq!(peer_id.unwrap(), target);
2454+
match swarm.next().await.unwrap() {
2455+
SwarmEvent::OutgoingConnectionError {
2456+
peer_id,
2457+
// multiaddr,
2458+
error: DialError::Transport(errors),
2459+
} => {
2460+
assert_eq!(target, peer_id.unwrap());
24622461

2463-
let failed_addresses =
2464-
errors.into_iter().map(|(addr, _)| addr).collect::<Vec<_>>();
2465-
assert_eq!(
2466-
failed_addresses,
2467-
addresses
2468-
.clone()
2469-
.into_iter()
2470-
.map(|addr| addr.with(Protocol::P2p(target.into())))
2471-
.collect::<Vec<_>>()
2472-
);
2462+
let failed_addresses = errors.into_iter().map(|(addr, _)| addr).collect::<Vec<_>>();
2463+
let expected_addresses = addresses
2464+
.into_iter()
2465+
.map(|addr| addr.with(Protocol::P2p(target.into())))
2466+
.collect::<Vec<_>>();
24732467

2474-
return Poll::Ready(Ok(()));
2475-
}
2476-
Poll::Ready(_) => unreachable!(),
2477-
Poll::Pending => break Poll::Pending,
2478-
}
2468+
assert_eq!(expected_addresses, failed_addresses);
24792469
}
2480-
}))
2481-
.unwrap();
2470+
e => panic!("Unexpected event: {e:?}"),
2471+
}
24822472
}
24832473

24842474
#[test]

0 commit comments

Comments
 (0)