summaryrefslogtreecommitdiff
path: root/src/rust
diff options
context:
space:
mode:
authorcypherpunks <cypherpunks@torproject.org>2020-02-09 01:15:18 +0000
committercypherpunks <cypherpunks@torproject.org>2020-02-09 01:22:45 +0000
commit44facb83d5b8801ec53135fab8a1f610d468fcd1 (patch)
tree382254663a0e15128bf89b115c17b4c78de4710b /src/rust
parent419ea2f813c83a2065396ac085c9525dd2e1f137 (diff)
downloadtor-44facb83d5b8801ec53135fab8a1f610d468fcd1.tar.gz
tor-44facb83d5b8801ec53135fab8a1f610d468fcd1.zip
rust/protover: parse empty string into empty *ProtoEntry
Contrary to what 15e59a1fedf47e7e689e06e5649849552d8b8c0d 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.
Diffstat (limited to 'src/rust')
-rw-r--r--src/rust/protover/protover.rs12
-rw-r--r--src/rust/protover/tests/protover.rs13
2 files changed, 11 insertions, 14 deletions
diff --git a/src/rust/protover/protover.rs b/src/rust/protover/protover.rs
index 383a781fdc..14a70cd42b 100644
--- a/src/rust/protover/protover.rs
+++ b/src/rust/protover/protover.rs
@@ -245,6 +245,11 @@ impl FromStr for ProtoEntry {
/// Otherwise, the `Err` value of this `Result` is a `ProtoverError`.
fn from_str(protocol_entry: &str) -> Result<ProtoEntry, ProtoverError> {
let mut proto_entry: ProtoEntry = ProtoEntry::default();
+
+ if protocol_entry.is_empty() {
+ return Ok(proto_entry);
+ }
+
let entries = protocol_entry.split(' ');
for entry in entries {
@@ -493,6 +498,10 @@ impl UnvalidatedProtoEntry {
) -> Result<Vec<(&'a str, &'a str)>, ProtoverError> {
let mut protovers: Vec<(&str, &str)> = Vec::new();
+ if protocol_string.is_empty() {
+ return Ok(protovers);
+ }
+
for subproto in protocol_string.split(' ') {
let mut parts = subproto.splitn(2, '=');
@@ -851,7 +860,8 @@ mod test {
#[test]
fn test_protoentry_from_str_empty() {
- assert_protoentry_is_unparseable!("");
+ assert_protoentry_is_parseable!("");
+ assert!(UnvalidatedProtoEntry::from_str("").is_ok());
}
#[test]
diff --git a/src/rust/protover/tests/protover.rs b/src/rust/protover/tests/protover.rs
index cf0fb5bd3a..c97810a6f2 100644
--- a/src/rust/protover/tests/protover.rs
+++ b/src/rust/protover/tests/protover.rs
@@ -70,18 +70,6 @@ fn protocol_all_supported_with_one_value() {
}
#[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]
fn protocol_all_supported_with_three_values() {
let protocols: UnvalidatedProtoEntry = "LinkAuth=1 Microdesc=1-2 Relay=2".parse().unwrap();
let unsupported: Option<UnvalidatedProtoEntry> = protocols.all_supported();
@@ -156,7 +144,6 @@ fn parse_protocol_with_unexpected_characters() {
}
#[test]
-#[should_panic]
fn protover_compute_vote_returns_empty_for_empty_string() {
let protocols: &[UnvalidatedProtoEntry] = &["".parse().unwrap()];
let listed = ProtoverVote::compute(protocols, &1);