Discovery test
This commit is contained in:
parent
cf45d5914a
commit
4d40991c1a
@ -368,7 +368,7 @@ impl Discovery {
|
|||||||
// TODO: validate pong packet
|
// TODO: validate pong packet
|
||||||
let dest = try!(NodeEndpoint::from_rlp(&try!(rlp.at(0))));
|
let dest = try!(NodeEndpoint::from_rlp(&try!(rlp.at(0))));
|
||||||
let timestamp: u64 = try!(rlp.val_at(2));
|
let timestamp: u64 = try!(rlp.val_at(2));
|
||||||
if timestamp > time::get_time().sec as u64 {
|
if timestamp < time::get_time().sec as u64 {
|
||||||
return Err(NetworkError::Expired);
|
return Err(NetworkError::Expired);
|
||||||
}
|
}
|
||||||
let mut entry = NodeEntry { id: node.clone(), endpoint: dest };
|
let mut entry = NodeEntry { id: node.clone(), endpoint: dest };
|
||||||
@ -386,7 +386,7 @@ impl Discovery {
|
|||||||
trace!(target: "discovery", "Got FindNode from {:?}", &from);
|
trace!(target: "discovery", "Got FindNode from {:?}", &from);
|
||||||
let target: NodeId = try!(rlp.val_at(0));
|
let target: NodeId = try!(rlp.val_at(0));
|
||||||
let timestamp: u64 = try!(rlp.val_at(1));
|
let timestamp: u64 = try!(rlp.val_at(1));
|
||||||
if timestamp > time::get_time().sec as u64 {
|
if timestamp < time::get_time().sec as u64 {
|
||||||
return Err(NetworkError::Expired);
|
return Err(NetworkError::Expired);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,8 +395,8 @@ impl Discovery {
|
|||||||
if nearest.is_empty() {
|
if nearest.is_empty() {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
let mut rlp = RlpStream::new_list(cmp::min(limit, nearest.len()));
|
let mut rlp = RlpStream::new_list(1);
|
||||||
rlp.begin_list(1);
|
rlp.begin_list(cmp::min(limit, nearest.len()));
|
||||||
for n in 0 .. nearest.len() {
|
for n in 0 .. nearest.len() {
|
||||||
rlp.begin_list(4);
|
rlp.begin_list(4);
|
||||||
nearest[n].endpoint.to_rlp(&mut rlp);
|
nearest[n].endpoint.to_rlp(&mut rlp);
|
||||||
@ -404,8 +404,8 @@ impl Discovery {
|
|||||||
if (n + 1) % limit == 0 || n == nearest.len() - 1 {
|
if (n + 1) % limit == 0 || n == nearest.len() - 1 {
|
||||||
self.send_packet(PACKET_NEIGHBOURS, &from, &rlp.drain());
|
self.send_packet(PACKET_NEIGHBOURS, &from, &rlp.drain());
|
||||||
trace!(target: "discovery", "Sent {} Neighbours to {:?}", n, &from);
|
trace!(target: "discovery", "Sent {} Neighbours to {:?}", n, &from);
|
||||||
rlp = RlpStream::new_list(cmp::min(limit, nearest.len() - n));
|
rlp = RlpStream::new_list(1);
|
||||||
rlp.begin_list(1);
|
rlp.begin_list(cmp::min(limit, nearest.len() - n));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(None)
|
Ok(None)
|
||||||
@ -422,6 +422,9 @@ impl Discovery {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let node_id: NodeId = try!(r.val_at(3));
|
let node_id: NodeId = try!(r.val_at(3));
|
||||||
|
if node_id == self.id {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
let entry = NodeEntry { id: node_id.clone(), endpoint: endpoint };
|
let entry = NodeEntry { id: node_id.clone(), endpoint: endpoint };
|
||||||
added.insert(node_id, entry.clone());
|
added.insert(node_id, entry.clone());
|
||||||
self.ping(&entry.endpoint);
|
self.ping(&entry.endpoint);
|
||||||
@ -476,3 +479,48 @@ impl Discovery {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use hash::*;
|
||||||
|
use std::net::*;
|
||||||
|
use network::node_table::*;
|
||||||
|
use crypto::KeyPair;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn discovery() {
|
||||||
|
let key1 = KeyPair::create().unwrap();
|
||||||
|
let key2 = KeyPair::create().unwrap();
|
||||||
|
let ep1 = NodeEndpoint { address: SocketAddr::from_str("127.0.0.1:40444").unwrap(), udp_port: 40444 };
|
||||||
|
let ep2 = NodeEndpoint { address: SocketAddr::from_str("127.0.0.1:40445").unwrap(), udp_port: 40445 };
|
||||||
|
let mut discovery1 = Discovery::new(&key1, ep1.clone(), 0);
|
||||||
|
let mut discovery2 = Discovery::new(&key2, ep2.clone(), 0);
|
||||||
|
|
||||||
|
let node1 = Node::from_str("enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@127.0.0.1:7770").unwrap();
|
||||||
|
let node2 = Node::from_str("enode://b979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@127.0.0.1:7771").unwrap();
|
||||||
|
discovery1.add_node(NodeEntry { id: node1.id.clone(), endpoint: node1. endpoint.clone() });
|
||||||
|
discovery1.add_node(NodeEntry { id: node2.id.clone(), endpoint: node2. endpoint.clone() });
|
||||||
|
|
||||||
|
discovery2.add_node(NodeEntry { id: key1.public().clone(), endpoint: ep1.clone() });
|
||||||
|
discovery2.refresh();
|
||||||
|
|
||||||
|
for _ in 0 .. 10 {
|
||||||
|
while !discovery1.send_queue.is_empty() {
|
||||||
|
let datagramm = discovery1.send_queue.pop_front().unwrap();
|
||||||
|
if datagramm.address == ep2.address {
|
||||||
|
discovery2.on_packet(&datagramm.payload, ep1.address.clone()).ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while !discovery2.send_queue.is_empty() {
|
||||||
|
let datagramm = discovery2.send_queue.pop_front().unwrap();
|
||||||
|
if datagramm.address == ep1.address {
|
||||||
|
discovery1.on_packet(&datagramm.payload, ep2.address.clone()).ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
discovery2.round();
|
||||||
|
}
|
||||||
|
assert_eq!(Discovery::nearest_node_entries(&NodeId::new(), &discovery2.node_buckets).len(), 3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user