Added tests for bad gossip address (#672)

This commit is contained in:
pgarg66 2018-07-17 16:27:46 -07:00 committed by GitHub
parent 8bad411962
commit 4af556f70e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -50,6 +50,7 @@ pub enum CrdtError {
NoLeader, NoLeader,
BadContactInfo, BadContactInfo,
BadNodeInfo, BadNodeInfo,
BadGossipAddress,
} }
pub fn parse_port_or_addr(optstr: Option<String>) -> SocketAddr { pub fn parse_port_or_addr(optstr: Option<String>) -> SocketAddr {
@ -289,8 +290,13 @@ impl Crdt {
if me.version != 0 { if me.version != 0 {
return Err(Error::CrdtError(CrdtError::BadNodeInfo)); return Err(Error::CrdtError(CrdtError::BadNodeInfo));
} }
if me.contact_info.ncp.ip().is_unspecified()
|| me.contact_info.ncp.port() == 0
|| me.contact_info.ncp.ip().is_multicast()
{
return Err(Error::CrdtError(CrdtError::BadGossipAddress));
}
for addr in &[ for addr in &[
me.contact_info.ncp,
me.contact_info.tvu, me.contact_info.tvu,
me.contact_info.rpu, me.contact_info.rpu,
me.contact_info.tpu, me.contact_info.tpu,
@ -1264,6 +1270,18 @@ mod tests {
); );
assert_matches!( assert_matches!(
Crdt::new(d1).err(), Crdt::new(d1).err(),
Some(Error::CrdtError(CrdtError::BadGossipAddress))
);
let d1_1 = NodeInfo::new(
KeyPair::new().pubkey(),
"0.0.0.1:1234".parse().unwrap(),
"0.0.0.0:1235".parse().unwrap(),
"0.0.0.0:1236".parse().unwrap(),
"0.0.0.0:1237".parse().unwrap(),
"0.0.0.0:1238".parse().unwrap(),
);
assert_matches!(
Crdt::new(d1_1).err(),
Some(Error::CrdtError(CrdtError::BadContactInfo)) Some(Error::CrdtError(CrdtError::BadContactInfo))
); );
let d2 = NodeInfo::new( let d2 = NodeInfo::new(
@ -1276,14 +1294,29 @@ mod tests {
); );
assert_matches!( assert_matches!(
Crdt::new(d2).err(), Crdt::new(d2).err(),
Some(Error::CrdtError(CrdtError::BadGossipAddress))
);
let d2_1 = NodeInfo::new(
KeyPair::new().pubkey(),
"0.0.0.1:1234".parse().unwrap(),
"0.0.0.1:0".parse().unwrap(),
"0.0.0.1:0".parse().unwrap(),
"0.0.0.1:0".parse().unwrap(),
"0.0.0.1:0".parse().unwrap(),
);
assert_matches!(
Crdt::new(d2_1).err(),
Some(Error::CrdtError(CrdtError::BadContactInfo)) Some(Error::CrdtError(CrdtError::BadContactInfo))
); );
let d3 = NodeInfo::new_unspecified(); let d3 = NodeInfo::new_unspecified();
assert_eq!(Crdt::new(d3).is_ok(), true); assert_matches!(
Crdt::new(d3).err(),
Some(Error::CrdtError(CrdtError::BadGossipAddress))
);
let d4 = NodeInfo::new_multicast(); let d4 = NodeInfo::new_multicast();
assert_matches!( assert_matches!(
Crdt::new(d4).err(), Crdt::new(d4).err(),
Some(Error::CrdtError(CrdtError::BadContactInfo)) Some(Error::CrdtError(CrdtError::BadGossipAddress))
); );
let mut d5 = NodeInfo::new_multicast(); let mut d5 = NodeInfo::new_multicast();
d5.version = 1; d5.version = 1;
@ -1291,6 +1324,39 @@ mod tests {
Crdt::new(d5).err(), Crdt::new(d5).err(),
Some(Error::CrdtError(CrdtError::BadNodeInfo)) Some(Error::CrdtError(CrdtError::BadNodeInfo))
); );
let d6 = NodeInfo::new(
KeyPair::new().pubkey(),
"0.0.0.0:1234".parse().unwrap(),
"0.0.0.0:0".parse().unwrap(),
"0.0.0.0:0".parse().unwrap(),
"0.0.0.0:0".parse().unwrap(),
"0.0.0.0:0".parse().unwrap(),
);
assert_matches!(
Crdt::new(d6).err(),
Some(Error::CrdtError(CrdtError::BadGossipAddress))
);
let d7 = NodeInfo::new(
KeyPair::new().pubkey(),
"0.0.0.1:0".parse().unwrap(),
"0.0.0.0:0".parse().unwrap(),
"0.0.0.0:0".parse().unwrap(),
"0.0.0.0:0".parse().unwrap(),
"0.0.0.0:0".parse().unwrap(),
);
assert_matches!(
Crdt::new(d7).err(),
Some(Error::CrdtError(CrdtError::BadGossipAddress))
);
let d8 = NodeInfo::new(
KeyPair::new().pubkey(),
"0.0.0.1:1234".parse().unwrap(),
"0.0.0.0:0".parse().unwrap(),
"0.0.0.0:0".parse().unwrap(),
"0.0.0.0:0".parse().unwrap(),
"0.0.0.0:0".parse().unwrap(),
);
assert_eq!(Crdt::new(d8).is_ok(), true);
} }
#[test] #[test]