protover.rs 8.9 KB

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