97aa8b75b8
* Create libp2p instance * Change logger to stdlog * test_connection initial commit * Add gossipsub test * Delete tests in network crate * Add test module * Clean tests * Remove dependency on discovery * Working publish between 2 nodes TODO: Publish should be called just once * Working 2 peer gossipsub test with additional events * Cleanup test * Add rpc test * Star topology discovery WIP * build_nodes builds and connects n nodes. Increase nodes in gossipsub test * Add unsubscribe method and expose reference to gossipsub object for gossipsub tests * Add gossipsub message forwarding test * Fix gossipsub forward test * Test improvements * Remove discovery tests * Simplify gossipsub forward test topology * Add helper functions for topology building * Clean up tests * Update naming to new network spec * Correct ssz encoding of protocol names * Further additions to network upgrade * Initial network spec update WIP * Temp commit * Builds one side of the streamed RPC responses * Temporary commit * Propagates streaming changes up into message handler * Intermediate network update * Partial update in upgrading to the new network spec * Update dependencies, remove redundant deps * Correct sync manager for block stream handling * Re-write of RPC handler, improves efficiency and corrects bugs * Stream termination update * Completed refactor of rpc handler * Remove crates * Correct compile issues associated with test merge * Build basic tests and testing structure for eth2-libp2p * Enhance RPC tests and add logging * Complete RPC testing framework and STATUS test * Decoding bug fixes, log improvements, stream test * Clean up RPC handler logging * Decoder bug fix, empty block stream test * Add BlocksByRoot RPC test * Add Goodbye RPC test * Syncing and stream handling bug fixes and performance improvements * Applies discv5 bug fixes * Adds DHT IP filtering for lighthouse - currently disabled * Adds randomized network propagation as a CLI arg * Add disconnect functionality * Adds attestation handling and parent lookup * Adds RPC error handling for the sync manager * Allow parent's blocks to be already processed * Update github workflow * Adds reviewer suggestions
139 lines
5.8 KiB
Rust
139 lines
5.8 KiB
Rust
#![cfg(test)]
|
|
use eth2_libp2p::*;
|
|
use futures::prelude::*;
|
|
use slog::{debug, Level};
|
|
|
|
mod common;
|
|
|
|
/* Gossipsub tests */
|
|
// Note: The aim of these tests is not to test the robustness of the gossip network
|
|
// but to check if the gossipsub implementation is behaving according to the specifications.
|
|
|
|
// Test if gossipsub message are forwarded by nodes with a simple linear topology.
|
|
//
|
|
// Topology used in test
|
|
//
|
|
// node1 <-> node2 <-> node3 ..... <-> node(n-1) <-> node(n)
|
|
|
|
#[test]
|
|
fn test_gossipsub_forward() {
|
|
// set up the logging. The level and enabled or not
|
|
let log = common::build_log(Level::Info, false);
|
|
|
|
let num_nodes = 20;
|
|
let mut nodes = common::build_linear(log.clone(), num_nodes, Some(19000));
|
|
let mut received_count = 0;
|
|
let pubsub_message = PubsubMessage::Block(vec![0; 4]);
|
|
let publishing_topic: String = "/eth2/beacon_block/ssz".into();
|
|
let mut subscribed_count = 0;
|
|
tokio::run(futures::future::poll_fn(move || -> Result<_, ()> {
|
|
for node in nodes.iter_mut() {
|
|
loop {
|
|
match node.poll().unwrap() {
|
|
Async::Ready(Some(Libp2pEvent::PubsubMessage {
|
|
topics,
|
|
message,
|
|
source,
|
|
id,
|
|
})) => {
|
|
assert_eq!(topics.len(), 1);
|
|
// Assert topic is the published topic
|
|
assert_eq!(
|
|
topics.first().unwrap(),
|
|
&TopicHash::from_raw(publishing_topic.clone())
|
|
);
|
|
// Assert message received is the correct one
|
|
assert_eq!(message, pubsub_message.clone());
|
|
received_count += 1;
|
|
// Since `propagate_message` is false, need to propagate manually
|
|
node.swarm.propagate_message(&source, id);
|
|
// Test should succeed if all nodes except the publisher receive the message
|
|
if received_count == num_nodes - 1 {
|
|
debug!(log.clone(), "Received message at {} nodes", num_nodes - 1);
|
|
return Ok(Async::Ready(()));
|
|
}
|
|
}
|
|
Async::Ready(Some(Libp2pEvent::PeerSubscribed(_, topic))) => {
|
|
// Received topics is one of subscribed eth2 topics
|
|
assert!(topic.clone().into_string().starts_with("/eth2/"));
|
|
// Publish on beacon block topic
|
|
if topic == TopicHash::from_raw("/eth2/beacon_block/ssz") {
|
|
subscribed_count += 1;
|
|
// Every node except the corner nodes are connected to 2 nodes.
|
|
if subscribed_count == (num_nodes * 2) - 2 {
|
|
node.swarm.publish(
|
|
&vec![Topic::new(topic.into_string())],
|
|
pubsub_message.clone(),
|
|
);
|
|
}
|
|
}
|
|
}
|
|
_ => break,
|
|
}
|
|
}
|
|
}
|
|
Ok(Async::NotReady)
|
|
}))
|
|
}
|
|
|
|
// Test publishing of a message with a full mesh for the topic
|
|
// Not very useful but this is the bare minimum functionality.
|
|
#[test]
|
|
fn test_gossipsub_full_mesh_publish() {
|
|
// set up the logging. The level and enabled or not
|
|
let log = common::build_log(Level::Info, false);
|
|
|
|
let num_nodes = 20;
|
|
let mut nodes = common::build_full_mesh(log, num_nodes, None);
|
|
let mut publishing_node = nodes.pop().unwrap();
|
|
let pubsub_message = PubsubMessage::Block(vec![0; 4]);
|
|
let publishing_topic: String = "/eth2/beacon_block/ssz".into();
|
|
let mut subscribed_count = 0;
|
|
let mut received_count = 0;
|
|
tokio::run(futures::future::poll_fn(move || -> Result<_, ()> {
|
|
for node in nodes.iter_mut() {
|
|
loop {
|
|
match node.poll().unwrap() {
|
|
Async::Ready(Some(Libp2pEvent::PubsubMessage {
|
|
topics, message, ..
|
|
})) => {
|
|
assert_eq!(topics.len(), 1);
|
|
// Assert topic is the published topic
|
|
assert_eq!(
|
|
topics.first().unwrap(),
|
|
&TopicHash::from_raw(publishing_topic.clone())
|
|
);
|
|
// Assert message received is the correct one
|
|
assert_eq!(message, pubsub_message.clone());
|
|
received_count += 1;
|
|
if received_count == num_nodes - 1 {
|
|
return Ok(Async::Ready(()));
|
|
}
|
|
}
|
|
_ => break,
|
|
}
|
|
}
|
|
}
|
|
loop {
|
|
match publishing_node.poll().unwrap() {
|
|
Async::Ready(Some(Libp2pEvent::PeerSubscribed(_, topic))) => {
|
|
// Received topics is one of subscribed eth2 topics
|
|
assert!(topic.clone().into_string().starts_with("/eth2/"));
|
|
// Publish on beacon block topic
|
|
if topic == TopicHash::from_raw("/eth2/beacon_block/ssz") {
|
|
subscribed_count += 1;
|
|
if subscribed_count == num_nodes - 1 {
|
|
publishing_node.swarm.publish(
|
|
&vec![Topic::new(topic.into_string())],
|
|
pubsub_message.clone(),
|
|
);
|
|
}
|
|
}
|
|
}
|
|
_ => break,
|
|
}
|
|
}
|
|
Ok(Async::NotReady)
|
|
}))
|
|
}
|