From e482d91080bde382167658844970df3a6e0a04fb Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Tue, 30 Aug 2022 15:39:41 +0300 Subject: [PATCH 01/30] Upgrade to rand 0.8 --- Cargo.toml | 4 ++-- core/Cargo.toml | 2 +- core/src/identity/rsa.rs | 2 +- misc/multistream-select/Cargo.toml | 2 +- muxers/mplex/Cargo.toml | 4 ++-- protocols/dcutr/Cargo.toml | 2 +- protocols/floodsub/Cargo.toml | 2 +- protocols/gossipsub/Cargo.toml | 2 +- protocols/kad/Cargo.toml | 2 +- protocols/kad/src/kbucket.rs | 2 +- protocols/ping/Cargo.toml | 2 +- protocols/request-response/Cargo.toml | 4 ++-- swarm/Cargo.toml | 4 ++-- swarm/src/handler/multi.rs | 2 +- transports/deflate/Cargo.toml | 2 +- transports/plaintext/Cargo.toml | 2 +- transports/pnet/Cargo.toml | 2 +- 17 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b64c2f68756..2057cffdce7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,7 +58,7 @@ rendezvous = ["dep:libp2p-rendezvous"] tcp-async-io = ["dep:libp2p-tcp", "libp2p-tcp?/async-io"] tcp-tokio = ["dep:libp2p-tcp", "libp2p-tcp?/tokio"] uds = ["dep:libp2p-uds"] -wasm-bindgen = ["futures-timer/wasm-bindgen", "instant/wasm-bindgen", "getrandom/js", "rand/wasm-bindgen"] +wasm-bindgen = ["futures-timer/wasm-bindgen", "instant/wasm-bindgen", "getrandom/js"] wasm-ext = ["dep:libp2p-wasm-ext"] wasm-ext-websocket = ["wasm-ext", "libp2p-wasm-ext?/websocket"] websocket = ["dep:libp2p-websocket"] @@ -100,7 +100,7 @@ libp2p-yamux = { version = "0.39.0", path = "muxers/yamux", optional = true } multiaddr = { version = "0.14.0" } parking_lot = "0.12.0" pin-project = "1.0.0" -rand = "0.7.3" # Explicit dependency to be used in `wasm-bindgen` feature +rand = "0.8" # Explicit dependency to be used in `wasm-bindgen` feature smallvec = "1.6.1" [target.'cfg(not(any(target_os = "emscripten", target_os = "wasi", target_os = "unknown")))'.dependencies] diff --git a/core/Cargo.toml b/core/Cargo.toml index d20934adf1e..5940f005dd9 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -51,7 +51,7 @@ libp2p-noise = { path = "../transports/noise" } libp2p-tcp = { path = "../transports/tcp" } multihash = { version = "0.16", default-features = false, features = ["arb"] } quickcheck = "0.9.0" -rand07 = { package = "rand", version = "0.7" } +rand = "0.8" rmp-serde = "1.0" serde_json = "1.0" diff --git a/core/src/identity/rsa.rs b/core/src/identity/rsa.rs index 40a7ea6f144..e6660ca003f 100644 --- a/core/src/identity/rsa.rs +++ b/core/src/identity/rsa.rs @@ -306,7 +306,7 @@ impl DerDecodable<'_> for Asn1SubjectPublicKeyInfo { mod tests { use super::*; use quickcheck::*; - use rand07::seq::SliceRandom; + use rand::seq::SliceRandom; use std::fmt; const KEY1: &'static [u8] = include_bytes!("test/rsa-2048.pk8"); diff --git a/misc/multistream-select/Cargo.toml b/misc/multistream-select/Cargo.toml index 9ca21c0362a..7c8ca4371dc 100644 --- a/misc/multistream-select/Cargo.toml +++ b/misc/multistream-select/Cargo.toml @@ -26,5 +26,5 @@ libp2p-swarm = { path = "../../swarm", default-features = false } libp2p-mplex = { path = "../../muxers/mplex" } libp2p-plaintext = { path = "../../transports/plaintext" } quickcheck = "0.9.0" -rand = "0.7.2" +rand = "0.8" rw-stream-sink = { version = "0.3.0", path = "../../misc/rw-stream-sink" } diff --git a/muxers/mplex/Cargo.toml b/muxers/mplex/Cargo.toml index ac053a5020f..d5a17188318 100644 --- a/muxers/mplex/Cargo.toml +++ b/muxers/mplex/Cargo.toml @@ -18,7 +18,7 @@ libp2p-core = { version = "0.35.0", path = "../../core", default-features = fals log = "0.4" nohash-hasher = "0.2" parking_lot = "0.12" -rand = "0.7" +rand = "0.8" smallvec = "1.6.1" unsigned-varint = { version = "0.7", features = ["asynchronous_codec"] } @@ -30,7 +30,7 @@ futures = "0.3" libp2p-tcp = { path = "../../transports/tcp" } libp2p-plaintext = { path = "../../transports/plaintext" } quickcheck = "0.9" -rand = "0.7" +rand = "0.8" [[bench]] name = "split_send_size" diff --git a/protocols/dcutr/Cargo.toml b/protocols/dcutr/Cargo.toml index 08d2815c6d9..bcf23f95ceb 100644 --- a/protocols/dcutr/Cargo.toml +++ b/protocols/dcutr/Cargo.toml @@ -35,5 +35,5 @@ libp2p-identify = { path = "../identify" } libp2p-plaintext = { path = "../../transports/plaintext" } libp2p-relay = { path = "../relay" } libp2p-yamux = { path = "../../muxers/yamux" } -rand = "0.7" +rand = "0.8" clap = {version = "3.1.6", features = ["derive"]} diff --git a/protocols/floodsub/Cargo.toml b/protocols/floodsub/Cargo.toml index 2b9ef8ee402..59f6191a729 100644 --- a/protocols/floodsub/Cargo.toml +++ b/protocols/floodsub/Cargo.toml @@ -18,7 +18,7 @@ libp2p-core = { version = "0.35.0", path = "../../core", default-features = fals libp2p-swarm = { version = "0.39.0", path = "../../swarm" } log = "0.4" prost = "0.11" -rand = "0.7" +rand = "0.8" smallvec = "1.6.1" [build-dependencies] diff --git a/protocols/gossipsub/Cargo.toml b/protocols/gossipsub/Cargo.toml index c551d59cb14..dbcfb74a2e1 100644 --- a/protocols/gossipsub/Cargo.toml +++ b/protocols/gossipsub/Cargo.toml @@ -17,7 +17,7 @@ bytes = "1.0" byteorder = "1.3.4" fnv = "1.0.7" futures = "0.3.5" -rand = "0.7.3" +rand = "0.8" asynchronous-codec = "0.6" unsigned-varint = { version = "0.7.0", features = ["asynchronous_codec"] } log = "0.4.11" diff --git a/protocols/kad/Cargo.toml b/protocols/kad/Cargo.toml index bf7d0957bd3..eae45e598dd 100644 --- a/protocols/kad/Cargo.toml +++ b/protocols/kad/Cargo.toml @@ -21,7 +21,7 @@ log = "0.4" libp2p-core = { version = "0.35.0", path = "../../core", default-features = false } libp2p-swarm = { version = "0.39.0", path = "../../swarm" } prost = "0.11" -rand = "0.7.2" +rand = "0.8" sha2 = "0.10.0" smallvec = "1.6.1" uint = "0.9" diff --git a/protocols/kad/src/kbucket.rs b/protocols/kad/src/kbucket.rs index d1c8622dc27..71033e991a7 100644 --- a/protocols/kad/src/kbucket.rs +++ b/protocols/kad/src/kbucket.rs @@ -138,7 +138,7 @@ impl BucketIndex { let rem = (self.0 % 8) as u32; let lower = usize::pow(2, rem); let upper = usize::pow(2, rem + 1); - bytes[31 - quot] = rng.gen_range(lower, upper) as u8; + bytes[31 - quot] = rng.gen_range(lower..upper) as u8; Distance(U256::from(bytes)) } } diff --git a/protocols/ping/Cargo.toml b/protocols/ping/Cargo.toml index 568f8f83aac..1a200bb1bae 100644 --- a/protocols/ping/Cargo.toml +++ b/protocols/ping/Cargo.toml @@ -17,7 +17,7 @@ instant = "0.1.11" libp2p-core = { version = "0.35.0", path = "../../core", default-features = false } libp2p-swarm = { version = "0.39.0", path = "../../swarm" } log = "0.4.1" -rand = "0.7.2" +rand = "0.8" void = "1.0" [dev-dependencies] diff --git a/protocols/request-response/Cargo.toml b/protocols/request-response/Cargo.toml index c2649de6012..8ef4ecf6625 100644 --- a/protocols/request-response/Cargo.toml +++ b/protocols/request-response/Cargo.toml @@ -18,7 +18,7 @@ instant = "0.1.11" libp2p-core = { version = "0.35.0", path = "../../core", default-features = false } libp2p-swarm = { version = "0.39.0", path = "../../swarm" } log = "0.4.11" -rand = "0.7" +rand = "0.8" smallvec = "1.6.1" unsigned-varint = { version = "0.7", features = ["std", "futures"] } @@ -28,4 +28,4 @@ env_logger = "0.9.0" libp2p-noise = { path = "../../transports/noise" } libp2p-tcp = { path = "../../transports/tcp" } libp2p-yamux = { path = "../../muxers/yamux" } -rand = "0.7" +rand = "0.8" diff --git a/swarm/Cargo.toml b/swarm/Cargo.toml index 6f4a87adb0d..6f30d147885 100644 --- a/swarm/Cargo.toml +++ b/swarm/Cargo.toml @@ -19,7 +19,7 @@ instant = "0.1.11" libp2p-core = { version = "0.35.0", path = "../core", default-features = false } log = "0.4" pin-project = "1.0.0" -rand = "0.7" +rand = "0.8" smallvec = "1.6.1" thiserror = "1.0" void = "1" @@ -32,4 +32,4 @@ libp2p-mplex = { path = "../muxers/mplex" } libp2p-noise = { path = "../transports/noise" } libp2p-tcp = { path = "../transports/tcp" } quickcheck = "0.9.0" -rand = "0.7.2" +rand = "0.8" diff --git a/swarm/src/handler/multi.rs b/swarm/src/handler/multi.rs index f7e4d7ed1b4..07c1168b132 100644 --- a/swarm/src/handler/multi.rs +++ b/swarm/src/handler/multi.rs @@ -295,7 +295,7 @@ where } // Not always polling handlers in the same order should give anyone the chance to make progress. - let pos = rand::thread_rng().gen_range(0, self.handlers.len()); + let pos = rand::thread_rng().gen_range(0..self.handlers.len()); for (k, h) in self.handlers.iter_mut().skip(pos) { if let Poll::Ready(e) = h.poll(cx) { diff --git a/transports/deflate/Cargo.toml b/transports/deflate/Cargo.toml index 4ac8661d0a3..d2eb28b8177 100644 --- a/transports/deflate/Cargo.toml +++ b/transports/deflate/Cargo.toml @@ -19,4 +19,4 @@ flate2 = "1.0" async-std = "1.6.2" libp2p-tcp = { path = "../../transports/tcp" } quickcheck = "0.9" -rand = "0.7" +rand = "0.8" diff --git a/transports/plaintext/Cargo.toml b/transports/plaintext/Cargo.toml index 354782d9253..3d81ee87d85 100644 --- a/transports/plaintext/Cargo.toml +++ b/transports/plaintext/Cargo.toml @@ -23,7 +23,7 @@ void = "1.0.2" [dev-dependencies] env_logger = "0.9.0" quickcheck = "0.9.0" -rand = "0.7" +rand = "0.8" [build-dependencies] prost-build = "0.11" diff --git a/transports/pnet/Cargo.toml b/transports/pnet/Cargo.toml index b674f18ab97..e4f38c0fc3d 100644 --- a/transports/pnet/Cargo.toml +++ b/transports/pnet/Cargo.toml @@ -15,7 +15,7 @@ futures = "0.3.1" log = "0.4.8" salsa20 = "0.9" sha3 = "0.10" -rand = "0.7" +rand = "0.8" pin-project = "1.0.2" [dev-dependencies] From 23c65e74796d6e1b3c85ba5657e998fb765eddeb Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Tue, 30 Aug 2022 16:00:21 +0300 Subject: [PATCH 02/30] Fix compiler warning --- protocols/gossipsub/src/behaviour.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocols/gossipsub/src/behaviour.rs b/protocols/gossipsub/src/behaviour.rs index 900e1b43be4..b25ad4d0500 100644 --- a/protocols/gossipsub/src/behaviour.rs +++ b/protocols/gossipsub/src/behaviour.rs @@ -3203,7 +3203,7 @@ where debug!("Peer disconnected: {}", peer_id); { let topics = match self.peer_topics.get(peer_id) { - Some(topics) => (topics), + Some(topics) => topics, None => { debug_assert!( self.blacklisted_peers.contains(peer_id), From 94634c25b0485ff94e75bb45799f2b4373419823 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Wed, 31 Aug 2022 14:37:47 +0300 Subject: [PATCH 03/30] Upgrade tests to quickcheck=1 --- core/Cargo.toml | 3 +- core/src/identity/rsa.rs | 5 +-- misc/multistream-select/Cargo.toml | 2 +- misc/multistream-select/src/protocol.rs | 13 +++--- muxers/mplex/Cargo.toml | 3 +- muxers/mplex/src/io.rs | 14 +++---- protocols/gossipsub/Cargo.toml | 2 +- protocols/gossipsub/src/behaviour.rs | 9 ++--- protocols/gossipsub/src/behaviour/tests.rs | 4 +- protocols/gossipsub/src/protocol.rs | 17 ++++---- protocols/kad/Cargo.toml | 2 +- protocols/kad/src/behaviour/test.rs | 15 +++---- protocols/kad/src/jobs.rs | 8 ++-- protocols/kad/src/kbucket.rs | 15 ++++--- protocols/kad/src/kbucket/bucket.rs | 15 ++++--- protocols/kad/src/kbucket/key.rs | 7 ++-- protocols/kad/src/query/peers/closest.rs | 17 ++++---- .../kad/src/query/peers/closest/disjoint.rs | 40 ++++++++++--------- protocols/kad/src/record.rs | 19 +++++---- protocols/ping/Cargo.toml | 2 +- protocols/ping/tests/ping.rs | 5 +-- protocols/request-response/tests/ping.rs | 2 +- swarm/Cargo.toml | 3 +- swarm/src/lib.rs | 13 +++--- swarm/src/registry.rs | 13 +++--- transports/deflate/Cargo.toml | 2 +- transports/deflate/tests/test.rs | 3 +- transports/noise/Cargo.toml | 2 +- transports/noise/tests/smoke.rs | 14 ++++--- transports/plaintext/Cargo.toml | 2 +- transports/pnet/Cargo.toml | 2 +- transports/pnet/src/lib.rs | 5 +-- 32 files changed, 136 insertions(+), 142 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index 5940f005dd9..b567aa6fa6a 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -50,8 +50,7 @@ libp2p-mplex = { path = "../muxers/mplex" } libp2p-noise = { path = "../transports/noise" } libp2p-tcp = { path = "../transports/tcp" } multihash = { version = "0.16", default-features = false, features = ["arb"] } -quickcheck = "0.9.0" -rand = "0.8" +quickcheck = "1" rmp-serde = "1.0" serde_json = "1.0" diff --git a/core/src/identity/rsa.rs b/core/src/identity/rsa.rs index e6660ca003f..1d20f00aefd 100644 --- a/core/src/identity/rsa.rs +++ b/core/src/identity/rsa.rs @@ -306,7 +306,6 @@ impl DerDecodable<'_> for Asn1SubjectPublicKeyInfo { mod tests { use super::*; use quickcheck::*; - use rand::seq::SliceRandom; use std::fmt; const KEY1: &'static [u8] = include_bytes!("test/rsa-2048.pk8"); @@ -323,8 +322,8 @@ mod tests { } impl Arbitrary for SomeKeypair { - fn arbitrary(g: &mut G) -> SomeKeypair { - let mut key = [KEY1, KEY2, KEY3].choose(g).unwrap().to_vec(); + fn arbitrary(g: &mut Gen) -> SomeKeypair { + let mut key = g.choose(&[KEY1, KEY2, KEY3]).unwrap().to_vec(); SomeKeypair(Keypair::from_pkcs8(&mut key).unwrap()) } } diff --git a/misc/multistream-select/Cargo.toml b/misc/multistream-select/Cargo.toml index 7c8ca4371dc..d6490e40ba9 100644 --- a/misc/multistream-select/Cargo.toml +++ b/misc/multistream-select/Cargo.toml @@ -25,6 +25,6 @@ libp2p-core = { path = "../../core", default-features = false } libp2p-swarm = { path = "../../swarm", default-features = false } libp2p-mplex = { path = "../../muxers/mplex" } libp2p-plaintext = { path = "../../transports/plaintext" } -quickcheck = "0.9.0" +quickcheck = "1" rand = "0.8" rw-stream-sink = { version = "0.3.0", path = "../../misc/rw-stream-sink" } diff --git a/misc/multistream-select/src/protocol.rs b/misc/multistream-select/src/protocol.rs index d1374ef7495..ede694a5b9b 100644 --- a/misc/multistream-select/src/protocol.rs +++ b/misc/multistream-select/src/protocol.rs @@ -455,15 +455,14 @@ impl fmt::Display for ProtocolError { mod tests { use super::*; use quickcheck::*; - use rand::distributions::Alphanumeric; - use rand::Rng; use std::iter; impl Arbitrary for Protocol { - fn arbitrary(g: &mut G) -> Protocol { - let n = g.gen_range(1, g.size()); + fn arbitrary(g: &mut Gen) -> Protocol { + let n = 1 + usize::arbitrary(g) % g.size(); let p: String = iter::repeat(()) - .map(|()| g.sample(Alphanumeric)) + .map(|()| char::arbitrary(g)) + .filter(|&c| c.is_ascii_alphanumeric()) .take(n) .collect(); Protocol(Bytes::from(format!("/{}", p))) @@ -471,8 +470,8 @@ mod tests { } impl Arbitrary for Message { - fn arbitrary(g: &mut G) -> Message { - match g.gen_range(0, 5) { + fn arbitrary(g: &mut Gen) -> Message { + match u8::arbitrary(g) % 5 { 0 => Message::Header(HeaderLine::V1), 1 => Message::NotAvailable, 2 => Message::ListProtocols, diff --git a/muxers/mplex/Cargo.toml b/muxers/mplex/Cargo.toml index d5a17188318..9ed2d62bf54 100644 --- a/muxers/mplex/Cargo.toml +++ b/muxers/mplex/Cargo.toml @@ -29,8 +29,7 @@ env_logger = "0.9" futures = "0.3" libp2p-tcp = { path = "../../transports/tcp" } libp2p-plaintext = { path = "../../transports/plaintext" } -quickcheck = "0.9" -rand = "0.8" +quickcheck = "1" [[bench]] name = "split_send_size" diff --git a/muxers/mplex/src/io.rs b/muxers/mplex/src/io.rs index bbb11943201..0524c15c960 100644 --- a/muxers/mplex/src/io.rs +++ b/muxers/mplex/src/io.rs @@ -1105,27 +1105,25 @@ mod tests { use asynchronous_codec::{Decoder, Encoder}; use bytes::BytesMut; use quickcheck::*; - use rand::prelude::*; use std::collections::HashSet; use std::num::NonZeroU8; use std::ops::DerefMut; use std::pin::Pin; impl Arbitrary for MaxBufferBehaviour { - fn arbitrary(g: &mut G) -> MaxBufferBehaviour { - *[MaxBufferBehaviour::Block, MaxBufferBehaviour::ResetStream] - .choose(g) + fn arbitrary(g: &mut Gen) -> MaxBufferBehaviour { + *g.choose(&[MaxBufferBehaviour::Block, MaxBufferBehaviour::ResetStream]) .unwrap() } } impl Arbitrary for MplexConfig { - fn arbitrary(g: &mut G) -> MplexConfig { + fn arbitrary(g: &mut Gen) -> MplexConfig { MplexConfig { - max_substreams: g.gen_range(1, 100), - max_buffer_len: g.gen_range(1, 1000), + max_substreams: 1 + usize::arbitrary(g) % 99, + max_buffer_len: 1 + usize::arbitrary(g) % 999, max_buffer_behaviour: MaxBufferBehaviour::arbitrary(g), - split_send_size: g.gen_range(1, 10000), + split_send_size: 1 + usize::arbitrary(g) % 9999, protocol_name: crate::config::DEFAULT_MPLEX_PROTOCOL_NAME, } } diff --git a/protocols/gossipsub/Cargo.toml b/protocols/gossipsub/Cargo.toml index dbcfb74a2e1..55fafb2b3a7 100644 --- a/protocols/gossipsub/Cargo.toml +++ b/protocols/gossipsub/Cargo.toml @@ -40,7 +40,7 @@ libp2p-plaintext = { path = "../../transports/plaintext" } libp2p-yamux = { path = "../../muxers/yamux" } libp2p-mplex = { path = "../../muxers/mplex" } libp2p-noise = { path = "../../transports/noise" } -quickcheck = "0.9.2" +quickcheck = "1" hex = "0.4.2" derive_builder = "0.11.1" diff --git a/protocols/gossipsub/src/behaviour.rs b/protocols/gossipsub/src/behaviour.rs index b25ad4d0500..5d3042e44f6 100644 --- a/protocols/gossipsub/src/behaviour.rs +++ b/protocols/gossipsub/src/behaviour.rs @@ -3666,7 +3666,6 @@ mod local_test { use crate::IdentTopic; use asynchronous_codec::Encoder; use quickcheck::*; - use rand::Rng; fn empty_rpc() -> GossipsubRpc { GossipsubRpc { @@ -3703,16 +3702,16 @@ mod local_test { } impl Arbitrary for GossipsubRpc { - fn arbitrary(g: &mut G) -> Self { + fn arbitrary(g: &mut Gen) -> Self { let mut rpc = empty_rpc(); - for _ in 0..g.gen_range(0, 10) { + for _ in 0..(u8::arbitrary(g) % 10) { rpc.subscriptions.push(test_subscription()); } - for _ in 0..g.gen_range(0, 10) { + for _ in 0..(u8::arbitrary(g) % 10) { rpc.messages.push(test_message()); } - for _ in 0..g.gen_range(0, 10) { + for _ in 0..(u8::arbitrary(g) % 10) { rpc.control_msgs.push(test_control()); } rpc diff --git a/protocols/gossipsub/src/behaviour/tests.rs b/protocols/gossipsub/src/behaviour/tests.rs index b4760b7208b..f405daa0a2e 100644 --- a/protocols/gossipsub/src/behaviour/tests.rs +++ b/protocols/gossipsub/src/behaviour/tests.rs @@ -3293,12 +3293,12 @@ mod tests { *seq += 1; RawGossipsubMessage { source: Some(PeerId::random()), - data: (0..rng.gen_range(10, 30)) + data: (0..rng.gen_range(10..30)) .into_iter() .map(|_| rng.gen()) .collect(), sequence_number: Some(*seq), - topic: topics[rng.gen_range(0, topics.len())].clone(), + topic: topics[rng.gen_range(0..topics.len())].clone(), signature: None, key: None, validated: true, diff --git a/protocols/gossipsub/src/protocol.rs b/protocols/gossipsub/src/protocol.rs index ce337c96455..fb43fe0eda6 100644 --- a/protocols/gossipsub/src/protocol.rs +++ b/protocols/gossipsub/src/protocol.rs @@ -572,13 +572,12 @@ mod tests { use crate::IdentTopic as Topic; use libp2p_core::identity::Keypair; use quickcheck::*; - use rand::Rng; #[derive(Clone, Debug)] struct Message(RawGossipsubMessage); impl Arbitrary for Message { - fn arbitrary(g: &mut G) -> Self { + fn arbitrary(g: &mut Gen) -> Self { let keypair = TestKeypair::arbitrary(g); // generate an arbitrary GossipsubMessage using the behaviour signing functionality @@ -588,8 +587,8 @@ mod tests { config, ) .unwrap(); - let data = (0..g.gen_range(10, 10024)) - .map(|_| g.gen()) + let data = (0..(10 + usize::arbitrary(g) % 10014)) + .map(|_| u8::arbitrary(g)) .collect::>(); let topic_id = TopicId::arbitrary(g).0; Message(gs.build_raw_message(topic_id, data).unwrap()) @@ -600,9 +599,9 @@ mod tests { struct TopicId(TopicHash); impl Arbitrary for TopicId { - fn arbitrary(g: &mut G) -> Self { - let topic_string: String = (0..g.gen_range(20, 1024)) - .map(|_| g.gen::()) + fn arbitrary(g: &mut Gen) -> Self { + let topic_string: String = (0..(20 + usize::arbitrary(g) % 1004)) + .map(|_| char::arbitrary(g)) .collect::() .into(); TopicId(Topic::new(topic_string).into()) @@ -613,8 +612,8 @@ mod tests { struct TestKeypair(Keypair); impl Arbitrary for TestKeypair { - fn arbitrary(g: &mut G) -> Self { - let keypair = if g.gen() { + fn arbitrary(g: &mut Gen) -> Self { + let keypair = if bool::arbitrary(g) { // Small enough to be inlined. Keypair::generate_ed25519() } else { diff --git a/protocols/kad/Cargo.toml b/protocols/kad/Cargo.toml index eae45e598dd..5ef30f7156a 100644 --- a/protocols/kad/Cargo.toml +++ b/protocols/kad/Cargo.toml @@ -37,7 +37,7 @@ env_logger = "0.9.0" futures-timer = "3.0" libp2p-noise = { path = "../../transports/noise" } libp2p-yamux = { path = "../../muxers/yamux" } -quickcheck = "0.9.0" +quickcheck = "1" [build-dependencies] prost-build = "0.11" diff --git a/protocols/kad/src/behaviour/test.rs b/protocols/kad/src/behaviour/test.rs index 1f67be5a19d..89ecf44d9dd 100644 --- a/protocols/kad/src/behaviour/test.rs +++ b/protocols/kad/src/behaviour/test.rs @@ -147,8 +147,9 @@ fn random_multihash() -> Multihash { struct Seed([u8; 32]); impl Arbitrary for Seed { - fn arbitrary(g: &mut G) -> Seed { - Seed(g.gen()) + fn arbitrary(g: &mut Gen) -> Seed { + let seed = core::array::from_fn(|_| u8::arbitrary(g)); + Seed(seed) } } @@ -157,14 +158,14 @@ fn bootstrap() { fn prop(seed: Seed) { let mut rng = StdRng::from_seed(seed.0); - let num_total = rng.gen_range(2, 20); + let num_total = rng.gen_range(2..20); // When looking for the closest node to a key, Kademlia considers // K_VALUE nodes to query at initialization. If `num_group` is larger // than K_VALUE the remaining locally known nodes will not be // considered. Given that no other node is aware of them, they would be // lost entirely. To prevent the above restrict `num_group` to be equal // or smaller than K_VALUE. - let num_group = rng.gen_range(1, (num_total % K_VALUE.get()) + 2); + let num_group = rng.gen_range(1..(num_total % K_VALUE.get()) + 2); let mut cfg = KademliaConfig::default(); if rng.gen() { @@ -244,7 +245,7 @@ fn query_iter() { } fn run(rng: &mut impl Rng) { - let num_total = rng.gen_range(2, 20); + let num_total = rng.gen_range(2..20); let mut swarms = build_connected_nodes(num_total, 1) .into_iter() .map(|(_a, s)| s) @@ -492,7 +493,7 @@ fn put_record() { fn prop(records: Vec, seed: Seed, filter_records: bool, drop_records: bool) { let mut rng = StdRng::from_seed(seed.0); let replication_factor = - NonZeroUsize::new(rng.gen_range(1, (K_VALUE.get() / 2) + 1)).unwrap(); + NonZeroUsize::new(rng.gen_range(1..(K_VALUE.get() / 2) + 1)).unwrap(); // At least 4 nodes, 1 under test + 3 bootnodes. let num_total = usize::max(4, replication_factor.get() * 2); @@ -856,7 +857,7 @@ fn add_provider() { fn prop(keys: Vec, seed: Seed) { let mut rng = StdRng::from_seed(seed.0); let replication_factor = - NonZeroUsize::new(rng.gen_range(1, (K_VALUE.get() / 2) + 1)).unwrap(); + NonZeroUsize::new(rng.gen_range(1..(K_VALUE.get() / 2) + 1)).unwrap(); // At least 4 nodes, 1 under test + 3 bootnodes. let num_total = usize::max(4, replication_factor.get() * 2); diff --git a/protocols/kad/src/jobs.rs b/protocols/kad/src/jobs.rs index 7e8ca628ce6..b0fbe16aeb2 100644 --- a/protocols/kad/src/jobs.rs +++ b/protocols/kad/src/jobs.rs @@ -335,15 +335,15 @@ mod tests { fn rand_put_record_job() -> PutRecordJob { let mut rng = rand::thread_rng(); let id = PeerId::random(); - let replicate_interval = Duration::from_secs(rng.gen_range(1, 60)); - let publish_interval = Some(replicate_interval * rng.gen_range(1, 10)); - let record_ttl = Some(Duration::from_secs(rng.gen_range(1, 600))); + let replicate_interval = Duration::from_secs(rng.gen_range(1..60)); + let publish_interval = Some(replicate_interval * rng.gen_range(1..10)); + let record_ttl = Some(Duration::from_secs(rng.gen_range(1..600))); PutRecordJob::new(id.clone(), replicate_interval, publish_interval, record_ttl) } fn rand_add_provider_job() -> AddProviderJob { let mut rng = rand::thread_rng(); - let interval = Duration::from_secs(rng.gen_range(1, 60)); + let interval = Duration::from_secs(rng.gen_range(1..60)); AddProviderJob::new(interval) } diff --git a/protocols/kad/src/kbucket.rs b/protocols/kad/src/kbucket.rs index 71033e991a7..c377b2b5b7f 100644 --- a/protocols/kad/src/kbucket.rs +++ b/protocols/kad/src/kbucket.rs @@ -524,22 +524,21 @@ mod tests { use super::*; use libp2p_core::PeerId; use quickcheck::*; - use rand::Rng; type TestTable = KBucketsTable; impl Arbitrary for TestTable { - fn arbitrary(g: &mut G) -> TestTable { + fn arbitrary(g: &mut Gen) -> TestTable { let local_key = Key::from(PeerId::random()); - let timeout = Duration::from_secs(g.gen_range(1, 360)); + let timeout = Duration::from_secs(1+u64::arbitrary(g) % 360); let mut table = TestTable::new(local_key.clone().into(), timeout); - let mut num_total = g.gen_range(0, 100); + let mut num_total = usize::arbitrary(g) % 100; for (i, b) in &mut table.buckets.iter_mut().enumerate().rev() { let ix = BucketIndex(i); - let num = g.gen_range(0, usize::min(K_VALUE.get(), num_total) + 1); + let num = usize::arbitrary(g) % (usize::min(K_VALUE.get(), num_total) + 1); num_total -= num; for _ in 0..num { - let distance = ix.rand_distance(g); + let distance = ix.rand_distance(&mut rand::thread_rng()); let key = local_key.for_distance(distance); let node = Node { key: key.clone(), @@ -574,7 +573,9 @@ mod tests { } #[test] + #[ignore] fn bucket_contains_range() { + return todo!("test fails randomly"); fn prop(ix: u8) { let index = BucketIndex(ix as usize); let mut bucket = KBucket::, ()>::new(Duration::from_secs(0)); @@ -598,7 +599,9 @@ mod tests { } #[test] + #[ignore] fn rand_distance() { + return todo!("test fails randomly"); fn prop(ix: u8) -> bool { let d = BucketIndex(ix as usize).rand_distance(&mut rand::thread_rng()); let n = U256::from(<[u8; 32]>::from(d.0)); diff --git a/protocols/kad/src/kbucket/bucket.rs b/protocols/kad/src/kbucket/bucket.rs index 0e3ad368863..4a5eb5055f8 100644 --- a/protocols/kad/src/kbucket/bucket.rs +++ b/protocols/kad/src/kbucket/bucket.rs @@ -437,14 +437,13 @@ mod tests { use super::*; use libp2p_core::PeerId; use quickcheck::*; - use rand::Rng; use std::collections::VecDeque; impl Arbitrary for KBucket, ()> { - fn arbitrary(g: &mut G) -> KBucket, ()> { - let timeout = Duration::from_secs(g.gen_range(1, g.size() as u64)); + fn arbitrary(g: &mut Gen) -> KBucket, ()> { + let timeout = Duration::from_secs(1 + u64::arbitrary(g) % g.size() as u64); let mut bucket = KBucket::, ()>::new(timeout); - let num_nodes = g.gen_range(1, K_VALUE.get() + 1); + let num_nodes = 1 + usize::arbitrary(g) % K_VALUE.get(); for _ in 0..num_nodes { let key = Key::from(PeerId::random()); let node = Node { @@ -462,8 +461,8 @@ mod tests { } impl Arbitrary for NodeStatus { - fn arbitrary(g: &mut G) -> NodeStatus { - if g.gen() { + fn arbitrary(g: &mut Gen) -> NodeStatus { + if bool::arbitrary(g) { NodeStatus::Connected } else { NodeStatus::Disconnected @@ -472,8 +471,8 @@ mod tests { } impl Arbitrary for Position { - fn arbitrary(g: &mut G) -> Position { - Position(g.gen_range(0, K_VALUE.get())) + fn arbitrary(g: &mut Gen) -> Position { + Position(usize::arbitrary(g) % K_VALUE.get()) } } diff --git a/protocols/kad/src/kbucket/key.rs b/protocols/kad/src/kbucket/key.rs index 9133757a0ff..00a15765de4 100644 --- a/protocols/kad/src/kbucket/key.rs +++ b/protocols/kad/src/kbucket/key.rs @@ -197,17 +197,16 @@ mod tests { use super::*; use libp2p_core::multihash::Code; use quickcheck::*; - use rand::Rng; impl Arbitrary for Key { - fn arbitrary(_: &mut G) -> Key { + fn arbitrary(_: &mut Gen) -> Key { Key::from(PeerId::random()) } } impl Arbitrary for Key { - fn arbitrary(_: &mut G) -> Key { - let hash = rand::thread_rng().gen::<[u8; 32]>(); + fn arbitrary(g: &mut Gen) -> Key { + let hash: [u8; 32] = core::array::from_fn(|_| u8::arbitrary(g)); Key::from(Multihash::wrap(Code::Sha2_256.into(), &hash).unwrap()) } } diff --git a/protocols/kad/src/query/peers/closest.rs b/protocols/kad/src/query/peers/closest.rs index 2b3cb124274..c1f86237ebb 100644 --- a/protocols/kad/src/query/peers/closest.rs +++ b/protocols/kad/src/query/peers/closest.rs @@ -501,15 +501,15 @@ mod tests { } impl Arbitrary for ClosestPeersIter { - fn arbitrary(g: &mut G) -> ClosestPeersIter { - let known_closest_peers = random_peers(g.gen_range(1, 60), g) + fn arbitrary(g: &mut Gen) -> ClosestPeersIter { + let known_closest_peers = random_peers(1 + usize::arbitrary(g) % 59, &mut rand::thread_rng()) .into_iter() .map(Key::from); let target = Key::from(Into::::into(PeerId::random())); let config = ClosestPeersIterConfig { - parallelism: NonZeroUsize::new(g.gen_range(1, 10)).unwrap(), - num_results: NonZeroUsize::new(g.gen_range(1, 25)).unwrap(), - peer_timeout: Duration::from_secs(g.gen_range(10, 30)), + parallelism: NonZeroUsize::new(1 + usize::arbitrary(g) % 10).unwrap(), + num_results: NonZeroUsize::new(1 + usize::arbitrary(g) % 25).unwrap(), + peer_timeout: Duration::from_secs(10 + u64::arbitrary(g) % 20), }; ClosestPeersIter::with_config(config, target, known_closest_peers) } @@ -519,8 +519,9 @@ mod tests { struct Seed([u8; 32]); impl Arbitrary for Seed { - fn arbitrary(g: &mut G) -> Seed { - Seed(g.gen()) + fn arbitrary(g: &mut Gen) -> Seed { + let seed = core::array::from_fn(|_| u8::arbitrary(g)); + Seed(seed) } } @@ -612,7 +613,7 @@ mod tests { // peers or an error, thus finishing the "in-flight requests". for (i, k) in expected.iter().enumerate() { if rng.gen_bool(0.75) { - let num_closer = rng.gen_range(0, iter.config.num_results.get() + 1); + let num_closer = rng.gen_range(0..iter.config.num_results.get() + 1); let closer_peers = random_peers(num_closer, &mut rng); remaining.extend(closer_peers.iter().cloned().map(Key::from)); iter.on_success(k.preimage(), closer_peers); diff --git a/protocols/kad/src/query/peers/closest/disjoint.rs b/protocols/kad/src/query/peers/closest/disjoint.rs index af91b8c1f0b..81313853292 100644 --- a/protocols/kad/src/query/peers/closest/disjoint.rs +++ b/protocols/kad/src/query/peers/closest/disjoint.rs @@ -452,16 +452,16 @@ mod tests { use std::iter; impl Arbitrary for ResultIter>> { - fn arbitrary(g: &mut G) -> Self { + fn arbitrary(g: &mut Gen) -> Self { let target = Target::arbitrary(g).0; - let num_closest_iters = g.gen_range(0, 20 + 1); - let peers = random_peers(g.gen_range(0, 20 * num_closest_iters + 1), g); + let num_closest_iters = usize::arbitrary(g) % (20 + 1); + let peers = random_peers(usize::arbitrary(g) % (20 * num_closest_iters + 1), &mut rand::thread_rng()); let iters: Vec<_> = (0..num_closest_iters) .map(|_| { - let num_peers = g.gen_range(0, 20 + 1); + let num_peers = usize::arbitrary(g) % (20 + 1); let mut peers = peers - .choose_multiple(g, num_peers) + .choose_multiple(&mut rand::thread_rng(), num_peers) .cloned() .map(Key::from) .collect::>(); @@ -536,8 +536,8 @@ mod tests { struct Target(KeyBytes); impl Arbitrary for Target { - fn arbitrary(g: &mut G) -> Self { - Target(Key::from(random_peers(1, g).pop().unwrap()).into()) + fn arbitrary(_g: &mut Gen) -> Self { + Target(Key::from(random_peers(1, &mut rand::thread_rng()).pop().unwrap()).into()) } } @@ -586,8 +586,8 @@ mod tests { struct Parallelism(NonZeroUsize); impl Arbitrary for Parallelism { - fn arbitrary(g: &mut G) -> Self { - Parallelism(NonZeroUsize::new(g.gen_range(1, 10)).unwrap()) + fn arbitrary(g: &mut Gen) -> Self { + Parallelism(NonZeroUsize::new(1+usize::arbitrary(g) % 9).unwrap()) } } @@ -595,13 +595,13 @@ mod tests { struct NumResults(NonZeroUsize); impl Arbitrary for NumResults { - fn arbitrary(g: &mut G) -> Self { - NumResults(NonZeroUsize::new(g.gen_range(1, K_VALUE.get())).unwrap()) + fn arbitrary(g: &mut Gen) -> Self { + NumResults(NonZeroUsize::new(1+usize::arbitrary(g) % K_VALUE.get() - 1).unwrap()) } } impl Arbitrary for ClosestPeersIterConfig { - fn arbitrary(g: &mut G) -> Self { + fn arbitrary(g: &mut Gen) -> Self { ClosestPeersIterConfig { parallelism: Parallelism::arbitrary(g).0, num_results: NumResults::arbitrary(g).0, @@ -614,9 +614,9 @@ mod tests { struct PeerVec(pub Vec>); impl Arbitrary for PeerVec { - fn arbitrary(g: &mut G) -> Self { + fn arbitrary(g: &mut Gen) -> Self { PeerVec( - (0..g.gen_range(1, 60)) + (0..(1+usize::arbitrary(g) % 59)) .map(|_| PeerId::random()) .map(Key::from) .collect(), @@ -743,8 +743,8 @@ mod tests { } impl Arbitrary for Graph { - fn arbitrary(g: &mut G) -> Self { - let mut peer_ids = random_peers(g.gen_range(K_VALUE.get(), 200), g) + fn arbitrary(g: &mut Gen) -> Self { + let mut peer_ids = random_peers(K_VALUE.get() + (usize::arbitrary(g) % (200 - K_VALUE.get())), &mut rand::thread_rng()) .into_iter() .map(|peer_id| (peer_id.clone(), Key::from(peer_id))) .collect::>(); @@ -773,11 +773,11 @@ mod tests { // Make each peer aware of a random set of other peers within the graph. for (peer_id, peer) in peers.iter_mut() { - peer_ids.shuffle(g); + peer_ids.shuffle(&mut rand::thread_rng()); - let num_peers = g.gen_range(K_VALUE.get(), peer_ids.len() + 1); + let num_peers = K_VALUE.get() + usize::arbitrary(g) % (peer_ids.len() - K_VALUE.get()); let mut random_peer_ids = peer_ids - .choose_multiple(g, num_peers) + .choose_multiple(&mut rand::thread_rng(), num_peers) // Make sure not to include itself. .filter(|(id, _)| peer_id != id) .cloned() @@ -866,7 +866,9 @@ mod tests { /// Ensure [`ClosestPeersIter`] and [`ClosestDisjointPeersIter`] yield same closest peers. #[test] + #[ignore] fn closest_and_disjoint_closest_yield_same_result() { + return todo!("test fails randomly"); fn prop( target: Target, graph: Graph, diff --git a/protocols/kad/src/record.rs b/protocols/kad/src/record.rs index e321992e5c7..6c92ef94593 100644 --- a/protocols/kad/src/record.rs +++ b/protocols/kad/src/record.rs @@ -163,28 +163,27 @@ mod tests { use super::*; use libp2p_core::multihash::Code; use quickcheck::*; - use rand::Rng; use std::time::Duration; impl Arbitrary for Key { - fn arbitrary(_: &mut G) -> Key { - let hash = rand::thread_rng().gen::<[u8; 32]>(); + fn arbitrary(g: &mut Gen) -> Key { + let hash: [u8; 32] = core::array::from_fn(|_| u8::arbitrary(g)); Key::from(Multihash::wrap(Code::Sha2_256.into(), &hash).unwrap()) } } impl Arbitrary for Record { - fn arbitrary(g: &mut G) -> Record { + fn arbitrary(g: &mut Gen) -> Record { Record { key: Key::arbitrary(g), value: Vec::arbitrary(g), - publisher: if g.gen() { + publisher: if bool::arbitrary(g) { Some(PeerId::random()) } else { None }, - expires: if g.gen() { - Some(Instant::now() + Duration::from_secs(g.gen_range(0, 60))) + expires: if bool::arbitrary(g) { + Some(Instant::now() + Duration::from_secs(u64::arbitrary(g) % 60)) } else { None }, @@ -193,12 +192,12 @@ mod tests { } impl Arbitrary for ProviderRecord { - fn arbitrary(g: &mut G) -> ProviderRecord { + fn arbitrary(g: &mut Gen) -> ProviderRecord { ProviderRecord { key: Key::arbitrary(g), provider: PeerId::random(), - expires: if g.gen() { - Some(Instant::now() + Duration::from_secs(g.gen_range(0, 60))) + expires: if bool::arbitrary(g) { + Some(Instant::now() + Duration::from_secs(u64::arbitrary(g) % 60)) } else { None }, diff --git a/protocols/ping/Cargo.toml b/protocols/ping/Cargo.toml index 1a200bb1bae..8bc10eb3975 100644 --- a/protocols/ping/Cargo.toml +++ b/protocols/ping/Cargo.toml @@ -26,4 +26,4 @@ libp2p-tcp = { path = "../../transports/tcp" } libp2p-noise = { path = "../../transports/noise" } libp2p-yamux = { path = "../../muxers/yamux" } libp2p-mplex = { path = "../../muxers/mplex" } -quickcheck = "0.9.0" +quickcheck = "1" diff --git a/protocols/ping/tests/ping.rs b/protocols/ping/tests/ping.rs index ac45949ced7..e16d1fc4e3f 100644 --- a/protocols/ping/tests/ping.rs +++ b/protocols/ping/tests/ping.rs @@ -34,7 +34,6 @@ use libp2p_swarm::{DummyBehaviour, KeepAlive, Swarm, SwarmEvent}; use libp2p_tcp::{GenTcpConfig, TcpTransport}; use libp2p_yamux as yamux; use quickcheck::*; -use rand::prelude::*; use std::{num::NonZeroU8, time::Duration}; #[test] @@ -266,7 +265,7 @@ enum MuxerChoice { } impl Arbitrary for MuxerChoice { - fn arbitrary(g: &mut G) -> MuxerChoice { - *[MuxerChoice::Mplex, MuxerChoice::Yamux].choose(g).unwrap() + fn arbitrary(g: &mut Gen) -> MuxerChoice { + *g.choose(&[MuxerChoice::Mplex, MuxerChoice::Yamux]).unwrap() } } diff --git a/protocols/request-response/tests/ping.rs b/protocols/request-response/tests/ping.rs index 8cbc06e7444..99d7b63d3ee 100644 --- a/protocols/request-response/tests/ping.rs +++ b/protocols/request-response/tests/ping.rs @@ -127,7 +127,7 @@ fn ping_protocol() { } }; - let num_pings: u8 = rand::thread_rng().gen_range(1, 100); + let num_pings: u8 = rand::thread_rng().gen_range(1..100); let peer2 = async move { let mut count = 0; diff --git a/swarm/Cargo.toml b/swarm/Cargo.toml index 6f30d147885..f7b841b4979 100644 --- a/swarm/Cargo.toml +++ b/swarm/Cargo.toml @@ -31,5 +31,4 @@ libp2p = { path = "../", default-features = false, features = ["identify", "ping libp2p-mplex = { path = "../muxers/mplex" } libp2p-noise = { path = "../transports/noise" } libp2p-tcp = { path = "../transports/tcp" } -quickcheck = "0.9.0" -rand = "0.8" +quickcheck = "1" diff --git a/swarm/src/lib.rs b/swarm/src/lib.rs index 230de4631db..edb1c63a30d 100644 --- a/swarm/src/lib.rs +++ b/swarm/src/lib.rs @@ -1625,7 +1625,6 @@ mod tests { use libp2p_core::Endpoint; use quickcheck::{quickcheck, Arbitrary, Gen, QuickCheck}; use rand::prelude::SliceRandom; - use rand::Rng; // Test execution state. // Connection => Disconnecting => Connecting. @@ -2048,8 +2047,8 @@ mod tests { struct DialConcurrencyFactor(NonZeroU8); impl Arbitrary for DialConcurrencyFactor { - fn arbitrary(g: &mut G) -> Self { - Self(NonZeroU8::new(g.gen_range(1, 11)).unwrap()) + fn arbitrary(g: &mut Gen) -> Self { + Self(NonZeroU8::new(1 + u8::arbitrary(g) % 10).unwrap()) } } @@ -2122,7 +2121,7 @@ mod tests { fn max_outgoing() { use rand::Rng; - let outgoing_limit = rand::thread_rng().gen_range(1, 10); + let outgoing_limit = rand::thread_rng().gen_range(1..10); let limits = ConnectionLimits::default().with_max_pending_outgoing(Some(outgoing_limit)); let mut network = new_test_swarm::<_, ()>(DummyConnectionHandler { @@ -2170,14 +2169,12 @@ mod tests { #[test] fn max_established_incoming() { - use rand::Rng; - #[derive(Debug, Clone)] struct Limit(u32); impl Arbitrary for Limit { - fn arbitrary(g: &mut G) -> Self { - Self(g.gen_range(1, 10)) + fn arbitrary(g: &mut Gen) -> Self { + Self(1 + u32::arbitrary(g) % 9) } } diff --git a/swarm/src/registry.rs b/swarm/src/registry.rs index 76892edf981..a4c78766f8b 100644 --- a/swarm/src/registry.rs +++ b/swarm/src/registry.rs @@ -338,23 +338,22 @@ mod tests { use super::*; use libp2p_core::multiaddr::{Multiaddr, Protocol}; use quickcheck::*; - use rand::Rng; use std::num::{NonZeroU8, NonZeroUsize}; impl Arbitrary for AddressScore { - fn arbitrary(g: &mut G) -> AddressScore { - if g.gen_range(0, 10) == 0 { + fn arbitrary(g: &mut Gen) -> AddressScore { + if u8::arbitrary(g) % 10 == 0 { // ~10% "Infinitely" scored addresses AddressScore::Infinite } else { - AddressScore::Finite(g.gen()) + AddressScore::Finite(Arbitrary::arbitrary(g)) } } } impl Arbitrary for AddressRecord { - fn arbitrary(g: &mut G) -> Self { - let addr = Protocol::Tcp(g.gen::() % 256).into(); + fn arbitrary(g: &mut Gen) -> Self { + let addr = Protocol::Tcp(u16::arbitrary(g) % 256).into(); let score = AddressScore::arbitrary(g); AddressRecord::new(addr, score) } @@ -379,7 +378,9 @@ mod tests { } #[test] + #[ignore] fn score_retention() { + return todo!("This test fails randomly"); fn prop(first: AddressRecord, other: AddressRecord) -> TestResult { if first.addr == other.addr { return TestResult::discard(); diff --git a/transports/deflate/Cargo.toml b/transports/deflate/Cargo.toml index d2eb28b8177..9814b55b752 100644 --- a/transports/deflate/Cargo.toml +++ b/transports/deflate/Cargo.toml @@ -18,5 +18,5 @@ flate2 = "1.0" [dev-dependencies] async-std = "1.6.2" libp2p-tcp = { path = "../../transports/tcp" } -quickcheck = "0.9" +quickcheck = "1" rand = "0.8" diff --git a/transports/deflate/tests/test.rs b/transports/deflate/tests/test.rs index 06d91ddd808..e1c3ddcd03e 100644 --- a/transports/deflate/tests/test.rs +++ b/transports/deflate/tests/test.rs @@ -22,7 +22,8 @@ use futures::{future, prelude::*}; use libp2p_core::{transport::Transport, upgrade}; use libp2p_deflate::DeflateConfig; use libp2p_tcp::TcpTransport; -use quickcheck::{QuickCheck, RngCore, TestResult}; +use quickcheck::{QuickCheck, TestResult}; +use rand::RngCore; #[test] fn deflate() { diff --git a/transports/noise/Cargo.toml b/transports/noise/Cargo.toml index 351b8d826d3..fbdae433a3f 100644 --- a/transports/noise/Cargo.toml +++ b/transports/noise/Cargo.toml @@ -32,7 +32,7 @@ snow = { version = "0.9.0", features = ["default-resolver"], default-features = async-io = "1.2.0" env_logger = "0.9.0" libp2p-tcp = { path = "../../transports/tcp" } -quickcheck = "0.9.0" +quickcheck = "1" libsodium-sys-stable = { version = "1.19.22", features = ["fetch-latest"] } ed25519-compact = "1.0.11" diff --git a/transports/noise/tests/smoke.rs b/transports/noise/tests/smoke.rs index 0148d03b4d6..d3806f1013c 100644 --- a/transports/noise/tests/smoke.rs +++ b/transports/noise/tests/smoke.rs @@ -31,7 +31,7 @@ use libp2p_noise::{ }; use libp2p_tcp::TcpTransport; use log::info; -use quickcheck::QuickCheck; +use quickcheck::*; use std::{convert::TryInto, io, net::TcpStream}; #[allow(dead_code)] @@ -324,11 +324,13 @@ fn expect_identity( #[derive(Debug, Clone, PartialEq, Eq)] struct Message(Vec); -impl quickcheck::Arbitrary for Message { - fn arbitrary(g: &mut G) -> Self { - let s = 1 + g.next_u32() % (128 * 1024); - let mut v = vec![0; s.try_into().unwrap()]; - g.fill_bytes(&mut v); +impl Arbitrary for Message { + fn arbitrary(g: &mut Gen) -> Self { + let s = 1 + usize::arbitrary(g) % (128 * 1024); + let mut v = vec![0; s]; + for b in &mut v { + *b = u8::arbitrary(g); + } Message(v) } } diff --git a/transports/plaintext/Cargo.toml b/transports/plaintext/Cargo.toml index 3d81ee87d85..449a15c4be8 100644 --- a/transports/plaintext/Cargo.toml +++ b/transports/plaintext/Cargo.toml @@ -22,7 +22,7 @@ void = "1.0.2" [dev-dependencies] env_logger = "0.9.0" -quickcheck = "0.9.0" +quickcheck = "1" rand = "0.8" [build-dependencies] diff --git a/transports/pnet/Cargo.toml b/transports/pnet/Cargo.toml index e4f38c0fc3d..73988fb89e4 100644 --- a/transports/pnet/Cargo.toml +++ b/transports/pnet/Cargo.toml @@ -19,4 +19,4 @@ rand = "0.8" pin-project = "1.0.2" [dev-dependencies] -quickcheck = "0.9.0" +quickcheck = "1" diff --git a/transports/pnet/src/lib.rs b/transports/pnet/src/lib.rs index efd27b14667..c4d6e7cc720 100644 --- a/transports/pnet/src/lib.rs +++ b/transports/pnet/src/lib.rs @@ -319,9 +319,8 @@ mod tests { use quickcheck::*; impl Arbitrary for PreSharedKey { - fn arbitrary(g: &mut G) -> PreSharedKey { - let mut key = [0; KEY_SIZE]; - g.fill_bytes(&mut key); + fn arbitrary(g: &mut Gen) -> PreSharedKey { + let key = core::array::from_fn(|_| u8::arbitrary(g)); PreSharedKey(key) } } From 7ac75e9065da40a74932f8b848df548321ab3793 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Wed, 31 Aug 2022 14:47:17 +0300 Subject: [PATCH 04/30] cargo fmt --- protocols/kad/src/kbucket.rs | 2 +- protocols/kad/src/query/peers/closest.rs | 7 +++--- .../kad/src/query/peers/closest/disjoint.rs | 25 ++++++++++++------- swarm/src/registry.rs | 2 +- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/protocols/kad/src/kbucket.rs b/protocols/kad/src/kbucket.rs index c377b2b5b7f..0370bd53456 100644 --- a/protocols/kad/src/kbucket.rs +++ b/protocols/kad/src/kbucket.rs @@ -530,7 +530,7 @@ mod tests { impl Arbitrary for TestTable { fn arbitrary(g: &mut Gen) -> TestTable { let local_key = Key::from(PeerId::random()); - let timeout = Duration::from_secs(1+u64::arbitrary(g) % 360); + let timeout = Duration::from_secs(1 + u64::arbitrary(g) % 360); let mut table = TestTable::new(local_key.clone().into(), timeout); let mut num_total = usize::arbitrary(g) % 100; for (i, b) in &mut table.buckets.iter_mut().enumerate().rev() { diff --git a/protocols/kad/src/query/peers/closest.rs b/protocols/kad/src/query/peers/closest.rs index c1f86237ebb..5784f594e33 100644 --- a/protocols/kad/src/query/peers/closest.rs +++ b/protocols/kad/src/query/peers/closest.rs @@ -502,9 +502,10 @@ mod tests { impl Arbitrary for ClosestPeersIter { fn arbitrary(g: &mut Gen) -> ClosestPeersIter { - let known_closest_peers = random_peers(1 + usize::arbitrary(g) % 59, &mut rand::thread_rng()) - .into_iter() - .map(Key::from); + let known_closest_peers = + random_peers(1 + usize::arbitrary(g) % 59, &mut rand::thread_rng()) + .into_iter() + .map(Key::from); let target = Key::from(Into::::into(PeerId::random())); let config = ClosestPeersIterConfig { parallelism: NonZeroUsize::new(1 + usize::arbitrary(g) % 10).unwrap(), diff --git a/protocols/kad/src/query/peers/closest/disjoint.rs b/protocols/kad/src/query/peers/closest/disjoint.rs index 81313853292..c88311a111a 100644 --- a/protocols/kad/src/query/peers/closest/disjoint.rs +++ b/protocols/kad/src/query/peers/closest/disjoint.rs @@ -455,7 +455,10 @@ mod tests { fn arbitrary(g: &mut Gen) -> Self { let target = Target::arbitrary(g).0; let num_closest_iters = usize::arbitrary(g) % (20 + 1); - let peers = random_peers(usize::arbitrary(g) % (20 * num_closest_iters + 1), &mut rand::thread_rng()); + let peers = random_peers( + usize::arbitrary(g) % (20 * num_closest_iters + 1), + &mut rand::thread_rng(), + ); let iters: Vec<_> = (0..num_closest_iters) .map(|_| { @@ -587,7 +590,7 @@ mod tests { impl Arbitrary for Parallelism { fn arbitrary(g: &mut Gen) -> Self { - Parallelism(NonZeroUsize::new(1+usize::arbitrary(g) % 9).unwrap()) + Parallelism(NonZeroUsize::new(1 + usize::arbitrary(g) % 9).unwrap()) } } @@ -596,7 +599,7 @@ mod tests { impl Arbitrary for NumResults { fn arbitrary(g: &mut Gen) -> Self { - NumResults(NonZeroUsize::new(1+usize::arbitrary(g) % K_VALUE.get() - 1).unwrap()) + NumResults(NonZeroUsize::new(1 + usize::arbitrary(g) % K_VALUE.get() - 1).unwrap()) } } @@ -616,7 +619,7 @@ mod tests { impl Arbitrary for PeerVec { fn arbitrary(g: &mut Gen) -> Self { PeerVec( - (0..(1+usize::arbitrary(g) % 59)) + (0..(1 + usize::arbitrary(g) % 59)) .map(|_| PeerId::random()) .map(Key::from) .collect(), @@ -744,10 +747,13 @@ mod tests { impl Arbitrary for Graph { fn arbitrary(g: &mut Gen) -> Self { - let mut peer_ids = random_peers(K_VALUE.get() + (usize::arbitrary(g) % (200 - K_VALUE.get())), &mut rand::thread_rng()) - .into_iter() - .map(|peer_id| (peer_id.clone(), Key::from(peer_id))) - .collect::>(); + let mut peer_ids = random_peers( + K_VALUE.get() + (usize::arbitrary(g) % (200 - K_VALUE.get())), + &mut rand::thread_rng(), + ) + .into_iter() + .map(|peer_id| (peer_id.clone(), Key::from(peer_id))) + .collect::>(); // Make each peer aware of its direct neighborhood. let mut peers = peer_ids @@ -775,7 +781,8 @@ mod tests { for (peer_id, peer) in peers.iter_mut() { peer_ids.shuffle(&mut rand::thread_rng()); - let num_peers = K_VALUE.get() + usize::arbitrary(g) % (peer_ids.len() - K_VALUE.get()); + let num_peers = + K_VALUE.get() + usize::arbitrary(g) % (peer_ids.len() - K_VALUE.get()); let mut random_peer_ids = peer_ids .choose_multiple(&mut rand::thread_rng(), num_peers) // Make sure not to include itself. diff --git a/swarm/src/registry.rs b/swarm/src/registry.rs index a4c78766f8b..4c40c0b01f9 100644 --- a/swarm/src/registry.rs +++ b/swarm/src/registry.rs @@ -342,7 +342,7 @@ mod tests { impl Arbitrary for AddressScore { fn arbitrary(g: &mut Gen) -> AddressScore { - if u8::arbitrary(g) % 10 == 0 { + if u8::arbitrary(g) % 10 == 0 { // ~10% "Infinitely" scored addresses AddressScore::Infinite } else { From f1e4833c64a2febf71a372f25a4579a01055ce4b Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Wed, 31 Aug 2022 22:18:56 +0300 Subject: [PATCH 05/30] Remove rand dep from dev workspace --- Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 2057cffdce7..ba73da0322b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -100,7 +100,6 @@ libp2p-yamux = { version = "0.39.0", path = "muxers/yamux", optional = true } multiaddr = { version = "0.14.0" } parking_lot = "0.12.0" pin-project = "1.0.0" -rand = "0.8" # Explicit dependency to be used in `wasm-bindgen` feature smallvec = "1.6.1" [target.'cfg(not(any(target_os = "emscripten", target_os = "wasi", target_os = "unknown")))'.dependencies] From a36e5515310fc34021d2addedfc5525f4a35adb8 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Wed, 31 Aug 2022 23:53:47 +0300 Subject: [PATCH 06/30] Remove Rng param from fn random_peers --- protocols/kad/src/query/peers/closest.rs | 21 ++++++++---------- .../kad/src/query/peers/closest/disjoint.rs | 22 ++++++++----------- 2 files changed, 18 insertions(+), 25 deletions(-) diff --git a/protocols/kad/src/query/peers/closest.rs b/protocols/kad/src/query/peers/closest.rs index 5784f594e33..a0f36be81d9 100644 --- a/protocols/kad/src/query/peers/closest.rs +++ b/protocols/kad/src/query/peers/closest.rs @@ -483,7 +483,8 @@ mod tests { use rand::{rngs::StdRng, Rng, SeedableRng}; use std::{iter, time::Duration}; - fn random_peers(n: usize, g: &mut R) -> Vec { + fn random_peers(n: usize) -> Vec { + let mut g = rand::thread_rng(); (0..n) .map(|_| { PeerId::from_multihash( @@ -502,10 +503,9 @@ mod tests { impl Arbitrary for ClosestPeersIter { fn arbitrary(g: &mut Gen) -> ClosestPeersIter { - let known_closest_peers = - random_peers(1 + usize::arbitrary(g) % 59, &mut rand::thread_rng()) - .into_iter() - .map(Key::from); + let known_closest_peers = random_peers(1 + usize::arbitrary(g) % 59) + .into_iter() + .map(Key::from); let target = Key::from(Into::::into(PeerId::random())); let config = ClosestPeersIterConfig { parallelism: NonZeroUsize::new(1 + usize::arbitrary(g) % 10).unwrap(), @@ -615,7 +615,7 @@ mod tests { for (i, k) in expected.iter().enumerate() { if rng.gen_bool(0.75) { let num_closer = rng.gen_range(0..iter.config.num_results.get() + 1); - let closer_peers = random_peers(num_closer, &mut rng); + let closer_peers = random_peers(num_closer); remaining.extend(closer_peers.iter().cloned().map(Key::from)); iter.on_success(k.preimage(), closer_peers); } else { @@ -670,11 +670,10 @@ mod tests { #[test] fn no_duplicates() { - fn prop(mut iter: ClosestPeersIter, seed: Seed) -> bool { + fn prop(mut iter: ClosestPeersIter) -> bool { let now = Instant::now(); - let mut rng = StdRng::from_seed(seed.0); - let closer = random_peers(1, &mut rng); + let closer = random_peers(1); // A first peer reports a "closer" peer. let peer1 = match iter.next(now) { @@ -706,9 +705,7 @@ mod tests { true } - QuickCheck::new() - .tests(10) - .quickcheck(prop as fn(_, _) -> _) + QuickCheck::new().tests(10).quickcheck(prop as fn(_) -> _) } #[test] diff --git a/protocols/kad/src/query/peers/closest/disjoint.rs b/protocols/kad/src/query/peers/closest/disjoint.rs index c88311a111a..a736aaca983 100644 --- a/protocols/kad/src/query/peers/closest/disjoint.rs +++ b/protocols/kad/src/query/peers/closest/disjoint.rs @@ -455,10 +455,7 @@ mod tests { fn arbitrary(g: &mut Gen) -> Self { let target = Target::arbitrary(g).0; let num_closest_iters = usize::arbitrary(g) % (20 + 1); - let peers = random_peers( - usize::arbitrary(g) % (20 * num_closest_iters + 1), - &mut rand::thread_rng(), - ); + let peers = random_peers(usize::arbitrary(g) % (20 * num_closest_iters + 1)); let iters: Vec<_> = (0..num_closest_iters) .map(|_| { @@ -540,11 +537,12 @@ mod tests { impl Arbitrary for Target { fn arbitrary(_g: &mut Gen) -> Self { - Target(Key::from(random_peers(1, &mut rand::thread_rng()).pop().unwrap()).into()) + Target(Key::from(random_peers(1).pop().unwrap()).into()) } } - fn random_peers(n: usize, g: &mut R) -> Vec { + fn random_peers(n: usize) -> Vec { + let mut g = rand::thread_rng(); (0..n) .map(|_| { PeerId::from_multihash( @@ -747,13 +745,11 @@ mod tests { impl Arbitrary for Graph { fn arbitrary(g: &mut Gen) -> Self { - let mut peer_ids = random_peers( - K_VALUE.get() + (usize::arbitrary(g) % (200 - K_VALUE.get())), - &mut rand::thread_rng(), - ) - .into_iter() - .map(|peer_id| (peer_id.clone(), Key::from(peer_id))) - .collect::>(); + let mut peer_ids = + random_peers(K_VALUE.get() + (usize::arbitrary(g) % (200 - K_VALUE.get()))) + .into_iter() + .map(|peer_id| (peer_id.clone(), Key::from(peer_id))) + .collect::>(); // Make each peer aware of its direct neighborhood. let mut peers = peer_ids From cff5192c82a4f0c2039bba3ea65efa27a8af8694 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Thu, 1 Sep 2022 17:00:10 +0300 Subject: [PATCH 07/30] Fix kad:rand_distance test --- protocols/kad/src/kbucket.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/protocols/kad/src/kbucket.rs b/protocols/kad/src/kbucket.rs index 0370bd53456..999bdcc4dc4 100644 --- a/protocols/kad/src/kbucket.rs +++ b/protocols/kad/src/kbucket.rs @@ -599,10 +599,9 @@ mod tests { } #[test] - #[ignore] fn rand_distance() { - return todo!("test fails randomly"); fn prop(ix: u8) -> bool { + let ix = ix.min(254); // avoid overflow in 2^ix let d = BucketIndex(ix as usize).rand_distance(&mut rand::thread_rng()); let n = U256::from(<[u8; 32]>::from(d.0)); let b = U256::from(2); From 7dd2ab635402ac25f4b36ba449d73fa232bfdbb7 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Thu, 1 Sep 2022 21:10:05 +0300 Subject: [PATCH 08/30] Fix kad:bucket_contains_range test --- protocols/kad/src/kbucket.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/protocols/kad/src/kbucket.rs b/protocols/kad/src/kbucket.rs index 999bdcc4dc4..bc347f3ae16 100644 --- a/protocols/kad/src/kbucket.rs +++ b/protocols/kad/src/kbucket.rs @@ -573,9 +573,7 @@ mod tests { } #[test] - #[ignore] fn bucket_contains_range() { - return todo!("test fails randomly"); fn prop(ix: u8) { let index = BucketIndex(ix as usize); let mut bucket = KBucket::, ()>::new(Duration::from_secs(0)); @@ -591,8 +589,13 @@ mod tests { assert!(bucket_ref.contains(&min)); assert!(bucket_ref.contains(&max)); - assert!(!bucket_ref.contains(&Distance(min.0 - 1))); - assert!(!bucket_ref.contains(&Distance(max.0 + 1))); + if min != Distance(0.into()) { + assert!(!bucket_ref.contains(&Distance(min.0 - 1))); + } + + if max != Distance(U256::max_value()) { + assert!(!bucket_ref.contains(&Distance(max.0 + 1))); + } } quickcheck(prop as fn(_)); From d8050598d6236972e9a4332a7e079afc4fe6a72f Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Thu, 1 Sep 2022 21:33:18 +0300 Subject: [PATCH 09/30] Fix kad:closest_and_disjoint_closest_yield_same_result test --- protocols/kad/src/query/peers/closest/disjoint.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/protocols/kad/src/query/peers/closest/disjoint.rs b/protocols/kad/src/query/peers/closest/disjoint.rs index a736aaca983..931cf9f4c28 100644 --- a/protocols/kad/src/query/peers/closest/disjoint.rs +++ b/protocols/kad/src/query/peers/closest/disjoint.rs @@ -597,7 +597,7 @@ mod tests { impl Arbitrary for NumResults { fn arbitrary(g: &mut Gen) -> Self { - NumResults(NonZeroUsize::new(1 + usize::arbitrary(g) % K_VALUE.get() - 1).unwrap()) + NumResults(NonZeroUsize::new(1 + usize::arbitrary(g) % K_VALUE.get()).unwrap()) } } @@ -778,7 +778,7 @@ mod tests { peer_ids.shuffle(&mut rand::thread_rng()); let num_peers = - K_VALUE.get() + usize::arbitrary(g) % (peer_ids.len() - K_VALUE.get()); + K_VALUE.get() + usize::arbitrary(g) % (1 + peer_ids.len() - K_VALUE.get()); let mut random_peer_ids = peer_ids .choose_multiple(&mut rand::thread_rng(), num_peers) // Make sure not to include itself. @@ -869,9 +869,7 @@ mod tests { /// Ensure [`ClosestPeersIter`] and [`ClosestDisjointPeersIter`] yield same closest peers. #[test] - #[ignore] fn closest_and_disjoint_closest_yield_same_result() { - return todo!("test fails randomly"); fn prop( target: Target, graph: Graph, From c092d1b538074c79d376b5532c5f521043ee03df Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Fri, 2 Sep 2022 12:42:10 +0300 Subject: [PATCH 10/30] Fix swarm:score_retention test --- swarm/src/registry.rs | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/swarm/src/registry.rs b/swarm/src/registry.rs index 4c40c0b01f9..87087f94bdf 100644 --- a/swarm/src/registry.rs +++ b/swarm/src/registry.rs @@ -378,11 +378,9 @@ mod tests { } #[test] - #[ignore] fn score_retention() { - return todo!("This test fails randomly"); fn prop(first: AddressRecord, other: AddressRecord) -> TestResult { - if first.addr == other.addr { + if first.addr == other.addr || first.score.is_zero() { return TestResult::discard(); } @@ -413,6 +411,33 @@ mod tests { quickcheck(prop as fn(_, _) -> _); } + #[test] + fn score_retention_finite_0() { + let first = { + let addr = Protocol::Tcp(42).into(); + let score = AddressScore::Finite(0); + AddressRecord::new(addr, score) + }; + let other = { + let addr = Protocol::Udp(42).into(); + let score = AddressScore::Finite(42); + AddressRecord::new(addr, score) + }; + + let mut addresses = Addresses::default(); + + // Add the first address. + addresses.add(first.addr.clone(), first.score); + assert!(addresses.iter().any(|a| &a.addr == &first.addr)); + + // Add another address so the first will address be purged, + // because its score is finite(0) + addresses.add(other.addr.clone(), other.score); + + assert!(addresses.iter().any(|a| &a.addr == &other.addr)); + assert!(!addresses.iter().any(|a| &a.addr == &first.addr)); + } + #[test] fn finitely_scored_address_limit() { fn prop(reports: Vec, limit: NonZeroU8) { From f6f68992438f2b2e13f67494008b8f69fe3a3ec6 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 2 Sep 2022 13:01:35 +0300 Subject: [PATCH 11/30] Apply suggestions from code review for over/under-flow Co-authored-by: Thomas Eizinger --- protocols/kad/src/kbucket.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/protocols/kad/src/kbucket.rs b/protocols/kad/src/kbucket.rs index bc347f3ae16..891b9b38c69 100644 --- a/protocols/kad/src/kbucket.rs +++ b/protocols/kad/src/kbucket.rs @@ -589,11 +589,11 @@ mod tests { assert!(bucket_ref.contains(&min)); assert!(bucket_ref.contains(&max)); - if min != Distance(0.into()) { + if min != Distance(0.into()) { // avoid underflow assert!(!bucket_ref.contains(&Distance(min.0 - 1))); } - if max != Distance(U256::max_value()) { + if max != Distance(U256::max_value()) { // avoid overflow assert!(!bucket_ref.contains(&Distance(max.0 + 1))); } } From 55ed6550a7071822290bb772dd5873c9c69ebbfd Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Fri, 2 Sep 2022 13:13:40 +0300 Subject: [PATCH 12/30] cargo fmt --- protocols/kad/src/kbucket.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/protocols/kad/src/kbucket.rs b/protocols/kad/src/kbucket.rs index 891b9b38c69..9e60b99f502 100644 --- a/protocols/kad/src/kbucket.rs +++ b/protocols/kad/src/kbucket.rs @@ -589,11 +589,13 @@ mod tests { assert!(bucket_ref.contains(&min)); assert!(bucket_ref.contains(&max)); - if min != Distance(0.into()) { // avoid underflow + if min != Distance(0.into()) { + // ^ avoid underflow assert!(!bucket_ref.contains(&Distance(min.0 - 1))); } - if max != Distance(U256::max_value()) { // avoid overflow + if max != Distance(U256::max_value()) { + // ^ avoid overflow assert!(!bucket_ref.contains(&Distance(max.0 + 1))); } } From cc644941970029a071ddd6c46513d52bcf6330c0 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Tue, 6 Sep 2022 13:54:53 +0300 Subject: [PATCH 13/30] Introduce quickcheck-ext crate with Gen::gen_range --- Cargo.toml | 1 + core/Cargo.toml | 2 +- misc/multistream-select/Cargo.toml | 2 +- misc/quickcheck-ext/Cargo.toml | 8 ++++++++ misc/quickcheck-ext/src/lib.rs | 18 ++++++++++++++++++ muxers/mplex/Cargo.toml | 2 +- protocols/gossipsub/Cargo.toml | 2 +- protocols/kad/Cargo.toml | 2 +- protocols/ping/Cargo.toml | 2 +- protocols/relay/Cargo.toml | 2 +- transports/deflate/Cargo.toml | 2 +- transports/noise/Cargo.toml | 2 +- transports/plaintext/Cargo.toml | 2 +- transports/pnet/Cargo.toml | 2 +- 14 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 misc/quickcheck-ext/Cargo.toml create mode 100644 misc/quickcheck-ext/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 00f801eea77..7eee7165df0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -128,6 +128,7 @@ members = [ "misc/rw-stream-sink", "misc/keygen", "misc/prost-codec", + "misc/quickcheck-ext", "muxers/mplex", "muxers/yamux", "protocols/dcutr", diff --git a/core/Cargo.toml b/core/Cargo.toml index b567aa6fa6a..f3d5e6c558d 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -50,7 +50,7 @@ libp2p-mplex = { path = "../muxers/mplex" } libp2p-noise = { path = "../transports/noise" } libp2p-tcp = { path = "../transports/tcp" } multihash = { version = "0.16", default-features = false, features = ["arb"] } -quickcheck = "1" +quickcheck = { package = "quickcheck-ext", path = "../misc/quickcheck-ext" } rmp-serde = "1.0" serde_json = "1.0" diff --git a/misc/multistream-select/Cargo.toml b/misc/multistream-select/Cargo.toml index d6490e40ba9..18029988262 100644 --- a/misc/multistream-select/Cargo.toml +++ b/misc/multistream-select/Cargo.toml @@ -25,6 +25,6 @@ libp2p-core = { path = "../../core", default-features = false } libp2p-swarm = { path = "../../swarm", default-features = false } libp2p-mplex = { path = "../../muxers/mplex" } libp2p-plaintext = { path = "../../transports/plaintext" } -quickcheck = "1" +quickcheck = { package = "quickcheck-ext", path = "../../misc/quickcheck-ext" } rand = "0.8" rw-stream-sink = { version = "0.3.0", path = "../../misc/rw-stream-sink" } diff --git a/misc/quickcheck-ext/Cargo.toml b/misc/quickcheck-ext/Cargo.toml new file mode 100644 index 00000000000..9b5bc6510e2 --- /dev/null +++ b/misc/quickcheck-ext/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "quickcheck-ext" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +quickcheck = "1" diff --git a/misc/quickcheck-ext/src/lib.rs b/misc/quickcheck-ext/src/lib.rs new file mode 100644 index 00000000000..e679d352dc0 --- /dev/null +++ b/misc/quickcheck-ext/src/lib.rs @@ -0,0 +1,18 @@ +pub use quickcheck::*; + +use core::ops::{Add, Range, Rem, Sub}; + +pub trait GenRange { + fn gen_range(&mut self, _range: Range) -> T + where + T: Arbitrary + Copy + Add + Rem + Sub; +} + +impl GenRange for Gen { + fn gen_range(&mut self, range: Range) -> T + where + T: Arbitrary + Copy + Add + Rem + Sub, + { + ::arbitrary(self) % (range.end - range.start) + range.start + } +} diff --git a/muxers/mplex/Cargo.toml b/muxers/mplex/Cargo.toml index 9ed2d62bf54..e7b2c9cd7d9 100644 --- a/muxers/mplex/Cargo.toml +++ b/muxers/mplex/Cargo.toml @@ -29,7 +29,7 @@ env_logger = "0.9" futures = "0.3" libp2p-tcp = { path = "../../transports/tcp" } libp2p-plaintext = { path = "../../transports/plaintext" } -quickcheck = "1" +quickcheck = { package = "quickcheck-ext", path = "../../misc/quickcheck-ext" } [[bench]] name = "split_send_size" diff --git a/protocols/gossipsub/Cargo.toml b/protocols/gossipsub/Cargo.toml index 55fafb2b3a7..180c4c54b49 100644 --- a/protocols/gossipsub/Cargo.toml +++ b/protocols/gossipsub/Cargo.toml @@ -40,7 +40,7 @@ libp2p-plaintext = { path = "../../transports/plaintext" } libp2p-yamux = { path = "../../muxers/yamux" } libp2p-mplex = { path = "../../muxers/mplex" } libp2p-noise = { path = "../../transports/noise" } -quickcheck = "1" +quickcheck = { package = "quickcheck-ext", path = "../../misc/quickcheck-ext" } hex = "0.4.2" derive_builder = "0.11.1" diff --git a/protocols/kad/Cargo.toml b/protocols/kad/Cargo.toml index 5ef30f7156a..4bec926d990 100644 --- a/protocols/kad/Cargo.toml +++ b/protocols/kad/Cargo.toml @@ -37,7 +37,7 @@ env_logger = "0.9.0" futures-timer = "3.0" libp2p-noise = { path = "../../transports/noise" } libp2p-yamux = { path = "../../muxers/yamux" } -quickcheck = "1" +quickcheck = { package = "quickcheck-ext", path = "../../misc/quickcheck-ext" } [build-dependencies] prost-build = "0.11" diff --git a/protocols/ping/Cargo.toml b/protocols/ping/Cargo.toml index 8bc10eb3975..7f02295a58e 100644 --- a/protocols/ping/Cargo.toml +++ b/protocols/ping/Cargo.toml @@ -26,4 +26,4 @@ libp2p-tcp = { path = "../../transports/tcp" } libp2p-noise = { path = "../../transports/noise" } libp2p-yamux = { path = "../../muxers/yamux" } libp2p-mplex = { path = "../../muxers/mplex" } -quickcheck = "1" +quickcheck = { package = "quickcheck-ext", path = "../../misc/quickcheck-ext" } diff --git a/protocols/relay/Cargo.toml b/protocols/relay/Cargo.toml index ee059d02d50..8c503dc0345 100644 --- a/protocols/relay/Cargo.toml +++ b/protocols/relay/Cargo.toml @@ -40,5 +40,5 @@ libp2p-kad = { path = "../kad" } libp2p-ping = { path = "../ping" } libp2p-plaintext = { path = "../../transports/plaintext" } libp2p-yamux = { path = "../../muxers/yamux" } -quickcheck = "1" +quickcheck = { package = "quickcheck-ext", path = "../../misc/quickcheck-ext" } clap = {version = "3.1.6", features = ["derive"]} diff --git a/transports/deflate/Cargo.toml b/transports/deflate/Cargo.toml index 9814b55b752..272d685719f 100644 --- a/transports/deflate/Cargo.toml +++ b/transports/deflate/Cargo.toml @@ -18,5 +18,5 @@ flate2 = "1.0" [dev-dependencies] async-std = "1.6.2" libp2p-tcp = { path = "../../transports/tcp" } -quickcheck = "1" +quickcheck = { package = "quickcheck-ext", path = "../../misc/quickcheck-ext" } rand = "0.8" diff --git a/transports/noise/Cargo.toml b/transports/noise/Cargo.toml index fbdae433a3f..91cba3ec134 100644 --- a/transports/noise/Cargo.toml +++ b/transports/noise/Cargo.toml @@ -32,7 +32,7 @@ snow = { version = "0.9.0", features = ["default-resolver"], default-features = async-io = "1.2.0" env_logger = "0.9.0" libp2p-tcp = { path = "../../transports/tcp" } -quickcheck = "1" +quickcheck = { package = "quickcheck-ext", path = "../../misc/quickcheck-ext" } libsodium-sys-stable = { version = "1.19.22", features = ["fetch-latest"] } ed25519-compact = "1.0.11" diff --git a/transports/plaintext/Cargo.toml b/transports/plaintext/Cargo.toml index 449a15c4be8..2df87bdd082 100644 --- a/transports/plaintext/Cargo.toml +++ b/transports/plaintext/Cargo.toml @@ -22,7 +22,7 @@ void = "1.0.2" [dev-dependencies] env_logger = "0.9.0" -quickcheck = "1" +quickcheck = { package = "quickcheck-ext", path = "../../misc/quickcheck-ext" } rand = "0.8" [build-dependencies] diff --git a/transports/pnet/Cargo.toml b/transports/pnet/Cargo.toml index 73988fb89e4..5d1c4cd07e9 100644 --- a/transports/pnet/Cargo.toml +++ b/transports/pnet/Cargo.toml @@ -19,4 +19,4 @@ rand = "0.8" pin-project = "1.0.2" [dev-dependencies] -quickcheck = "1" +quickcheck = { package = "quickcheck-ext", path = "../../misc/quickcheck-ext" } From 37571347546975af9d278bfb57072db3eaed8a16 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Tue, 6 Sep 2022 15:26:48 +0300 Subject: [PATCH 14/30] Use ::gen_range to generate a random number in .. range --- misc/multistream-select/src/protocol.rs | 4 ++-- muxers/mplex/src/io.rs | 6 +++--- protocols/gossipsub/src/behaviour.rs | 6 +++--- protocols/gossipsub/src/protocol.rs | 4 ++-- protocols/kad/src/kbucket.rs | 6 +++--- protocols/kad/src/kbucket/bucket.rs | 6 +++--- protocols/kad/src/query/peers/closest.rs | 8 ++++---- .../kad/src/query/peers/closest/disjoint.rs | 17 ++++++++--------- protocols/kad/src/record.rs | 4 ++-- swarm/Cargo.toml | 2 +- swarm/src/lib.rs | 6 +++--- swarm/src/registry.rs | 4 ++-- transports/noise/tests/smoke.rs | 2 +- 13 files changed, 37 insertions(+), 38 deletions(-) diff --git a/misc/multistream-select/src/protocol.rs b/misc/multistream-select/src/protocol.rs index ede694a5b9b..cd612f5b5ce 100644 --- a/misc/multistream-select/src/protocol.rs +++ b/misc/multistream-select/src/protocol.rs @@ -459,7 +459,7 @@ mod tests { impl Arbitrary for Protocol { fn arbitrary(g: &mut Gen) -> Protocol { - let n = 1 + usize::arbitrary(g) % g.size(); + let n = g.gen_range(1..g.size()); let p: String = iter::repeat(()) .map(|()| char::arbitrary(g)) .filter(|&c| c.is_ascii_alphanumeric()) @@ -471,7 +471,7 @@ mod tests { impl Arbitrary for Message { fn arbitrary(g: &mut Gen) -> Message { - match u8::arbitrary(g) % 5 { + match g.gen_range(0..5) { 0 => Message::Header(HeaderLine::V1), 1 => Message::NotAvailable, 2 => Message::ListProtocols, diff --git a/muxers/mplex/src/io.rs b/muxers/mplex/src/io.rs index 0524c15c960..c5ad6bf105d 100644 --- a/muxers/mplex/src/io.rs +++ b/muxers/mplex/src/io.rs @@ -1120,10 +1120,10 @@ mod tests { impl Arbitrary for MplexConfig { fn arbitrary(g: &mut Gen) -> MplexConfig { MplexConfig { - max_substreams: 1 + usize::arbitrary(g) % 99, - max_buffer_len: 1 + usize::arbitrary(g) % 999, + max_substreams: g.gen_range(1..100), + max_buffer_len: g.gen_range(1..1000), max_buffer_behaviour: MaxBufferBehaviour::arbitrary(g), - split_send_size: 1 + usize::arbitrary(g) % 9999, + split_send_size: g.gen_range(1..10000), protocol_name: crate::config::DEFAULT_MPLEX_PROTOCOL_NAME, } } diff --git a/protocols/gossipsub/src/behaviour.rs b/protocols/gossipsub/src/behaviour.rs index 5d3042e44f6..0ee9d3a85af 100644 --- a/protocols/gossipsub/src/behaviour.rs +++ b/protocols/gossipsub/src/behaviour.rs @@ -3705,13 +3705,13 @@ mod local_test { fn arbitrary(g: &mut Gen) -> Self { let mut rpc = empty_rpc(); - for _ in 0..(u8::arbitrary(g) % 10) { + for _ in 0..g.gen_range(0..10) { rpc.subscriptions.push(test_subscription()); } - for _ in 0..(u8::arbitrary(g) % 10) { + for _ in 0..g.gen_range(0..10) { rpc.messages.push(test_message()); } - for _ in 0..(u8::arbitrary(g) % 10) { + for _ in 0..g.gen_range(0..10) { rpc.control_msgs.push(test_control()); } rpc diff --git a/protocols/gossipsub/src/protocol.rs b/protocols/gossipsub/src/protocol.rs index fb43fe0eda6..e83290efa0f 100644 --- a/protocols/gossipsub/src/protocol.rs +++ b/protocols/gossipsub/src/protocol.rs @@ -587,7 +587,7 @@ mod tests { config, ) .unwrap(); - let data = (0..(10 + usize::arbitrary(g) % 10014)) + let data = (0..g.gen_range(10..10024)) .map(|_| u8::arbitrary(g)) .collect::>(); let topic_id = TopicId::arbitrary(g).0; @@ -600,7 +600,7 @@ mod tests { impl Arbitrary for TopicId { fn arbitrary(g: &mut Gen) -> Self { - let topic_string: String = (0..(20 + usize::arbitrary(g) % 1004)) + let topic_string: String = (0..g.gen_range(20..1024)) .map(|_| char::arbitrary(g)) .collect::() .into(); diff --git a/protocols/kad/src/kbucket.rs b/protocols/kad/src/kbucket.rs index 9e60b99f502..aa0df1f3c63 100644 --- a/protocols/kad/src/kbucket.rs +++ b/protocols/kad/src/kbucket.rs @@ -530,12 +530,12 @@ mod tests { impl Arbitrary for TestTable { fn arbitrary(g: &mut Gen) -> TestTable { let local_key = Key::from(PeerId::random()); - let timeout = Duration::from_secs(1 + u64::arbitrary(g) % 360); + let timeout = Duration::from_secs(g.gen_range(1..360)); let mut table = TestTable::new(local_key.clone().into(), timeout); - let mut num_total = usize::arbitrary(g) % 100; + let mut num_total = g.gen_range(0..100); for (i, b) in &mut table.buckets.iter_mut().enumerate().rev() { let ix = BucketIndex(i); - let num = usize::arbitrary(g) % (usize::min(K_VALUE.get(), num_total) + 1); + let num = g.gen_range(0..usize::min(K_VALUE.get(), num_total) + 1); num_total -= num; for _ in 0..num { let distance = ix.rand_distance(&mut rand::thread_rng()); diff --git a/protocols/kad/src/kbucket/bucket.rs b/protocols/kad/src/kbucket/bucket.rs index 4a5eb5055f8..9a6df073c56 100644 --- a/protocols/kad/src/kbucket/bucket.rs +++ b/protocols/kad/src/kbucket/bucket.rs @@ -441,9 +441,9 @@ mod tests { impl Arbitrary for KBucket, ()> { fn arbitrary(g: &mut Gen) -> KBucket, ()> { - let timeout = Duration::from_secs(1 + u64::arbitrary(g) % g.size() as u64); + let timeout = Duration::from_secs(g.gen_range(1..g.size()) as u64); let mut bucket = KBucket::, ()>::new(timeout); - let num_nodes = 1 + usize::arbitrary(g) % K_VALUE.get(); + let num_nodes = g.gen_range(1..K_VALUE.get() + 1); for _ in 0..num_nodes { let key = Key::from(PeerId::random()); let node = Node { @@ -472,7 +472,7 @@ mod tests { impl Arbitrary for Position { fn arbitrary(g: &mut Gen) -> Position { - Position(usize::arbitrary(g) % K_VALUE.get()) + Position(g.gen_range(0..K_VALUE.get())) } } diff --git a/protocols/kad/src/query/peers/closest.rs b/protocols/kad/src/query/peers/closest.rs index a0f36be81d9..42cd95f6373 100644 --- a/protocols/kad/src/query/peers/closest.rs +++ b/protocols/kad/src/query/peers/closest.rs @@ -503,14 +503,14 @@ mod tests { impl Arbitrary for ClosestPeersIter { fn arbitrary(g: &mut Gen) -> ClosestPeersIter { - let known_closest_peers = random_peers(1 + usize::arbitrary(g) % 59) + let known_closest_peers = random_peers(g.gen_range(1..60)) .into_iter() .map(Key::from); let target = Key::from(Into::::into(PeerId::random())); let config = ClosestPeersIterConfig { - parallelism: NonZeroUsize::new(1 + usize::arbitrary(g) % 10).unwrap(), - num_results: NonZeroUsize::new(1 + usize::arbitrary(g) % 25).unwrap(), - peer_timeout: Duration::from_secs(10 + u64::arbitrary(g) % 20), + parallelism: NonZeroUsize::new(g.gen_range(1..10)).unwrap(), + num_results: NonZeroUsize::new(g.gen_range(1..25)).unwrap(), + peer_timeout: Duration::from_secs(g.gen_range(10..30)), }; ClosestPeersIter::with_config(config, target, known_closest_peers) } diff --git a/protocols/kad/src/query/peers/closest/disjoint.rs b/protocols/kad/src/query/peers/closest/disjoint.rs index 931cf9f4c28..473db8134b0 100644 --- a/protocols/kad/src/query/peers/closest/disjoint.rs +++ b/protocols/kad/src/query/peers/closest/disjoint.rs @@ -454,12 +454,12 @@ mod tests { impl Arbitrary for ResultIter>> { fn arbitrary(g: &mut Gen) -> Self { let target = Target::arbitrary(g).0; - let num_closest_iters = usize::arbitrary(g) % (20 + 1); - let peers = random_peers(usize::arbitrary(g) % (20 * num_closest_iters + 1)); + let num_closest_iters = g.gen_range(0..20 + 1); + let peers = random_peers(g.gen_range(0..20 * num_closest_iters + 1)); let iters: Vec<_> = (0..num_closest_iters) .map(|_| { - let num_peers = usize::arbitrary(g) % (20 + 1); + let num_peers = g.gen_range(0..20 + 1); let mut peers = peers .choose_multiple(&mut rand::thread_rng(), num_peers) .cloned() @@ -588,7 +588,7 @@ mod tests { impl Arbitrary for Parallelism { fn arbitrary(g: &mut Gen) -> Self { - Parallelism(NonZeroUsize::new(1 + usize::arbitrary(g) % 9).unwrap()) + Parallelism(NonZeroUsize::new(g.gen_range(1..10)).unwrap()) } } @@ -597,7 +597,7 @@ mod tests { impl Arbitrary for NumResults { fn arbitrary(g: &mut Gen) -> Self { - NumResults(NonZeroUsize::new(1 + usize::arbitrary(g) % K_VALUE.get()).unwrap()) + NumResults(NonZeroUsize::new(g.gen_range(1..K_VALUE.get())).unwrap()) } } @@ -617,7 +617,7 @@ mod tests { impl Arbitrary for PeerVec { fn arbitrary(g: &mut Gen) -> Self { PeerVec( - (0..(1 + usize::arbitrary(g) % 59)) + (0..g.gen_range(1..60)) .map(|_| PeerId::random()) .map(Key::from) .collect(), @@ -746,7 +746,7 @@ mod tests { impl Arbitrary for Graph { fn arbitrary(g: &mut Gen) -> Self { let mut peer_ids = - random_peers(K_VALUE.get() + (usize::arbitrary(g) % (200 - K_VALUE.get()))) + random_peers(g.gen_range(K_VALUE.get()..200)) .into_iter() .map(|peer_id| (peer_id.clone(), Key::from(peer_id))) .collect::>(); @@ -777,8 +777,7 @@ mod tests { for (peer_id, peer) in peers.iter_mut() { peer_ids.shuffle(&mut rand::thread_rng()); - let num_peers = - K_VALUE.get() + usize::arbitrary(g) % (1 + peer_ids.len() - K_VALUE.get()); + let num_peers = g.gen_range(K_VALUE.get()..peer_ids.len() + 1); let mut random_peer_ids = peer_ids .choose_multiple(&mut rand::thread_rng(), num_peers) // Make sure not to include itself. diff --git a/protocols/kad/src/record.rs b/protocols/kad/src/record.rs index 6c92ef94593..7780849575c 100644 --- a/protocols/kad/src/record.rs +++ b/protocols/kad/src/record.rs @@ -183,7 +183,7 @@ mod tests { None }, expires: if bool::arbitrary(g) { - Some(Instant::now() + Duration::from_secs(u64::arbitrary(g) % 60)) + Some(Instant::now() + Duration::from_secs(g.gen_range(0..60))) } else { None }, @@ -197,7 +197,7 @@ mod tests { key: Key::arbitrary(g), provider: PeerId::random(), expires: if bool::arbitrary(g) { - Some(Instant::now() + Duration::from_secs(u64::arbitrary(g) % 60)) + Some(Instant::now() + Duration::from_secs(g.gen_range(0..60))) } else { None }, diff --git a/swarm/Cargo.toml b/swarm/Cargo.toml index f7b841b4979..a20a0326c0c 100644 --- a/swarm/Cargo.toml +++ b/swarm/Cargo.toml @@ -31,4 +31,4 @@ libp2p = { path = "../", default-features = false, features = ["identify", "ping libp2p-mplex = { path = "../muxers/mplex" } libp2p-noise = { path = "../transports/noise" } libp2p-tcp = { path = "../transports/tcp" } -quickcheck = "1" +quickcheck = { package = "quickcheck-ext", path = "../misc/quickcheck-ext" } diff --git a/swarm/src/lib.rs b/swarm/src/lib.rs index edb1c63a30d..228f76bc681 100644 --- a/swarm/src/lib.rs +++ b/swarm/src/lib.rs @@ -1623,7 +1623,7 @@ mod tests { use libp2p_core::multiaddr::multiaddr; use libp2p_core::transport::TransportEvent; use libp2p_core::Endpoint; - use quickcheck::{quickcheck, Arbitrary, Gen, QuickCheck}; + use quickcheck::*; use rand::prelude::SliceRandom; // Test execution state. @@ -2048,7 +2048,7 @@ mod tests { impl Arbitrary for DialConcurrencyFactor { fn arbitrary(g: &mut Gen) -> Self { - Self(NonZeroU8::new(1 + u8::arbitrary(g) % 10).unwrap()) + Self(NonZeroU8::new(g.gen_range(1..11)).unwrap()) } } @@ -2174,7 +2174,7 @@ mod tests { impl Arbitrary for Limit { fn arbitrary(g: &mut Gen) -> Self { - Self(1 + u32::arbitrary(g) % 9) + Self(g.gen_range(1..10)) } } diff --git a/swarm/src/registry.rs b/swarm/src/registry.rs index 87087f94bdf..5efc2833201 100644 --- a/swarm/src/registry.rs +++ b/swarm/src/registry.rs @@ -342,7 +342,7 @@ mod tests { impl Arbitrary for AddressScore { fn arbitrary(g: &mut Gen) -> AddressScore { - if u8::arbitrary(g) % 10 == 0 { + if g.gen_range(0..10) == 0 { // ~10% "Infinitely" scored addresses AddressScore::Infinite } else { @@ -353,7 +353,7 @@ mod tests { impl Arbitrary for AddressRecord { fn arbitrary(g: &mut Gen) -> Self { - let addr = Protocol::Tcp(u16::arbitrary(g) % 256).into(); + let addr = Protocol::Tcp(g.gen_range(0..256)).into(); let score = AddressScore::arbitrary(g); AddressRecord::new(addr, score) } diff --git a/transports/noise/tests/smoke.rs b/transports/noise/tests/smoke.rs index d3806f1013c..59c871333f6 100644 --- a/transports/noise/tests/smoke.rs +++ b/transports/noise/tests/smoke.rs @@ -326,7 +326,7 @@ struct Message(Vec); impl Arbitrary for Message { fn arbitrary(g: &mut Gen) -> Self { - let s = 1 + usize::arbitrary(g) % (128 * 1024); + let s = g.gen_range(1..128 * 1024); let mut v = vec![0; s]; for b in &mut v { *b = u8::arbitrary(g); From b48c9a1b273ffe980eda610437cb8405140f7edc Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Tue, 6 Sep 2022 15:32:04 +0300 Subject: [PATCH 15/30] cargo fmt --- protocols/kad/src/query/peers/closest.rs | 4 +--- protocols/kad/src/query/peers/closest/disjoint.rs | 9 ++++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/protocols/kad/src/query/peers/closest.rs b/protocols/kad/src/query/peers/closest.rs index 42cd95f6373..a283b4f963f 100644 --- a/protocols/kad/src/query/peers/closest.rs +++ b/protocols/kad/src/query/peers/closest.rs @@ -503,9 +503,7 @@ mod tests { impl Arbitrary for ClosestPeersIter { fn arbitrary(g: &mut Gen) -> ClosestPeersIter { - let known_closest_peers = random_peers(g.gen_range(1..60)) - .into_iter() - .map(Key::from); + let known_closest_peers = random_peers(g.gen_range(1..60)).into_iter().map(Key::from); let target = Key::from(Into::::into(PeerId::random())); let config = ClosestPeersIterConfig { parallelism: NonZeroUsize::new(g.gen_range(1..10)).unwrap(), diff --git a/protocols/kad/src/query/peers/closest/disjoint.rs b/protocols/kad/src/query/peers/closest/disjoint.rs index 473db8134b0..260cbda64e8 100644 --- a/protocols/kad/src/query/peers/closest/disjoint.rs +++ b/protocols/kad/src/query/peers/closest/disjoint.rs @@ -745,11 +745,10 @@ mod tests { impl Arbitrary for Graph { fn arbitrary(g: &mut Gen) -> Self { - let mut peer_ids = - random_peers(g.gen_range(K_VALUE.get()..200)) - .into_iter() - .map(|peer_id| (peer_id.clone(), Key::from(peer_id))) - .collect::>(); + let mut peer_ids = random_peers(g.gen_range(K_VALUE.get()..200)) + .into_iter() + .map(|peer_id| (peer_id.clone(), Key::from(peer_id))) + .collect::>(); // Make each peer aware of its direct neighborhood. let mut peers = peer_ids From 821bb52d1280a3d8b2239949cb645a0a58ee3f51 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Tue, 6 Sep 2022 15:55:03 +0300 Subject: [PATCH 16/30] Fix multistream:encode_decode_message test --- misc/multistream-select/src/protocol.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/multistream-select/src/protocol.rs b/misc/multistream-select/src/protocol.rs index cd612f5b5ce..b762aa34343 100644 --- a/misc/multistream-select/src/protocol.rs +++ b/misc/multistream-select/src/protocol.rs @@ -471,7 +471,7 @@ mod tests { impl Arbitrary for Message { fn arbitrary(g: &mut Gen) -> Message { - match g.gen_range(0..5) { + match g.gen_range(0..5u8) { 0 => Message::Header(HeaderLine::V1), 1 => Message::NotAvailable, 2 => Message::ListProtocols, From 3e84211bd57a2af1d6ebe33c7fc55398e8af2e2f Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Tue, 6 Sep 2022 16:05:11 +0300 Subject: [PATCH 17/30] Add a license to quickcheck-ext --- misc/quickcheck-ext/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/misc/quickcheck-ext/Cargo.toml b/misc/quickcheck-ext/Cargo.toml index 9b5bc6510e2..305c15bd8ce 100644 --- a/misc/quickcheck-ext/Cargo.toml +++ b/misc/quickcheck-ext/Cargo.toml @@ -3,6 +3,7 @@ name = "quickcheck-ext" version = "0.1.0" edition = "2021" publish = false +license = "Unlicense/MIT" [dependencies] quickcheck = "1" From f695aaccbed4b77bd4e64caccfd861b034d02806 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Tue, 6 Sep 2022 16:35:02 +0300 Subject: [PATCH 18/30] More unsigned types for gen_range --- protocols/gossipsub/src/behaviour.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/protocols/gossipsub/src/behaviour.rs b/protocols/gossipsub/src/behaviour.rs index d1fc1e63b8c..103a2027228 100644 --- a/protocols/gossipsub/src/behaviour.rs +++ b/protocols/gossipsub/src/behaviour.rs @@ -3706,13 +3706,13 @@ mod local_test { fn arbitrary(g: &mut Gen) -> Self { let mut rpc = empty_rpc(); - for _ in 0..g.gen_range(0..10) { + for _ in 0..g.gen_range(0..10u8) { rpc.subscriptions.push(test_subscription()); } - for _ in 0..g.gen_range(0..10) { + for _ in 0..g.gen_range(0..10u8) { rpc.messages.push(test_message()); } - for _ in 0..g.gen_range(0..10) { + for _ in 0..g.gen_range(0..10u8) { rpc.control_msgs.push(test_control()); } rpc From f79b939d6fd0b88a6f79484a6f9b2bfd496fb80a Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Tue, 6 Sep 2022 17:16:20 +0300 Subject: [PATCH 19/30] Add T: Unsigned for gen_range --- misc/quickcheck-ext/Cargo.toml | 1 + misc/quickcheck-ext/src/lib.rs | 12 ++++-------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/misc/quickcheck-ext/Cargo.toml b/misc/quickcheck-ext/Cargo.toml index 305c15bd8ce..0c427dc4fc9 100644 --- a/misc/quickcheck-ext/Cargo.toml +++ b/misc/quickcheck-ext/Cargo.toml @@ -7,3 +7,4 @@ license = "Unlicense/MIT" [dependencies] quickcheck = "1" +num-traits = "0.2" diff --git a/misc/quickcheck-ext/src/lib.rs b/misc/quickcheck-ext/src/lib.rs index e679d352dc0..5dfa013c1b9 100644 --- a/misc/quickcheck-ext/src/lib.rs +++ b/misc/quickcheck-ext/src/lib.rs @@ -1,18 +1,14 @@ pub use quickcheck::*; -use core::ops::{Add, Range, Rem, Sub}; +use core::ops::Range; +use num_traits::sign::Unsigned; pub trait GenRange { - fn gen_range(&mut self, _range: Range) -> T - where - T: Arbitrary + Copy + Add + Rem + Sub; + fn gen_range(&mut self, _range: Range) -> T; } impl GenRange for Gen { - fn gen_range(&mut self, range: Range) -> T - where - T: Arbitrary + Copy + Add + Rem + Sub, - { + fn gen_range(&mut self, range: Range) -> T { ::arbitrary(self) % (range.end - range.start) + range.start } } From 7cb1c80bc43edfaca4e56c97616c3b053112f035 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Tue, 6 Sep 2022 17:16:47 +0300 Subject: [PATCH 20/30] More unsigned types for gen_range --- protocols/gossipsub/src/protocol.rs | 4 ++-- protocols/kad/src/query/peers/closest/disjoint.rs | 2 +- swarm/src/registry.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/protocols/gossipsub/src/protocol.rs b/protocols/gossipsub/src/protocol.rs index e83290efa0f..99f48a95157 100644 --- a/protocols/gossipsub/src/protocol.rs +++ b/protocols/gossipsub/src/protocol.rs @@ -587,7 +587,7 @@ mod tests { config, ) .unwrap(); - let data = (0..g.gen_range(10..10024)) + let data = (0..g.gen_range(10..10024u32)) .map(|_| u8::arbitrary(g)) .collect::>(); let topic_id = TopicId::arbitrary(g).0; @@ -600,7 +600,7 @@ mod tests { impl Arbitrary for TopicId { fn arbitrary(g: &mut Gen) -> Self { - let topic_string: String = (0..g.gen_range(20..1024)) + let topic_string: String = (0..g.gen_range(20..1024u32)) .map(|_| char::arbitrary(g)) .collect::() .into(); diff --git a/protocols/kad/src/query/peers/closest/disjoint.rs b/protocols/kad/src/query/peers/closest/disjoint.rs index 260cbda64e8..5dbe15103e3 100644 --- a/protocols/kad/src/query/peers/closest/disjoint.rs +++ b/protocols/kad/src/query/peers/closest/disjoint.rs @@ -617,7 +617,7 @@ mod tests { impl Arbitrary for PeerVec { fn arbitrary(g: &mut Gen) -> Self { PeerVec( - (0..g.gen_range(1..60)) + (0..g.gen_range(1..60u8)) .map(|_| PeerId::random()) .map(Key::from) .collect(), diff --git a/swarm/src/registry.rs b/swarm/src/registry.rs index 5efc2833201..f0a6153ec86 100644 --- a/swarm/src/registry.rs +++ b/swarm/src/registry.rs @@ -342,7 +342,7 @@ mod tests { impl Arbitrary for AddressScore { fn arbitrary(g: &mut Gen) -> AddressScore { - if g.gen_range(0..10) == 0 { + if g.gen_range(0..10u8) == 0 { // ~10% "Infinitely" scored addresses AddressScore::Infinite } else { From 25f87c5232a39a313aa343396c963015a9b8fc12 Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Thu, 8 Sep 2022 18:15:46 +1000 Subject: [PATCH 21/30] Fix build error --- protocols/gossipsub/src/protocol.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocols/gossipsub/src/protocol.rs b/protocols/gossipsub/src/protocol.rs index 4dfe3c68cde..3695bcb9f97 100644 --- a/protocols/gossipsub/src/protocol.rs +++ b/protocols/gossipsub/src/protocol.rs @@ -626,7 +626,7 @@ mod tests { } #[cfg(not(feature = "rsa"))] - fn arbitrary(_g: &mut G) -> Self { + fn arbitrary(_g: &mut Gen) -> Self { // Small enough to be inlined. TestKeypair(Keypair::generate_ed25519()) } From 49d2aa301e535f305d98acd3eb70d3f906b17116 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Mon, 12 Sep 2022 16:27:01 +0300 Subject: [PATCH 22/30] Bump versions and add changelog entries --- CHANGELOG.md | 7 +++++++ Cargo.toml | 12 ++++++------ muxers/mplex/CHANGELOG.md | 6 ++++++ muxers/mplex/Cargo.toml | 2 +- protocols/kad/CHANGELOG.md | 6 ++++++ protocols/kad/Cargo.toml | 2 +- protocols/ping/CHANGELOG.md | 6 ++++++ protocols/ping/Cargo.toml | 2 +- protocols/request-response/CHANGELOG.md | 6 ++++++ protocols/request-response/Cargo.toml | 2 +- swarm/CHANGELOG.md | 6 ++++++ swarm/Cargo.toml | 2 +- transports/pnet/CHANGELOG.md | 6 ++++++ transports/pnet/Cargo.toml | 2 +- 14 files changed, 55 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d28138e1e7e..3d30a390b2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,13 @@ # 0.49.0 - [unreleased] - Update to [`libp2p-tcp` `v0.37.0`](transports/tcp/CHANGELOG.md#0370). +- Update individual crates. + - Update to [`libp2p-kad` `v0.40.1`](protocols/kad/CHANGELOG.md#???). + - Update to [`libp2p-ping` `v0.39.1`](protocols/ping/CHANGELOG.md#???). + - Update to [`libp2p-request-response` `v0.21.1`](protocols/request-response/CHANGELOG.md#???). + - Update to [`libp2p-pnet` `v0.22.1`](transports/pnet/CHANGELOG.md#???). + - Update to [`libp2p-mplex` `v0.36.1`](muxers/mplex/CHANGELOG.md#???). + - Update to [`libp2p-swarm` `v0.39.1`](swarm/CHANGELOG.md#???). # 0.48.0 diff --git a/Cargo.toml b/Cargo.toml index 0b7ca3b9a7b..7f39a3c6d84 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -85,17 +85,17 @@ libp2p-core = { version = "0.36.0", path = "core", default-features = false } libp2p-dcutr = { version = "0.6.0", path = "protocols/dcutr", optional = true } libp2p-floodsub = { version = "0.39.0", path = "protocols/floodsub", optional = true } libp2p-identify = { version = "0.39.0", path = "protocols/identify", optional = true } -libp2p-kad = { version = "0.40.0", path = "protocols/kad", optional = true } +libp2p-kad = { version = "0.40.1", path = "protocols/kad", optional = true } libp2p-metrics = { version = "0.9.0", path = "misc/metrics", optional = true } -libp2p-mplex = { version = "0.36.0", path = "muxers/mplex", optional = true } +libp2p-mplex = { version = "0.36.1", path = "muxers/mplex", optional = true } libp2p-noise = { version = "0.39.0", path = "transports/noise", optional = true } -libp2p-ping = { version = "0.39.0", path = "protocols/ping", optional = true } +libp2p-ping = { version = "0.39.1", path = "protocols/ping", optional = true } libp2p-plaintext = { version = "0.36.0", path = "transports/plaintext", optional = true } -libp2p-pnet = { version = "0.22.0", path = "transports/pnet", optional = true } +libp2p-pnet = { version = "0.22.1", path = "transports/pnet", optional = true } libp2p-relay = { version = "0.12.0", path = "protocols/relay", optional = true } libp2p-rendezvous = { version = "0.9.0", path = "protocols/rendezvous", optional = true } -libp2p-request-response = { version = "0.21.0", path = "protocols/request-response", optional = true } -libp2p-swarm = { version = "0.39.0", path = "swarm" } +libp2p-request-response = { version = "0.21.1", path = "protocols/request-response", optional = true } +libp2p-swarm = { version = "0.39.1", path = "swarm" } libp2p-swarm-derive = { version = "0.30.0", path = "swarm-derive" } libp2p-uds = { version = "0.35.0", path = "transports/uds", optional = true } libp2p-wasm-ext = { version = "0.36.0", path = "transports/wasm-ext", default-features = false, optional = true } diff --git a/muxers/mplex/CHANGELOG.md b/muxers/mplex/CHANGELOG.md index 925013d1e29..cdaea6b8fdd 100644 --- a/muxers/mplex/CHANGELOG.md +++ b/muxers/mplex/CHANGELOG.md @@ -1,3 +1,9 @@ +# 0.36.1 + +- Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. + +[PR 2857]: https://github.com/libp2p/rust-libp2p/pull/2857 + # 0.36.0 - Update to `libp2p-core` `v0.36.0` diff --git a/muxers/mplex/Cargo.toml b/muxers/mplex/Cargo.toml index 654c20a6c50..c172cca2378 100644 --- a/muxers/mplex/Cargo.toml +++ b/muxers/mplex/Cargo.toml @@ -3,7 +3,7 @@ name = "libp2p-mplex" edition = "2021" rust-version = "1.56.1" description = "Mplex multiplexing protocol for libp2p" -version = "0.36.0" +version = "0.36.1" authors = ["Parity Technologies "] license = "MIT" repository = "https://github.com/libp2p/rust-libp2p" diff --git a/protocols/kad/CHANGELOG.md b/protocols/kad/CHANGELOG.md index d161d93de83..8d8e6758bdc 100644 --- a/protocols/kad/CHANGELOG.md +++ b/protocols/kad/CHANGELOG.md @@ -1,3 +1,9 @@ +# 0.40.1 + +- Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. + +[PR 2857]: https://github.com/libp2p/rust-libp2p/pull/2857 + # 0.40.0 - Add support for multiple protocol names. Update `Kademlia`, `KademliaConfig`, diff --git a/protocols/kad/Cargo.toml b/protocols/kad/Cargo.toml index eeefda48673..cc5d9ec6674 100644 --- a/protocols/kad/Cargo.toml +++ b/protocols/kad/Cargo.toml @@ -3,7 +3,7 @@ name = "libp2p-kad" edition = "2021" rust-version = "1.56.1" description = "Kademlia protocol for libp2p" -version = "0.40.0" +version = "0.40.1" authors = ["Parity Technologies "] license = "MIT" repository = "https://github.com/libp2p/rust-libp2p" diff --git a/protocols/ping/CHANGELOG.md b/protocols/ping/CHANGELOG.md index b1037ac1ef7..1642876395f 100644 --- a/protocols/ping/CHANGELOG.md +++ b/protocols/ping/CHANGELOG.md @@ -1,3 +1,9 @@ +# 0.39.1 + +- Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. + +[PR 2857]: https://github.com/libp2p/rust-libp2p/pull/2857 + # 0.39.0 - Update to `libp2p-swarm` `v0.39.0`. diff --git a/protocols/ping/Cargo.toml b/protocols/ping/Cargo.toml index 6186c9622a2..a4f7a9b221f 100644 --- a/protocols/ping/Cargo.toml +++ b/protocols/ping/Cargo.toml @@ -3,7 +3,7 @@ name = "libp2p-ping" edition = "2021" rust-version = "1.56.1" description = "Ping protocol for libp2p" -version = "0.39.0" +version = "0.39.1" authors = ["Parity Technologies "] license = "MIT" repository = "https://github.com/libp2p/rust-libp2p" diff --git a/protocols/request-response/CHANGELOG.md b/protocols/request-response/CHANGELOG.md index 2e7dd0f84d4..2a01d0a343a 100644 --- a/protocols/request-response/CHANGELOG.md +++ b/protocols/request-response/CHANGELOG.md @@ -1,3 +1,9 @@ +# 0.21.1 + +- Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. + +[PR 2857]: https://github.com/libp2p/rust-libp2p/pull/2857 + # 0.21.0 - Update to `libp2p-swarm` `v0.39.0`. diff --git a/protocols/request-response/Cargo.toml b/protocols/request-response/Cargo.toml index 4ebaffc4cb5..3fa8457486e 100644 --- a/protocols/request-response/Cargo.toml +++ b/protocols/request-response/Cargo.toml @@ -3,7 +3,7 @@ name = "libp2p-request-response" edition = "2021" rust-version = "1.56.1" description = "Generic Request/Response Protocols" -version = "0.21.0" +version = "0.21.1" authors = ["Parity Technologies "] license = "MIT" repository = "https://github.com/libp2p/rust-libp2p" diff --git a/swarm/CHANGELOG.md b/swarm/CHANGELOG.md index abf54657cda..c17387d9f37 100644 --- a/swarm/CHANGELOG.md +++ b/swarm/CHANGELOG.md @@ -1,3 +1,9 @@ +# 0.39.1 + +- Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. + +[PR 2857]: https://github.com/libp2p/rust-libp2p/pull/2857 + # 0.39.0 - Remove deprecated `NetworkBehaviourEventProcess`. See [libp2p-swarm v0.38.0 changelog entry] for diff --git a/swarm/Cargo.toml b/swarm/Cargo.toml index 16b45e149a5..a737ce559f3 100644 --- a/swarm/Cargo.toml +++ b/swarm/Cargo.toml @@ -3,7 +3,7 @@ name = "libp2p-swarm" edition = "2021" rust-version = "1.56.1" description = "The libp2p swarm" -version = "0.39.0" +version = "0.39.1" authors = ["Parity Technologies "] license = "MIT" repository = "https://github.com/libp2p/rust-libp2p" diff --git a/transports/pnet/CHANGELOG.md b/transports/pnet/CHANGELOG.md index 4b764219f4f..0e291fc3038 100644 --- a/transports/pnet/CHANGELOG.md +++ b/transports/pnet/CHANGELOG.md @@ -1,3 +1,9 @@ +# 0.22.1 [Unreleased] + +- Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. + +[PR 2857]: https://github.com/libp2p/rust-libp2p/pull/2857 + # 0.22.0 [2021-11-01] - Update dependencies. diff --git a/transports/pnet/Cargo.toml b/transports/pnet/Cargo.toml index 5d1c4cd07e9..ca977c31a1a 100644 --- a/transports/pnet/Cargo.toml +++ b/transports/pnet/Cargo.toml @@ -3,7 +3,7 @@ name = "libp2p-pnet" edition = "2021" rust-version = "1.56.1" description = "Private swarm support for libp2p" -version = "0.22.0" +version = "0.22.1" authors = ["Parity Technologies "] license = "MIT" repository = "https://github.com/libp2p/rust-libp2p" From 1b08ba570c0a8e497123c6522e4e2441fe247a0d Mon Sep 17 00:00:00 2001 From: Roman Date: Thu, 15 Sep 2022 21:31:22 +0300 Subject: [PATCH 23/30] Apply suggestions from code review: CHANGELOG [unreleased] Co-authored-by: Max Inden --- muxers/mplex/CHANGELOG.md | 2 +- protocols/kad/CHANGELOG.md | 2 +- protocols/ping/CHANGELOG.md | 2 +- protocols/request-response/CHANGELOG.md | 2 +- swarm/CHANGELOG.md | 2 +- transports/pnet/CHANGELOG.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/muxers/mplex/CHANGELOG.md b/muxers/mplex/CHANGELOG.md index cdaea6b8fdd..b02b9d05342 100644 --- a/muxers/mplex/CHANGELOG.md +++ b/muxers/mplex/CHANGELOG.md @@ -1,4 +1,4 @@ -# 0.36.1 +# 0.36.1 [unreleased] - Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. diff --git a/protocols/kad/CHANGELOG.md b/protocols/kad/CHANGELOG.md index 8d8e6758bdc..fbf8b332199 100644 --- a/protocols/kad/CHANGELOG.md +++ b/protocols/kad/CHANGELOG.md @@ -1,4 +1,4 @@ -# 0.40.1 +# 0.40.1 [unreleased] - Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. diff --git a/protocols/ping/CHANGELOG.md b/protocols/ping/CHANGELOG.md index 1642876395f..f7932c38b4f 100644 --- a/protocols/ping/CHANGELOG.md +++ b/protocols/ping/CHANGELOG.md @@ -1,4 +1,4 @@ -# 0.39.1 +# 0.39.1 [unreleased] - Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. diff --git a/protocols/request-response/CHANGELOG.md b/protocols/request-response/CHANGELOG.md index 2a01d0a343a..aabb121ad69 100644 --- a/protocols/request-response/CHANGELOG.md +++ b/protocols/request-response/CHANGELOG.md @@ -1,4 +1,4 @@ -# 0.21.1 +# 0.21.1 [unreleased] - Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. diff --git a/swarm/CHANGELOG.md b/swarm/CHANGELOG.md index c17387d9f37..5ad1d010d16 100644 --- a/swarm/CHANGELOG.md +++ b/swarm/CHANGELOG.md @@ -1,4 +1,4 @@ -# 0.39.1 +# 0.39.1 [unreleased] - Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. diff --git a/transports/pnet/CHANGELOG.md b/transports/pnet/CHANGELOG.md index 0e291fc3038..68dc9180df7 100644 --- a/transports/pnet/CHANGELOG.md +++ b/transports/pnet/CHANGELOG.md @@ -1,4 +1,4 @@ -# 0.22.1 [Unreleased] +# 0.22.1 [unreleased] - Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. From 17182b9f52546d3283e75e70e83230062bd4807b Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Thu, 15 Sep 2022 21:38:35 +0300 Subject: [PATCH 24/30] Bump versions and add changelog entries --- CHANGELOG.md | 2 ++ Cargo.toml | 4 ++-- protocols/floodsub/CHANGELOG.md | 6 ++++++ protocols/floodsub/Cargo.toml | 2 +- protocols/gossipsub/CHANGELOG.md | 6 ++++++ protocols/gossipsub/Cargo.toml | 2 +- 6 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d30a390b2b..68a7ee8c4c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,8 @@ - Update individual crates. - Update to [`libp2p-kad` `v0.40.1`](protocols/kad/CHANGELOG.md#???). - Update to [`libp2p-ping` `v0.39.1`](protocols/ping/CHANGELOG.md#???). + - Update to [`libp2p-floodsub` `v0.39.1`](protocols/floodsub/CHANGELOG.md#???). + - Update to [`libp2p-gossipsub` `v0.41.1`](protocols/gossipsub/CHANGELOG.md#???). - Update to [`libp2p-request-response` `v0.21.1`](protocols/request-response/CHANGELOG.md#???). - Update to [`libp2p-pnet` `v0.22.1`](transports/pnet/CHANGELOG.md#???). - Update to [`libp2p-mplex` `v0.36.1`](muxers/mplex/CHANGELOG.md#???). diff --git a/Cargo.toml b/Cargo.toml index 7f39a3c6d84..1c19d71a63e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -83,7 +83,7 @@ lazy_static = "1.2" libp2p-autonat = { version = "0.7.0", path = "protocols/autonat", optional = true } libp2p-core = { version = "0.36.0", path = "core", default-features = false } libp2p-dcutr = { version = "0.6.0", path = "protocols/dcutr", optional = true } -libp2p-floodsub = { version = "0.39.0", path = "protocols/floodsub", optional = true } +libp2p-floodsub = { version = "0.39.1", path = "protocols/floodsub", optional = true } libp2p-identify = { version = "0.39.0", path = "protocols/identify", optional = true } libp2p-kad = { version = "0.40.1", path = "protocols/kad", optional = true } libp2p-metrics = { version = "0.9.0", path = "misc/metrics", optional = true } @@ -113,7 +113,7 @@ libp2p-tcp = { version = "0.37.0", path = "transports/tcp", default-features = f libp2p-websocket = { version = "0.38.0", path = "transports/websocket", optional = true } [target.'cfg(not(target_os = "unknown"))'.dependencies] -libp2p-gossipsub = { version = "0.41.0", path = "protocols/gossipsub", optional = true } +libp2p-gossipsub = { version = "0.41.1", path = "protocols/gossipsub", optional = true } [dev-dependencies] async-std = { version = "1.6.2", features = ["attributes"] } diff --git a/protocols/floodsub/CHANGELOG.md b/protocols/floodsub/CHANGELOG.md index 5a91e14642a..0770b97bed8 100644 --- a/protocols/floodsub/CHANGELOG.md +++ b/protocols/floodsub/CHANGELOG.md @@ -1,3 +1,9 @@ +# 0.39.1 [unreleased] + +- Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. + +[PR 2857]: https://github.com/libp2p/rust-libp2p/pull/2857 + # 0.39.0 - Update to `libp2p-swarm` `v0.39.0`. diff --git a/protocols/floodsub/Cargo.toml b/protocols/floodsub/Cargo.toml index 7d3b67dfc5d..e89bbd3fdb7 100644 --- a/protocols/floodsub/Cargo.toml +++ b/protocols/floodsub/Cargo.toml @@ -3,7 +3,7 @@ name = "libp2p-floodsub" edition = "2021" rust-version = "1.56.1" description = "Floodsub protocol for libp2p" -version = "0.39.0" +version = "0.39.1" authors = ["Parity Technologies "] license = "MIT" repository = "https://github.com/libp2p/rust-libp2p" diff --git a/protocols/gossipsub/CHANGELOG.md b/protocols/gossipsub/CHANGELOG.md index 1ba36ad6607..4699fe664a5 100644 --- a/protocols/gossipsub/CHANGELOG.md +++ b/protocols/gossipsub/CHANGELOG.md @@ -1,3 +1,9 @@ +# 0.41.1 [unreleased] + +- Bump rand to 0.8 and quickcheck to 1. See [PR 2857]. + +[PR 2857]: https://github.com/libp2p/rust-libp2p/pull/2857 + # 0.41.0 - Update to `libp2p-swarm` `v0.39.0`. diff --git a/protocols/gossipsub/Cargo.toml b/protocols/gossipsub/Cargo.toml index 808c892a957..66ce9509498 100644 --- a/protocols/gossipsub/Cargo.toml +++ b/protocols/gossipsub/Cargo.toml @@ -3,7 +3,7 @@ name = "libp2p-gossipsub" edition = "2021" rust-version = "1.56.1" description = "Gossipsub protocol for libp2p" -version = "0.41.0" +version = "0.41.1" authors = ["Age Manning "] license = "MIT" repository = "https://github.com/libp2p/rust-libp2p" From c4d6e6e04a032af6003b94f7f33013bda144c7a4 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Thu, 15 Sep 2022 22:13:45 +0300 Subject: [PATCH 25/30] Make kad:closest tests deterministic --- protocols/kad/src/query/peers/closest.rs | 32 ++++++++++++++++++------ 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/protocols/kad/src/query/peers/closest.rs b/protocols/kad/src/query/peers/closest.rs index a283b4f963f..87d452e8e40 100644 --- a/protocols/kad/src/query/peers/closest.rs +++ b/protocols/kad/src/query/peers/closest.rs @@ -483,8 +483,7 @@ mod tests { use rand::{rngs::StdRng, Rng, SeedableRng}; use std::{iter, time::Duration}; - fn random_peers(n: usize) -> Vec { - let mut g = rand::thread_rng(); + fn random_peers(n: usize, g: &mut R) -> Vec { (0..n) .map(|_| { PeerId::from_multihash( @@ -501,10 +500,25 @@ mod tests { .all(|w| w[0].distance(&target) < w[1].distance(&target)) } + #[derive(Clone, Debug)] + struct ArbitraryPeerId(PeerId); + + impl Arbitrary for ArbitraryPeerId { + fn arbitrary(g: &mut Gen) -> ArbitraryPeerId { + let hash: [u8; 32] = core::array::from_fn(|_| u8::arbitrary(g)); + let peer_id = + PeerId::from_multihash(Multihash::wrap(Code::Sha2_256.into(), &hash).unwrap()) + .unwrap(); + ArbitraryPeerId(peer_id) + } + } + impl Arbitrary for ClosestPeersIter { fn arbitrary(g: &mut Gen) -> ClosestPeersIter { - let known_closest_peers = random_peers(g.gen_range(1..60)).into_iter().map(Key::from); - let target = Key::from(Into::::into(PeerId::random())); + let known_closest_peers = (0..g.gen_range(1..60u8)) + .map(|_| Key::from(ArbitraryPeerId::arbitrary(g).0)) + .collect::>(); + let target = Key::from(ArbitraryPeerId::arbitrary(g).0); let config = ClosestPeersIterConfig { parallelism: NonZeroUsize::new(g.gen_range(1..10)).unwrap(), num_results: NonZeroUsize::new(g.gen_range(1..25)).unwrap(), @@ -613,7 +627,7 @@ mod tests { for (i, k) in expected.iter().enumerate() { if rng.gen_bool(0.75) { let num_closer = rng.gen_range(0..iter.config.num_results.get() + 1); - let closer_peers = random_peers(num_closer); + let closer_peers = random_peers(num_closer, &mut rng); remaining.extend(closer_peers.iter().cloned().map(Key::from)); iter.on_success(k.preimage(), closer_peers); } else { @@ -668,10 +682,10 @@ mod tests { #[test] fn no_duplicates() { - fn prop(mut iter: ClosestPeersIter) -> bool { + fn prop(mut iter: ClosestPeersIter, closer: ArbitraryPeerId) -> bool { let now = Instant::now(); - let closer = random_peers(1); + let closer = vec![closer.0]; // A first peer reports a "closer" peer. let peer1 = match iter.next(now) { @@ -703,7 +717,9 @@ mod tests { true } - QuickCheck::new().tests(10).quickcheck(prop as fn(_) -> _) + QuickCheck::new() + .tests(10) + .quickcheck(prop as fn(_, _) -> _) } #[test] From e0d783eb52b430089cffd27420daeafc0d419542 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Thu, 15 Sep 2022 22:33:43 +0300 Subject: [PATCH 26/30] Make kad:closest:disjoint:random_peers deterministic --- .../kad/src/query/peers/closest/disjoint.rs | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/protocols/kad/src/query/peers/closest/disjoint.rs b/protocols/kad/src/query/peers/closest/disjoint.rs index 5dbe15103e3..b4b26dc95b5 100644 --- a/protocols/kad/src/query/peers/closest/disjoint.rs +++ b/protocols/kad/src/query/peers/closest/disjoint.rs @@ -447,7 +447,7 @@ mod tests { use crate::K_VALUE; use libp2p_core::multihash::{Code, Multihash}; use quickcheck::*; - use rand::{seq::SliceRandom, Rng}; + use rand::seq::SliceRandom; use std::collections::HashSet; use std::iter; @@ -455,7 +455,7 @@ mod tests { fn arbitrary(g: &mut Gen) -> Self { let target = Target::arbitrary(g).0; let num_closest_iters = g.gen_range(0..20 + 1); - let peers = random_peers(g.gen_range(0..20 * num_closest_iters + 1)); + let peers = random_peers(g.gen_range(0..20 * num_closest_iters + 1), g); let iters: Vec<_> = (0..num_closest_iters) .map(|_| { @@ -532,25 +532,31 @@ mod tests { } } + #[derive(Clone, Debug)] + struct ArbitraryPeerId(PeerId); + + impl Arbitrary for ArbitraryPeerId { + fn arbitrary(g: &mut Gen) -> ArbitraryPeerId { + let hash: [u8; 32] = core::array::from_fn(|_| u8::arbitrary(g)); + let peer_id = + PeerId::from_multihash(Multihash::wrap(Code::Sha2_256.into(), &hash).unwrap()) + .unwrap(); + ArbitraryPeerId(peer_id) + } + } + #[derive(Clone, Debug)] struct Target(KeyBytes); impl Arbitrary for Target { - fn arbitrary(_g: &mut Gen) -> Self { - Target(Key::from(random_peers(1).pop().unwrap()).into()) + fn arbitrary(g: &mut Gen) -> Self { + let peer_id = ArbitraryPeerId::arbitrary(g).0; + Target(Key::from(peer_id).into()) } } - fn random_peers(n: usize) -> Vec { - let mut g = rand::thread_rng(); - (0..n) - .map(|_| { - PeerId::from_multihash( - Multihash::wrap(Code::Sha2_256.into(), &g.gen::<[u8; 32]>()).unwrap(), - ) - .unwrap() - }) - .collect() + fn random_peers(n: usize, g: &mut Gen) -> Vec { + (0..n).map(|_| ArbitraryPeerId::arbitrary(g).0).collect() } #[test] @@ -745,7 +751,7 @@ mod tests { impl Arbitrary for Graph { fn arbitrary(g: &mut Gen) -> Self { - let mut peer_ids = random_peers(g.gen_range(K_VALUE.get()..200)) + let mut peer_ids = random_peers(g.gen_range(K_VALUE.get()..200), g) .into_iter() .map(|peer_id| (peer_id.clone(), Key::from(peer_id))) .collect::>(); From bc77431620f952dd8a9e0054bba73bb1c9638bb7 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Thu, 15 Sep 2022 23:05:35 +0300 Subject: [PATCH 27/30] Make kad:closest:disjoint tests deterministic --- misc/quickcheck-ext/src/lib.rs | 26 +++++++++++++++++++ .../kad/src/query/peers/closest/disjoint.rs | 13 +++++----- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/misc/quickcheck-ext/src/lib.rs b/misc/quickcheck-ext/src/lib.rs index 5dfa013c1b9..1303efce372 100644 --- a/misc/quickcheck-ext/src/lib.rs +++ b/misc/quickcheck-ext/src/lib.rs @@ -5,6 +5,14 @@ use num_traits::sign::Unsigned; pub trait GenRange { fn gen_range(&mut self, _range: Range) -> T; + + fn gen_index(&mut self, ubound: usize) -> usize { + if ubound <= (core::u32::MAX as usize) { + self.gen_range(0..ubound as u32) as usize + } else { + self.gen_range(0..ubound) + } + } } impl GenRange for Gen { @@ -12,3 +20,21 @@ impl GenRange for Gen { ::arbitrary(self) % (range.end - range.start) + range.start } } + +pub trait SliceRandom { + fn shuffle(&mut self, arr: &mut [T]); + fn choose_multiple<'a, T>(&mut self, arr: &'a [T], amount: usize) -> Vec<&'a T> { + let mut v: Vec<&T> = arr.iter().collect(); + self.shuffle(&mut v); + v.into_iter().take(amount).collect() + } +} + +impl SliceRandom for Gen { + fn shuffle(&mut self, arr: &mut [T]) { + for i in (1..arr.len()).rev() { + // invariant: elements with index > i have been locked in place. + arr.swap(i, self.gen_index(i + 1)); + } + } +} diff --git a/protocols/kad/src/query/peers/closest/disjoint.rs b/protocols/kad/src/query/peers/closest/disjoint.rs index b4b26dc95b5..96d313abe5a 100644 --- a/protocols/kad/src/query/peers/closest/disjoint.rs +++ b/protocols/kad/src/query/peers/closest/disjoint.rs @@ -447,7 +447,6 @@ mod tests { use crate::K_VALUE; use libp2p_core::multihash::{Code, Multihash}; use quickcheck::*; - use rand::seq::SliceRandom; use std::collections::HashSet; use std::iter; @@ -460,8 +459,9 @@ mod tests { let iters: Vec<_> = (0..num_closest_iters) .map(|_| { let num_peers = g.gen_range(0..20 + 1); - let mut peers = peers - .choose_multiple(&mut rand::thread_rng(), num_peers) + let mut peers = g + .choose_multiple(&peers, num_peers) + .into_iter() .cloned() .map(Key::from) .collect::>(); @@ -780,11 +780,12 @@ mod tests { // Make each peer aware of a random set of other peers within the graph. for (peer_id, peer) in peers.iter_mut() { - peer_ids.shuffle(&mut rand::thread_rng()); + g.shuffle(&mut peer_ids); let num_peers = g.gen_range(K_VALUE.get()..peer_ids.len() + 1); - let mut random_peer_ids = peer_ids - .choose_multiple(&mut rand::thread_rng(), num_peers) + let mut random_peer_ids = g + .choose_multiple(&peer_ids, num_peers) + .into_iter() // Make sure not to include itself. .filter(|(id, _)| peer_id != id) .cloned() From aa5427e846e5ac773ecb80def9318f72db82790a Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Fri, 16 Sep 2022 16:22:43 +0300 Subject: [PATCH 28/30] ::choose_multiple returns an iter instead of vec --- misc/quickcheck-ext/src/lib.rs | 8 ++++++-- protocols/kad/src/query/peers/closest/disjoint.rs | 2 -- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/misc/quickcheck-ext/src/lib.rs b/misc/quickcheck-ext/src/lib.rs index 1303efce372..392c9f0f8aa 100644 --- a/misc/quickcheck-ext/src/lib.rs +++ b/misc/quickcheck-ext/src/lib.rs @@ -23,10 +23,14 @@ impl GenRange for Gen { pub trait SliceRandom { fn shuffle(&mut self, arr: &mut [T]); - fn choose_multiple<'a, T>(&mut self, arr: &'a [T], amount: usize) -> Vec<&'a T> { + fn choose_multiple<'a, T>( + &mut self, + arr: &'a [T], + amount: usize, + ) -> std::iter::Take> { let mut v: Vec<&T> = arr.iter().collect(); self.shuffle(&mut v); - v.into_iter().take(amount).collect() + v.into_iter().take(amount) } } diff --git a/protocols/kad/src/query/peers/closest/disjoint.rs b/protocols/kad/src/query/peers/closest/disjoint.rs index 96d313abe5a..2de3503fcd5 100644 --- a/protocols/kad/src/query/peers/closest/disjoint.rs +++ b/protocols/kad/src/query/peers/closest/disjoint.rs @@ -461,7 +461,6 @@ mod tests { let num_peers = g.gen_range(0..20 + 1); let mut peers = g .choose_multiple(&peers, num_peers) - .into_iter() .cloned() .map(Key::from) .collect::>(); @@ -785,7 +784,6 @@ mod tests { let num_peers = g.gen_range(K_VALUE.get()..peer_ids.len() + 1); let mut random_peer_ids = g .choose_multiple(&peer_ids, num_peers) - .into_iter() // Make sure not to include itself. .filter(|(id, _)| peer_id != id) .cloned() From 5bd92fca306bad8abf2fb6838ab7832d269f7934 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Fri, 16 Sep 2022 16:23:31 +0300 Subject: [PATCH 29/30] Make kad:disjoint:PeerVec::arbitrary deterministic --- protocols/kad/src/query/peers/closest/disjoint.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocols/kad/src/query/peers/closest/disjoint.rs b/protocols/kad/src/query/peers/closest/disjoint.rs index 2de3503fcd5..df7ab70bedc 100644 --- a/protocols/kad/src/query/peers/closest/disjoint.rs +++ b/protocols/kad/src/query/peers/closest/disjoint.rs @@ -623,7 +623,7 @@ mod tests { fn arbitrary(g: &mut Gen) -> Self { PeerVec( (0..g.gen_range(1..60u8)) - .map(|_| PeerId::random()) + .map(|_| ArbitraryPeerId::arbitrary(g).0) .map(Key::from) .collect(), ) From 44e80e2aac3fe9323595b27b3421816947906934 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Wed, 21 Sep 2022 20:52:43 +0300 Subject: [PATCH 30/30] Fix kad:rand_distance test --- protocols/kad/src/kbucket.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/protocols/kad/src/kbucket.rs b/protocols/kad/src/kbucket.rs index aa0df1f3c63..82b88b2936e 100644 --- a/protocols/kad/src/kbucket.rs +++ b/protocols/kad/src/kbucket.rs @@ -606,13 +606,12 @@ mod tests { #[test] fn rand_distance() { fn prop(ix: u8) -> bool { - let ix = ix.min(254); // avoid overflow in 2^ix let d = BucketIndex(ix as usize).rand_distance(&mut rand::thread_rng()); let n = U256::from(<[u8; 32]>::from(d.0)); let b = U256::from(2); let e = U256::from(ix); let lower = b.pow(e); - let upper = b.pow(e + U256::from(1)) - U256::from(1); + let upper = b.checked_pow(e + U256::from(1)).unwrap_or(U256::MAX) - U256::from(1); lower <= n && n <= upper } quickcheck(prop as fn(_) -> _);