protover.rs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. // Copyright (c) 2016-2017, The Tor Project, Inc. */
  2. // See LICENSE for licensing information */
  3. extern crate protover;
  4. #[test]
  5. fn parse_protocol_list_with_single_proto_and_single_version() {
  6. let protocol = "Cons=1";
  7. let (is_supported, unsupported) = protover::all_supported(protocol);
  8. assert_eq!(true, is_supported);
  9. assert_eq!("", &unsupported);
  10. }
  11. #[test]
  12. fn parse_protocol_list_with_single_protocol_and_multiple_versions() {
  13. let protocol = "Cons=1-2";
  14. let (is_supported, unsupported) = protover::all_supported(protocol);
  15. assert_eq!(true, is_supported);
  16. assert_eq!("", &unsupported);
  17. }
  18. #[test]
  19. fn parse_protocol_list_with_different_single_protocol_and_single_version() {
  20. let protocol = "HSDir=1";
  21. let (is_supported, unsupported) = protover::all_supported(protocol);
  22. assert_eq!(true, is_supported);
  23. assert_eq!("", &unsupported);
  24. }
  25. #[test]
  26. fn parse_protocol_list_with_single_protocol_and_supported_version() {
  27. let protocol = "Desc=2";
  28. let (is_supported, unsupported) = protover::all_supported(protocol);
  29. assert_eq!(true, is_supported);
  30. assert_eq!("", &unsupported);
  31. }
  32. #[test]
  33. fn parse_protocol_list_with_two_protocols_and_single_version() {
  34. let protocols = "Cons=1 HSDir=1";
  35. let (is_supported, unsupported) = protover::all_supported(protocols);
  36. assert_eq!(true, is_supported);
  37. assert_eq!("", &unsupported);
  38. }
  39. #[test]
  40. fn parse_protocol_list_with_single_protocol_and_two_nonsequential_versions() {
  41. let protocol = "Desc=1,2";
  42. let (is_supported, unsupported) = protover::all_supported(protocol);
  43. assert_eq!(true, is_supported);
  44. assert_eq!("", &unsupported);
  45. }
  46. #[test]
  47. fn parse_protocol_list_with_single_protocol_and_two_sequential_versions() {
  48. let protocol = "Desc=1-2";
  49. let (is_supported, unsupported) = protover::all_supported(protocol);
  50. assert_eq!(true, is_supported);
  51. assert_eq!("", &unsupported);
  52. }
  53. #[test]
  54. fn parse_protocol_list_with_single_protocol_and_protocol_range_returns_set() {
  55. let protocol = "Link=1-4";
  56. let (is_supported, unsupported) = protover::all_supported(protocol);
  57. assert_eq!(true, is_supported);
  58. assert_eq!("", &unsupported);
  59. }
  60. #[test]
  61. fn parse_protocol_list_with_single_protocol_and_protocol_set() {
  62. let protocols = "Link=3-4 Desc=2";
  63. let (is_supported, unsupported) = protover::all_supported(protocols);
  64. assert_eq!(true, is_supported);
  65. assert_eq!("", &unsupported);
  66. }
  67. #[test]
  68. fn protover_all_supported_with_two_values() {
  69. let protocols = "Microdesc=1-2 Relay=2";
  70. let (is_supported, unsupported) = protover::all_supported(protocols);
  71. assert_eq!("", &unsupported);
  72. assert_eq!(true, is_supported);
  73. }
  74. #[test]
  75. fn protover_all_supported_with_one_value() {
  76. let protocols = "Microdesc=1-2";
  77. let (is_supported, unsupported) = protover::all_supported(protocols);
  78. assert_eq!("", &unsupported);
  79. assert_eq!(true, is_supported);
  80. }
  81. #[test]
  82. fn protover_all_supported_with_empty() {
  83. let protocols = "";
  84. let (is_supported, unsupported) = protover::all_supported(protocols);
  85. assert_eq!(true, is_supported);
  86. assert_eq!("", &unsupported);
  87. }
  88. #[test]
  89. fn protover_all_supported_with_three_values() {
  90. let protocols = "LinkAuth=1 Microdesc=1-2 Relay=2";
  91. let (is_supported, unsupported) = protover::all_supported(protocols);
  92. assert_eq!("", &unsupported);
  93. assert_eq!(true, is_supported);
  94. }
  95. #[test]
  96. fn protover_all_supported_with_unsupported_protocol() {
  97. let protocols = "Wombat=9";
  98. let (is_supported, unsupported) = protover::all_supported(protocols);
  99. assert_eq!(false, is_supported);
  100. assert_eq!("Wombat=9", &unsupported);
  101. }
  102. #[test]
  103. fn protover_all_supported_with_unsupported_versions() {
  104. let protocols = "Link=3-999";
  105. let (is_supported, unsupported) = protover::all_supported(protocols);
  106. assert_eq!(false, is_supported);
  107. assert_eq!("Link=3-999", &unsupported);
  108. }
  109. #[test]
  110. fn protover_all_supported_with_unsupported_low_version() {
  111. let protocols = "Cons=0-1";
  112. let (is_supported, unsupported) = protover::all_supported(protocols);
  113. assert_eq!(false, is_supported);
  114. assert_eq!("Cons=0-1", &unsupported);
  115. }
  116. #[test]
  117. fn protover_all_supported_with_unsupported_high_version() {
  118. let protocols = "Cons=1-3";
  119. let (is_supported, unsupported) = protover::all_supported(protocols);
  120. assert_eq!(false, is_supported);
  121. assert_eq!("Cons=1-3", &unsupported);
  122. }
  123. #[test]
  124. fn protover_all_supported_with_mix_of_supported_and_unsupproted() {
  125. let protocols = "Link=3-4 Wombat=9";
  126. let (is_supported, unsupported) = protover::all_supported(protocols);
  127. assert_eq!(false, is_supported);
  128. assert_eq!("Wombat=9", &unsupported);
  129. }
  130. #[test]
  131. fn protover_string_supports_protocol_returns_true_for_single_supported() {
  132. let protocols = "Link=3-4 Cons=1";
  133. let is_supported = protover::protover_string_supports_protocol(
  134. protocols,
  135. protover::Proto::Cons,
  136. 1,
  137. );
  138. assert_eq!(true, is_supported);
  139. }
  140. #[test]
  141. fn protover_string_supports_protocol_returns_false_for_single_unsupported() {
  142. let protocols = "Link=3-4 Cons=1";
  143. let is_supported = protover::protover_string_supports_protocol(
  144. protocols,
  145. protover::Proto::Cons,
  146. 2,
  147. );
  148. assert_eq!(false, is_supported);
  149. }
  150. #[test]
  151. fn protover_string_supports_protocol_returns_false_for_unsupported() {
  152. let protocols = "Link=3-4";
  153. let is_supported = protover::protover_string_supports_protocol(
  154. protocols,
  155. protover::Proto::Cons,
  156. 2,
  157. );
  158. assert_eq!(false, is_supported);
  159. }
  160. #[test]
  161. fn protover_all_supported_with_unexpected_characters() {
  162. let protocols = "Cons=*-%";
  163. let (is_supported, unsupported) = protover::all_supported(protocols);
  164. assert_eq!(false, is_supported);
  165. assert_eq!("Cons=*-%", &unsupported);
  166. }
  167. #[test]
  168. fn protover_compute_vote_returns_empty_for_empty_string() {
  169. let protocols = vec![String::from("")];
  170. let listed = protover::compute_vote(protocols, 1);
  171. assert_eq!("", listed);
  172. }
  173. #[test]
  174. fn protover_compute_vote_returns_single_protocol_for_matching() {
  175. let protocols = vec![String::from("Cons=1")];
  176. let listed = protover::compute_vote(protocols, 1);
  177. assert_eq!("Cons=1", listed);
  178. }
  179. #[test]
  180. fn protover_compute_vote_returns_two_protocols_for_two_matching() {
  181. let protocols = vec![String::from("Link=1 Cons=1")];
  182. let listed = protover::compute_vote(protocols, 1);
  183. assert_eq!("Cons=1 Link=1", listed);
  184. }
  185. #[test]
  186. fn protover_compute_vote_returns_one_protocol_when_one_out_of_two_matches() {
  187. let protocols = vec![String::from("Cons=1 Link=2"), String::from("Cons=1")];
  188. let listed = protover::compute_vote(protocols, 2);
  189. assert_eq!("Cons=1", listed);
  190. }
  191. #[test]
  192. fn protover_compute_vote_returns_protocols_that_it_doesnt_currently_support() {
  193. let protocols = vec![String::from("Foo=1 Cons=2"), String::from("Bar=1")];
  194. let listed = protover::compute_vote(protocols, 1);
  195. assert_eq!("Bar=1 Cons=2 Foo=1", listed);
  196. }
  197. #[test]
  198. fn protover_compute_vote_returns_matching_for_mix() {
  199. let protocols = vec![String::from("Link=1-10,500 Cons=1,3-7,8")];
  200. let listed = protover::compute_vote(protocols, 1);
  201. assert_eq!("Cons=1,3-8 Link=1-10,500", listed);
  202. }
  203. #[test]
  204. fn protover_compute_vote_returns_matching_for_longer_mix() {
  205. let protocols = vec![
  206. String::from("Desc=1-10,500 Cons=1,3-7,8"),
  207. String::from("Link=123-456,78 Cons=2-6,8 Desc=9"),
  208. ];
  209. let listed = protover::compute_vote(protocols, 1);
  210. assert_eq!("Cons=1-8 Desc=1-10,500 Link=78,123-456", listed);
  211. }
  212. #[test]
  213. fn protover_compute_vote_returns_matching_for_longer_mix_with_threshold_two() {
  214. let protocols = vec![
  215. String::from("Desc=1-10,500 Cons=1,3-7,8"),
  216. String::from("Link=123-456,78 Cons=2-6,8 Desc=9"),
  217. ];
  218. let listed = protover::compute_vote(protocols, 2);
  219. assert_eq!("Cons=3-6,8 Desc=9", listed);
  220. }
  221. #[test]
  222. fn protover_compute_vote_handles_duplicated_versions() {
  223. let protocols = vec![String::from("Cons=1"), String::from("Cons=1")];
  224. assert_eq!("Cons=1", protover::compute_vote(protocols, 2));
  225. let protocols = vec![String::from("Cons=1-2"), String::from("Cons=1-2")];
  226. assert_eq!("Cons=1-2", protover::compute_vote(protocols, 2));
  227. }
  228. #[test]
  229. fn protover_compute_vote_handles_invalid_proto_entries() {
  230. let protocols = vec![
  231. String::from("Cons=1"),
  232. String::from("Cons=1"),
  233. String::from("Link=a"),
  234. ];
  235. assert_eq!("Cons=1", protover::compute_vote(protocols, 2));
  236. let protocols = vec![
  237. String::from("Cons=1"),
  238. String::from("Cons=1"),
  239. String::from("Link=1-%"),
  240. ];
  241. assert_eq!("Cons=1", protover::compute_vote(protocols, 2));
  242. }
  243. #[test]
  244. fn protover_is_supported_here_returns_true_for_supported_protocol() {
  245. assert_eq!(true, protover::is_supported_here(protover::Proto::Cons, 1));
  246. }
  247. #[test]
  248. fn protover_is_supported_here_returns_false_for_unsupported_protocol() {
  249. assert_eq!(false, protover::is_supported_here(protover::Proto::Cons, 5));
  250. }