rust/protover: parse empty string into empty *ProtoEntry

Contrary to what 15e59a1fed
said, the C implementation has always accepted an empty string
without complaint. Meanwhile the rust implementation has always
given an error. Make the rust implementation match C.

Also eliminate some more redundant tests.

Fix on 0.3.3.1-alpha.
This commit is contained in:
cypherpunks 2020-02-09 01:15:18 +00:00
parent 419ea2f813
commit 44facb83d5
2 changed files with 11 additions and 14 deletions

View File

@ -245,6 +245,11 @@ impl FromStr for ProtoEntry {
/// Otherwise, the `Err` value of this `Result` is a `ProtoverError`. /// Otherwise, the `Err` value of this `Result` is a `ProtoverError`.
fn from_str(protocol_entry: &str) -> Result<ProtoEntry, ProtoverError> { fn from_str(protocol_entry: &str) -> Result<ProtoEntry, ProtoverError> {
let mut proto_entry: ProtoEntry = ProtoEntry::default(); let mut proto_entry: ProtoEntry = ProtoEntry::default();
if protocol_entry.is_empty() {
return Ok(proto_entry);
}
let entries = protocol_entry.split(' '); let entries = protocol_entry.split(' ');
for entry in entries { for entry in entries {
@ -493,6 +498,10 @@ impl UnvalidatedProtoEntry {
) -> Result<Vec<(&'a str, &'a str)>, ProtoverError> { ) -> Result<Vec<(&'a str, &'a str)>, ProtoverError> {
let mut protovers: Vec<(&str, &str)> = Vec::new(); let mut protovers: Vec<(&str, &str)> = Vec::new();
if protocol_string.is_empty() {
return Ok(protovers);
}
for subproto in protocol_string.split(' ') { for subproto in protocol_string.split(' ') {
let mut parts = subproto.splitn(2, '='); let mut parts = subproto.splitn(2, '=');
@ -851,7 +860,8 @@ mod test {
#[test] #[test]
fn test_protoentry_from_str_empty() { fn test_protoentry_from_str_empty() {
assert_protoentry_is_unparseable!(""); assert_protoentry_is_parseable!("");
assert!(UnvalidatedProtoEntry::from_str("").is_ok());
} }
#[test] #[test]

View File

@ -69,18 +69,6 @@ fn protocol_all_supported_with_one_value() {
assert_eq!(true, unsupported.is_none()); assert_eq!(true, unsupported.is_none());
} }
#[test]
#[should_panic]
fn parse_protocol_unvalidated_with_empty() {
let _: UnvalidatedProtoEntry = "".parse().unwrap();
}
#[test]
#[should_panic]
fn parse_protocol_validated_with_empty() {
let _: ProtoEntry = "".parse().unwrap();
}
#[test] #[test]
fn protocol_all_supported_with_three_values() { fn protocol_all_supported_with_three_values() {
let protocols: UnvalidatedProtoEntry = "LinkAuth=1 Microdesc=1-2 Relay=2".parse().unwrap(); let protocols: UnvalidatedProtoEntry = "LinkAuth=1 Microdesc=1-2 Relay=2".parse().unwrap();
@ -156,7 +144,6 @@ fn parse_protocol_with_unexpected_characters() {
} }
#[test] #[test]
#[should_panic]
fn protover_compute_vote_returns_empty_for_empty_string() { fn protover_compute_vote_returns_empty_for_empty_string() {
let protocols: &[UnvalidatedProtoEntry] = &["".parse().unwrap()]; let protocols: &[UnvalidatedProtoEntry] = &["".parse().unwrap()];
let listed = ProtoverVote::compute(protocols, &1); let listed = ProtoverVote::compute(protocols, &1);