Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 41.96 KB | None | 0 0
  1. use std::net::{IpAddr, SocketAddr};
  2.  
  3. // internal dependencies
  4. use crate::config::opt::Opt;
  5. use crate::config::ServerConfigFile;
  6. use crate::DEFAULT_SERVER_IP_ADDRESS;
  7.  
  8. // external dependencies
  9. use failure::Fail;
  10.  
  11. #[derive(Debug, Fail, PartialEq, Eq)]
  12. pub enum ServerAddressError {
  13. #[fail(
  14. display = "found conflicting options provided in command line arguments or/and \
  15. environmental variables (address: {:?}, address_ip: {:?}, \
  16. address_port: {:?}), you can set server address by providing value \
  17. \"address\" (ie. \"127.0.0.1:8000\") or values \"address_ip\" \
  18. (ie. \"127.0.0.1\") and \"address_port\" (ie. \"8000\") together, \
  19. but not both configurations at the same time",
  20. _0, _1, _2
  21. )]
  22. ConflictingOptionsInArguments(Option<SocketAddr>, Option<IpAddr>, Option<u16>),
  23.  
  24. #[fail(
  25. display = "found conflicting options, don't know which to choose - in config file: \
  26. (\"address\": {:?}, \"address_ip\": {:?}, \"address_port\": {:?}) \
  27. and in command line arguments or/and environmental variables: \
  28. (\"address\": {:?}, \"address_ip\": {:?}, \"address_port\": {:?})",
  29. address_in_file, ip_in_file, port_in_file, address_in_arg, ip_in_arg, port_in_arg
  30. )]
  31. ConflictingOptions {
  32. address_in_file: Option<SocketAddr>,
  33. ip_in_file: Option<IpAddr>,
  34. port_in_file: Option<u16>,
  35. address_in_arg: Option<SocketAddr>,
  36. ip_in_arg: Option<IpAddr>,
  37. port_in_arg: Option<u16>,
  38. },
  39. }
  40.  
  41. #[derive(Debug, PartialEq, Eq)]
  42. pub struct ServerAddress(SocketAddr);
  43.  
  44. impl Default for ServerAddress {
  45. fn default() -> Self {
  46. Self(
  47. DEFAULT_SERVER_IP_ADDRESS
  48. .parse()
  49. .unwrap_or_else(|_| ([0, 0, 0, 0], 8000).into()),
  50. )
  51. }
  52. }
  53.  
  54. impl ServerAddress {
  55. fn with_port(mut self, port: u16) -> Self {
  56. self.0.set_port(port);
  57. self
  58. }
  59.  
  60. fn with_ip(mut self, ip: IpAddr) -> Self {
  61. self.0.set_ip(ip);
  62. self
  63. }
  64.  
  65. // todo: add cases when ports/ips are the same, even if they are set in multiple places
  66. pub fn from_opt(opt: &Opt) -> Result<Self, ServerAddressError> {
  67. match (
  68. opt.server_address,
  69. opt.server_address_ip,
  70. opt.server_address_port,
  71. ) {
  72. // full socket address
  73. (Some(address), None, None) => Ok(Self(address)),
  74. // ip and port separately
  75. (None, Some(ip), Some(port)) => Ok(Self(SocketAddr::new(ip, port))),
  76. // no information about socket address - use default
  77. (None, None, None) => Ok(Default::default()),
  78. // only ip provided - use port from default
  79. (None, Some(ip), None) => Ok(Self::default().with_ip(ip)),
  80. // only port provided - use ip from default
  81. (None, None, Some(port)) => Ok(Self::default().with_port(port)),
  82. // everything else is considered as conflicting options:
  83. // - full_address + ip + port
  84. // - full_address + ip
  85. // - full_address + port
  86. (address, ip, port) => Err(ServerAddressError::ConflictingOptionsInArguments(
  87. address, ip, port,
  88. )),
  89. }
  90. }
  91.  
  92. pub fn from_opt_with_config_file(
  93. opt: &Opt,
  94. config_file: &ServerConfigFile,
  95. ) -> Result<Self, ServerAddressError> {
  96. let address = match (
  97. config_file.address,
  98. config_file.address_ip,
  99. config_file.address_port,
  100. opt.server_address,
  101. opt.server_address_ip,
  102. opt.server_address_port,
  103. ) {
  104. // full address
  105. (Some(address), None, None, None, None, None)
  106. | (None, None, None, Some(address), None, None) => Self(address),
  107.  
  108. // ip and port separately
  109. (None, Some(ip), Some(port), None, None, None)
  110. | (None, None, None, None, Some(ip), Some(port))
  111. | (None, Some(ip), None, None, None, Some(port))
  112. | (None, None, Some(port), None, Some(ip), None) => Self(SocketAddr::new(ip, port)),
  113.  
  114. // only ip provided - use default port
  115. (None, Some(ip), None, None, None, None) | (None, None, None, None, Some(ip), None) => {
  116. ServerAddress::default().with_ip(ip)
  117. }
  118.  
  119. // only port provided - use default ip
  120. (None, None, Some(port), None, None, None)
  121. | (None, None, None, None, None, Some(port)) => {
  122. ServerAddress::default().with_port(port)
  123. }
  124.  
  125. // no address-related options, use default
  126. (None, None, None, None, None, None) => ServerAddress::default(),
  127.  
  128. // conflicting options
  129. (
  130. address_file,
  131. address_ip_file,
  132. address_port_file,
  133. address_arg,
  134. address_ip_arg,
  135. address_port_arg,
  136. ) => {
  137. return Err(ServerAddressError::ConflictingOptions {
  138. address_in_file: address_file,
  139. ip_in_file: address_ip_file,
  140. port_in_file: address_port_file,
  141. address_in_arg: address_arg,
  142. ip_in_arg: address_ip_arg,
  143. port_in_arg: address_port_arg,
  144. });
  145. }
  146. };
  147.  
  148. Ok(address)
  149. }
  150. }
  151.  
  152. impl From<ServerAddress> for SocketAddr {
  153. fn from(server_address: ServerAddress) -> Self {
  154. server_address.0
  155. }
  156. }
  157.  
  158. /*
  159. Yes, I know this is madness, but I was writing the tests to de-stress :-)
  160. */
  161. #[cfg(test)]
  162. mod tests {
  163. use super::*;
  164.  
  165. // ServerAddress::from_opt
  166. // Ok
  167.  
  168. // (Some, None, None)
  169. #[test]
  170. fn from_opt_when_correct_full_address_provided() {
  171. let cases = [
  172. ([0, 0, 0, 0], 8000),
  173. ([1, 1, 1, 1], 8888),
  174. ([127, 0, 0, 1], 0),
  175. ([192, 168, 0, 1], 22),
  176. ([172, 10, 0, 1], 8080),
  177. ([10, 0, 0, 1], 80),
  178. ([8, 8, 8, 8], 2130),
  179. ([0, 0, 0, 0], 443),
  180. ];
  181.  
  182. for &full_address in cases.iter() {
  183. let full_address = full_address.into();
  184. let opt = Opt {
  185. server_address: Some(full_address),
  186. ..Default::default()
  187. };
  188.  
  189. let expected = Ok(ServerAddress(full_address));
  190. let got = ServerAddress::from_opt(&opt);
  191.  
  192. assert_eq!(expected, got);
  193. }
  194. }
  195.  
  196. // (None, Some, Some)
  197. #[test]
  198. fn from_opt_when_correct_ip_and_port_provided() {
  199. let cases = [
  200. ([0, 0, 0, 0], 8000),
  201. ([1, 1, 1, 1], 8888),
  202. ([127, 0, 0, 1], 0),
  203. ([192, 168, 0, 1], 22),
  204. ([172, 10, 0, 1], 8080),
  205. ([10, 0, 0, 1], 80),
  206. ([8, 8, 8, 8], 2130),
  207. ([0, 0, 0, 0], 443),
  208. ];
  209.  
  210. for &(ip, port) in cases.iter() {
  211. let ip = ip.into();
  212. let opt = Opt {
  213. server_address_ip: Some(ip),
  214. server_address_port: Some(port),
  215. ..Default::default()
  216. };
  217.  
  218. let expected = Ok(ServerAddress(SocketAddr::new(ip, port)));
  219. let got = ServerAddress::from_opt(&opt);
  220.  
  221. assert_eq!(expected, got);
  222. }
  223. }
  224.  
  225. // (None, Some, None)
  226. #[test]
  227. fn from_opt_when_correct_ip_provided() {
  228. let cases = [
  229. [0, 0, 0, 0],
  230. [1, 1, 1, 1],
  231. [127, 0, 0, 1],
  232. [192, 168, 0, 1],
  233. [172, 10, 0, 1],
  234. [10, 0, 0, 1],
  235. [8, 8, 8, 8],
  236. [0, 0, 0, 0],
  237. ];
  238.  
  239. let default_port = ServerAddress::default().0.port();
  240.  
  241. for &ip in cases.iter() {
  242. let ip = ip.into();
  243. let opt = Opt {
  244. server_address_ip: Some(ip),
  245. ..Default::default()
  246. };
  247.  
  248. let expected = Ok(ServerAddress(SocketAddr::new(ip, default_port)));
  249. let got = ServerAddress::from_opt(&opt);
  250.  
  251. assert_eq!(expected, got);
  252. }
  253. }
  254.  
  255. // (None, None, Some)
  256. #[test]
  257. fn from_opt_when_correct_port_provided() {
  258. let cases = [8000, 8888, 0, 22, 8080, 80, 2130, 443];
  259. let default_ip = ServerAddress::default().0.ip();
  260.  
  261. for &port in cases.iter() {
  262. let opt = Opt {
  263. server_address_port: Some(port),
  264. ..Default::default()
  265. };
  266.  
  267. let expected = Ok(ServerAddress(SocketAddr::new(default_ip, port)));
  268. let got = ServerAddress::from_opt(&opt);
  269.  
  270. assert_eq!(expected, got);
  271. }
  272. }
  273.  
  274. // Err
  275.  
  276. // (Some, Some, Some)
  277. #[test]
  278. fn from_opt_when_full_address_and_ip_and_port_provided() {
  279. let cases = [
  280. (([13, 32, 210, 19], 80), [0, 0, 0, 0], 8000),
  281. (([216, 58, 198, 177], 1234), [1, 1, 1, 1], 8888),
  282. (([54, 165, 51, 142], 0), [127, 0, 0, 1], 0),
  283. (([104, 31, 86, 15], 53), [192, 168, 0, 1], 22),
  284. (([104, 131, 29, 33], 31111), [172, 10, 0, 1], 8080),
  285. (([13, 32, 210, 167], 65535), [10, 0, 0, 1], 80),
  286. (([104, 28, 11, 218], 7731), [8, 8, 8, 8], 2130),
  287. (([13, 32, 210, 248], 443), [0, 0, 0, 0], 443),
  288. ];
  289.  
  290. for &(full_address, ip, port) in cases.iter() {
  291. let some_full_address = Some(full_address.into());
  292. let some_ip = Some(ip.into());
  293. let some_port = Some(port);
  294.  
  295. let opt = Opt {
  296. server_address: some_full_address,
  297. server_address_ip: some_ip,
  298. server_address_port: some_port,
  299. ..Default::default()
  300. };
  301.  
  302. let expected = Err(ServerAddressError::ConflictingOptionsInArguments(
  303. some_full_address,
  304. some_ip,
  305. some_port,
  306. ));
  307. let got = ServerAddress::from_opt(&opt);
  308.  
  309. assert_eq!(expected, got);
  310. }
  311. }
  312.  
  313. // (Some, Some, None)
  314. #[test]
  315. fn from_opt_when_full_address_and_ip_provided() {
  316. let cases = [
  317. (([13, 32, 210, 19], 80), [0, 0, 0, 0]),
  318. (([216, 58, 198, 177], 1234), [1, 1, 1, 1]),
  319. (([54, 165, 51, 142], 0), [127, 0, 0, 1]),
  320. (([104, 31, 86, 15], 53), [192, 168, 0, 1]),
  321. (([104, 131, 29, 33], 31111), [172, 10, 0, 1]),
  322. (([13, 32, 210, 167], 65535), [10, 0, 0, 1]),
  323. (([104, 28, 11, 218], 7731), [8, 8, 8, 8]),
  324. (([13, 32, 210, 248], 443), [0, 0, 0, 0]),
  325. ];
  326.  
  327. for &(full_address, ip) in cases.iter() {
  328. let some_full_address = Some(full_address.into());
  329. let some_ip = Some(ip.into());
  330.  
  331. let opt = Opt {
  332. server_address: some_full_address,
  333. server_address_ip: some_ip,
  334. ..Default::default()
  335. };
  336.  
  337. let expected = Err(ServerAddressError::ConflictingOptionsInArguments(
  338. some_full_address,
  339. some_ip,
  340. None,
  341. ));
  342. let got = ServerAddress::from_opt(&opt);
  343.  
  344. assert_eq!(expected, got);
  345. }
  346. }
  347.  
  348. // (Some, None, Some)
  349. #[test]
  350. fn from_opt_when_full_address_and_port_provided() {
  351. let cases = [
  352. (([13, 32, 210, 19], 80), 8000),
  353. (([216, 58, 198, 177], 1234), 8888),
  354. (([54, 165, 51, 142], 0), 0),
  355. (([104, 31, 86, 15], 53), 22),
  356. (([104, 131, 29, 33], 31111), 8080),
  357. (([13, 32, 210, 167], 65535), 80),
  358. (([104, 28, 11, 218], 7731), 2130),
  359. (([13, 32, 210, 248], 443), 443),
  360. ];
  361.  
  362. for &(full_address, port) in cases.iter() {
  363. let some_full_address = Some(full_address.into());
  364. let some_port = Some(port);
  365.  
  366. let opt = Opt {
  367. server_address: some_full_address,
  368. server_address_port: some_port,
  369. ..Default::default()
  370. };
  371.  
  372. let expected = Err(ServerAddressError::ConflictingOptionsInArguments(
  373. some_full_address,
  374. None,
  375. some_port,
  376. ));
  377. let got = ServerAddress::from_opt(&opt);
  378.  
  379. assert_eq!(expected, got);
  380. }
  381. }
  382.  
  383. // ServerAddress::from_opt_with_config_file
  384. // Ok
  385.  
  386. // (Some, None, None), (None, None, None)
  387. #[test]
  388. fn from_opt_with_config_file_when_correct_full_address_in_arg_provided() {
  389. let cases = [
  390. ([0, 0, 0, 0], 8000),
  391. ([1, 1, 1, 1], 8888),
  392. ([127, 0, 0, 1], 0),
  393. ([192, 168, 0, 1], 22),
  394. ([172, 10, 0, 1], 8080),
  395. ([10, 0, 0, 1], 80),
  396. ([8, 8, 8, 8], 2130),
  397. ([0, 0, 0, 0], 443),
  398. ];
  399.  
  400. let config_file = ServerConfigFile::default();
  401.  
  402. for &full_address in cases.iter() {
  403. let full_address = full_address.into();
  404. let opt = Opt {
  405. server_address: Some(full_address),
  406. ..Default::default()
  407. };
  408.  
  409. let expected = Ok(ServerAddress(full_address));
  410. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  411.  
  412. assert_eq!(expected, got);
  413. }
  414. }
  415.  
  416. // (None, Some, Some), (None, None, None)
  417. #[test]
  418. fn from_opt_with_config_file_when_correct_ip_and_port_in_arg_provided() {
  419. let cases = [
  420. ([0, 0, 0, 0], 8000),
  421. ([1, 1, 1, 1], 8888),
  422. ([127, 0, 0, 1], 0),
  423. ([192, 168, 0, 1], 22),
  424. ([172, 10, 0, 1], 8080),
  425. ([10, 0, 0, 1], 80),
  426. ([8, 8, 8, 8], 2130),
  427. ([0, 0, 0, 0], 443),
  428. ];
  429.  
  430. let config_file = ServerConfigFile::default();
  431.  
  432. for &(ip, port) in cases.iter() {
  433. let ip = ip.into();
  434. let opt = Opt {
  435. server_address_ip: Some(ip),
  436. server_address_port: Some(port),
  437. ..Default::default()
  438. };
  439.  
  440. let expected = Ok(ServerAddress(SocketAddr::new(ip, port)));
  441. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  442.  
  443. assert_eq!(expected, got);
  444. }
  445. }
  446.  
  447. // (None, Some, None), (None, None, None)
  448. #[test]
  449. fn from_opt_with_config_file_when_correct_ip_in_arg_provided() {
  450. let cases = [
  451. [0, 0, 0, 0],
  452. [1, 1, 1, 1],
  453. [127, 0, 0, 1],
  454. [192, 168, 0, 1],
  455. [172, 10, 0, 1],
  456. [10, 0, 0, 1],
  457. [8, 8, 8, 8],
  458. [0, 0, 0, 0],
  459. ];
  460.  
  461. let config_file = ServerConfigFile::default();
  462. let default_port = ServerAddress::default().0.port();
  463.  
  464. for &ip in cases.iter() {
  465. let ip = ip.into();
  466. let opt = Opt {
  467. server_address_ip: Some(ip),
  468. ..Default::default()
  469. };
  470.  
  471. let expected = Ok(ServerAddress(SocketAddr::new(ip, default_port)));
  472. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  473.  
  474. assert_eq!(expected, got);
  475. }
  476. }
  477.  
  478. // (None, None, Some), (None, None, None)
  479. #[test]
  480. fn from_opt_with_config_file_when_correct_port_in_arg_provided() {
  481. let cases = [8000, 8888, 0, 22, 8080, 80, 2130, 443];
  482. let config_file = ServerConfigFile::default();
  483. let default_ip = ServerAddress::default().0.ip();
  484.  
  485. for &port in cases.iter() {
  486. let opt = Opt {
  487. server_address_port: Some(port),
  488. ..Default::default()
  489. };
  490.  
  491. let expected = Ok(ServerAddress(SocketAddr::new(default_ip, port)));
  492. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  493.  
  494. assert_eq!(expected, got);
  495. }
  496. }
  497.  
  498. // (None, None, None), (Some, None, None)
  499. #[test]
  500. fn from_opt_with_config_file_when_correct_full_address_in_config_file_provided() {
  501. let cases = [
  502. ([0, 0, 0, 0], 8000),
  503. ([1, 1, 1, 1], 8888),
  504. ([127, 0, 0, 1], 0),
  505. ([192, 168, 0, 1], 22),
  506. ([172, 10, 0, 1], 8080),
  507. ([10, 0, 0, 1], 80),
  508. ([8, 8, 8, 8], 2130),
  509. ([0, 0, 0, 0], 443),
  510. ];
  511.  
  512. let opt = Opt::default();
  513.  
  514. for &full_address in cases.iter() {
  515. let full_address = full_address.into();
  516. let config_file = ServerConfigFile {
  517. address: Some(full_address),
  518. ..Default::default()
  519. };
  520.  
  521. let expected = Ok(ServerAddress(full_address));
  522. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  523.  
  524. assert_eq!(expected, got);
  525. }
  526. }
  527.  
  528. // (None, None, None), (None, Some, Some)
  529. #[test]
  530. fn from_opt_with_config_file_when_correct_ip_and_port_in_config_file_provided() {
  531. let cases = [
  532. ([0, 0, 0, 0].into(), 8000),
  533. ([1, 1, 1, 1].into(), 8888),
  534. ([127, 0, 0, 1].into(), 0),
  535. ([192, 168, 0, 1].into(), 22),
  536. ([172, 10, 0, 1].into(), 8080),
  537. ([10, 0, 0, 1].into(), 80),
  538. ([8, 8, 8, 8].into(), 2130),
  539. ([0, 0, 0, 0].into(), 443),
  540. ];
  541.  
  542. let opt = Opt::default();
  543.  
  544. for &(ip, port) in cases.iter() {
  545. let config_file = ServerConfigFile {
  546. address_ip: Some(ip),
  547. address_port: Some(port),
  548. ..Default::default()
  549. };
  550.  
  551. let expected = Ok(ServerAddress(SocketAddr::new(ip, port)));
  552. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  553.  
  554. assert_eq!(expected, got);
  555. }
  556. }
  557.  
  558. // (None, None, None), (None, Some, None)
  559. #[test]
  560. fn from_opt_with_config_file_when_correct_ip_in_config_file_provided() {
  561. let cases = [
  562. [0, 0, 0, 0],
  563. [1, 1, 1, 1],
  564. [127, 0, 0, 1],
  565. [192, 168, 0, 1],
  566. [172, 10, 0, 1],
  567. [10, 0, 0, 1],
  568. [8, 8, 8, 8],
  569. [0, 0, 0, 0],
  570. ];
  571.  
  572. let opt = Opt::default();
  573. let default_port = ServerAddress::default().0.port();
  574.  
  575. for &ip in cases.iter() {
  576. let ip = ip.into();
  577. let config_file = ServerConfigFile {
  578. address_ip: Some(ip),
  579. ..Default::default()
  580. };
  581.  
  582. let expected = Ok(ServerAddress(SocketAddr::new(ip, default_port)));
  583. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  584.  
  585. assert_eq!(expected, got);
  586. }
  587. }
  588.  
  589. // (None, None, None), (None, None, Some)
  590. #[test]
  591. fn from_opt_with_config_file_when_correct_port_in_config_file_provided() {
  592. let cases = [8000, 8888, 0, 22, 8080, 80, 2130, 443];
  593. let default_ip = ServerAddress::default().0.ip();
  594. let opt = Opt::default();
  595.  
  596. for &port in cases.iter() {
  597. let config_file = ServerConfigFile {
  598. address_port: Some(port),
  599. ..Default::default()
  600. };
  601.  
  602. let expected = Ok(ServerAddress(SocketAddr::new(default_ip, port)));
  603. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  604.  
  605. assert_eq!(expected, got);
  606. }
  607. }
  608.  
  609. // (None, Some, None), (None, None, Some)
  610. #[test]
  611. fn from_opt_with_config_file_when_correct_ip_in_arg_and_port_in_config_file_provided() {
  612. let cases = [
  613. ([0, 0, 0, 0], 8000),
  614. ([1, 1, 1, 1], 8888),
  615. ([127, 0, 0, 1], 0),
  616. ([192, 168, 0, 1], 22),
  617. ([172, 10, 0, 1], 8080),
  618. ([10, 0, 0, 1], 80),
  619. ([8, 8, 8, 8], 2130),
  620. ([0, 0, 0, 0], 443),
  621. ];
  622.  
  623. for &(ip, port) in cases.iter() {
  624. let ip = ip.into();
  625. let opt = Opt {
  626. server_address_ip: Some(ip),
  627. ..Default::default()
  628. };
  629.  
  630. let config_file = ServerConfigFile {
  631. address_port: Some(port),
  632. ..Default::default()
  633. };
  634.  
  635. let expected = Ok(ServerAddress(SocketAddr::new(ip, port)));
  636. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  637.  
  638. assert_eq!(expected, got);
  639. }
  640. }
  641.  
  642. // (None, None, Some), (None, Some, None)
  643. #[test]
  644. fn from_opt_with_config_file_when_correct_ip_in_config_file_and_port_in_arg_provided() {
  645. let cases = [
  646. ([0, 0, 0, 0], 8000),
  647. ([1, 1, 1, 1], 8888),
  648. ([127, 0, 0, 1], 0),
  649. ([192, 168, 0, 1], 22),
  650. ([172, 10, 0, 1], 8080),
  651. ([10, 0, 0, 1], 80),
  652. ([8, 8, 8, 8], 2130),
  653. ([0, 0, 0, 0], 443),
  654. ];
  655.  
  656. for &(ip, port) in cases.iter() {
  657. let ip = ip.into();
  658. let opt = Opt {
  659. server_address_port: Some(port),
  660. ..Default::default()
  661. };
  662.  
  663. let config_file = ServerConfigFile {
  664. address_ip: Some(ip),
  665. ..Default::default()
  666. };
  667.  
  668. let expected = Ok(ServerAddress(SocketAddr::new(ip, port)));
  669. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  670.  
  671. assert_eq!(expected, got);
  672. }
  673. }
  674.  
  675. // Err
  676.  
  677. // (Some, Some, Some), (Some, Some, Some)
  678. #[test]
  679. fn from_opt_with_config_file_when_full_address_and_ip_and_port_provided_in_arg_and_config_file()
  680. {
  681. let arg_cases = [
  682. (([13, 32, 210, 19], 80), [0, 0, 0, 0], 8000),
  683. (([216, 58, 198, 177], 1234), [1, 1, 1, 1], 8888),
  684. (([54, 165, 51, 142], 0), [127, 0, 0, 1], 0),
  685. (([104, 31, 86, 15], 53), [192, 168, 0, 1], 22),
  686. (([104, 131, 29, 33], 31111), [172, 10, 0, 1], 8080),
  687. (([13, 32, 210, 167], 65535), [10, 0, 0, 1], 80),
  688. (([104, 28, 11, 218], 7731), [8, 8, 8, 8], 2130),
  689. (([13, 32, 210, 248], 443), [0, 0, 0, 0], 443),
  690. ];
  691.  
  692. let config_file_cases = [
  693. (([104, 28, 11, 218], 7731), [8, 8, 8, 8], 2130),
  694. (([13, 32, 210, 19], 80), [0, 0, 0, 0], 8000),
  695. (([104, 131, 29, 33], 31111), [172, 10, 0, 1], 8080),
  696. (([216, 58, 198, 177], 1234), [1, 1, 1, 1], 8888),
  697. (([54, 165, 51, 142], 0), [127, 0, 0, 1], 0),
  698. (([13, 32, 210, 248], 443), [0, 0, 0, 0], 443),
  699. (([104, 31, 86, 15], 53), [192, 168, 0, 1], 22),
  700. (([13, 32, 210, 167], 65535), [10, 0, 0, 1], 80),
  701. ];
  702.  
  703. for (
  704. &(arg_full_address, arg_ip, arg_port),
  705. &(config_file_full_address, config_file_ip, config_file_port),
  706. ) in arg_cases.iter().zip(config_file_cases.iter())
  707. {
  708. let some_arg_full_address = Some(arg_full_address.into());
  709. let some_arg_ip = Some(arg_ip.into());
  710. let some_arg_port = Some(arg_port);
  711. let some_config_file_full_address = Some(config_file_full_address.into());
  712. let some_config_file_ip = Some(config_file_ip.into());
  713. let some_config_file_port = Some(config_file_port);
  714.  
  715. let opt = Opt {
  716. server_address: some_arg_full_address,
  717. server_address_ip: some_arg_ip,
  718. server_address_port: some_arg_port,
  719. ..Default::default()
  720. };
  721.  
  722. let config_file = ServerConfigFile {
  723. address: some_config_file_full_address,
  724. address_ip: some_config_file_ip,
  725. address_port: some_config_file_port,
  726. ..Default::default()
  727. };
  728.  
  729. let expected = Err(ServerAddressError::ConflictingOptions {
  730. address_in_arg: some_arg_full_address,
  731. ip_in_arg: some_arg_ip,
  732. port_in_arg: some_arg_port,
  733. address_in_file: some_config_file_full_address,
  734. ip_in_file: some_config_file_ip,
  735. port_in_file: some_config_file_port,
  736. });
  737. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  738.  
  739. assert_eq!(expected, got);
  740. }
  741. }
  742.  
  743. // (Some, None, None), (Some, None, None)
  744. #[test]
  745. fn from_opt_with_config_file_when_full_address_provided_in_arg_and_config_file() {
  746. let arg_cases = [
  747. ([13, 32, 210, 19], 80),
  748. ([216, 58, 198, 177], 1234),
  749. ([54, 165, 51, 142], 0),
  750. ([104, 31, 86, 15], 53),
  751. ([104, 131, 29, 33], 31111),
  752. ([13, 32, 210, 167], 65535),
  753. ([104, 28, 11, 218], 7731),
  754. ([13, 32, 210, 248], 443),
  755. ];
  756.  
  757. let config_file_cases = [
  758. ([104, 28, 11, 218], 7731),
  759. ([13, 32, 210, 19], 80),
  760. ([104, 131, 29, 33], 31111),
  761. ([216, 58, 198, 177], 1234),
  762. ([54, 165, 51, 142], 0),
  763. ([13, 32, 210, 248], 443),
  764. ([104, 31, 86, 15], 53),
  765. ([13, 32, 210, 167], 65535),
  766. ];
  767.  
  768. for (&arg_full_address, &config_file_full_address) in
  769. arg_cases.iter().zip(config_file_cases.iter())
  770. {
  771. let some_arg_full_address = Some(arg_full_address.into());
  772. let some_config_file_full_address = Some(config_file_full_address.into());
  773.  
  774. let opt = Opt {
  775. server_address: some_arg_full_address,
  776. ..Default::default()
  777. };
  778.  
  779. let config_file = ServerConfigFile {
  780. address: some_config_file_full_address,
  781. ..Default::default()
  782. };
  783.  
  784. let expected = Err(ServerAddressError::ConflictingOptions {
  785. address_in_arg: some_arg_full_address,
  786. ip_in_arg: None,
  787. port_in_arg: None,
  788. address_in_file: some_config_file_full_address,
  789. ip_in_file: None,
  790. port_in_file: None,
  791. });
  792. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  793.  
  794. assert_eq!(expected, got);
  795. }
  796. }
  797.  
  798. // (Some, None, None), (None, Some, None)
  799. #[test]
  800. fn from_opt_with_config_file_when_full_address_provided_in_arg_and_ip_in_config_file() {
  801. let cases = [
  802. (([13, 32, 210, 19], 80), [104, 28, 11, 218]),
  803. (([216, 58, 198, 177], 1234), [13, 32, 210, 19]),
  804. (([54, 165, 51, 142], 0), [104, 131, 29, 33]),
  805. (([104, 31, 86, 15], 53), [216, 58, 198, 177]),
  806. (([104, 131, 29, 33], 31111), [54, 165, 51, 142]),
  807. (([13, 32, 210, 167], 65535), [13, 32, 210, 248]),
  808. (([104, 28, 11, 218], 7731), [104, 31, 86, 15]),
  809. (([13, 32, 210, 248], 443), [13, 32, 210, 167]),
  810. ];
  811.  
  812. for &(arg_full_address, config_file_ip) in cases.iter() {
  813. let some_arg_full_address = Some(arg_full_address.into());
  814. let some_config_file_ip = Some(config_file_ip.into());
  815.  
  816. let opt = Opt {
  817. server_address: some_arg_full_address,
  818. ..Default::default()
  819. };
  820.  
  821. let config_file = ServerConfigFile {
  822. address_ip: some_config_file_ip,
  823. ..Default::default()
  824. };
  825.  
  826. let expected = Err(ServerAddressError::ConflictingOptions {
  827. address_in_arg: some_arg_full_address,
  828. ip_in_arg: None,
  829. port_in_arg: None,
  830. address_in_file: None,
  831. ip_in_file: some_config_file_ip,
  832. port_in_file: None,
  833. });
  834. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  835.  
  836. assert_eq!(expected, got);
  837. }
  838. }
  839.  
  840. // Some of the cases are duplicated here in reference to the tests above
  841. #[test]
  842. fn from_opt_with_config_wile_conflicting_options() {
  843. let cases = [
  844. // (Some, None, None), (Some, None, None)
  845. (
  846. (Some(([13, 32, 210, 19], 80).into()), None, None),
  847. (Some(([104, 28, 11, 218], 7731).into()), None, None),
  848. ),
  849. // (Some, None, None), (None, Some, None)
  850. (
  851. (Some(([216, 58, 198, 177], 1234).into()), None, None),
  852. (None, Some([0, 0, 0, 0].into()), None),
  853. ),
  854. // (Some, None, None), (None, None, Some)
  855. (
  856. (Some(([54, 165, 51, 142], 0).into()), None, None),
  857. (None, None, Some(8080)),
  858. ),
  859. // (Some, None, None), (Some, Some, None)
  860. (
  861. (Some(([104, 31, 86, 15], 53).into()), None, None),
  862. (
  863. Some(([216, 58, 198, 177], 1234).into()),
  864. Some([1, 1, 1, 1].into()),
  865. None,
  866. ),
  867. ),
  868. // (Some, None, None), (None, Some, Some)
  869. (
  870. (Some(([104, 131, 29, 33], 31111).into()), None, None),
  871. (None, Some([127, 0, 0, 1].into()), Some(0)),
  872. ),
  873. // (Some, None, None), (Some, None, Some)
  874. (
  875. (Some(([13, 32, 210, 167], 65535).into()), None, None),
  876. (Some(([13, 32, 210, 248], 443).into()), None, Some(443)),
  877. ),
  878. // (Some, None, None), (Some, Some, Some)
  879. (
  880. (Some(([104, 28, 11, 218], 7731).into()), None, None),
  881. (
  882. Some(([104, 31, 86, 15], 53).into()),
  883. Some([192, 168, 0, 1].into()),
  884. Some(22),
  885. ),
  886. ),
  887. // (None, Some, None), (Some, None, None)
  888. (
  889. (None, Some([0, 0, 0, 0].into()), None),
  890. (Some(([13, 32, 210, 167], 65535).into()), None, None),
  891. ),
  892. // (None, Some, None), (None, Some, None)
  893. (
  894. (None, Some([0, 0, 0, 0].into()), None),
  895. (None, Some([8, 8, 8, 8].into()), None),
  896. ),
  897. // (None, Some, None), (Some, Some, None)
  898. (
  899. (None, Some([0, 0, 0, 0].into()), None),
  900. (
  901. Some(([104, 28, 11, 218], 7731).into()),
  902. Some([8, 8, 8, 8].into()),
  903. None,
  904. ),
  905. ),
  906. // (None, Some, None), (None, Some, Some)
  907. (
  908. (None, Some([1, 1, 1, 1].into()), None),
  909. (None, Some([0, 0, 0, 0].into()), Some(000)),
  910. ),
  911. // (None, Some, None), (Some, None, Some)
  912. (
  913. (None, Some([127, 0, 0, 1].into()), None),
  914. (Some(([104, 131, 29, 33], 31111).into()), None, Some(8080)),
  915. ),
  916. // (None, Some, None), (Some, Some, Some)
  917. (
  918. (None, Some([192, 168, 0, 1].into()), None),
  919. (
  920. Some(([216, 58, 198, 177], 1234).into()),
  921. Some([1, 1, 1, 1].into()),
  922. Some(8888),
  923. ),
  924. ),
  925. // (None, None, Some), (Some, None, None)
  926. (
  927. (None, None, Some(8080)),
  928. (Some(([54, 165, 51, 142], 0).into()), None, None),
  929. ),
  930. // (None, None, Some), (None, None, Some)
  931. ((None, None, Some(2130)), (None, None, Some(22))),
  932. // (None, None, Some), (Some, Some, None)
  933. (
  934. (None, None, Some(443)),
  935. (
  936. Some(([13, 32, 210, 167], 65535).into()),
  937. Some([10, 0, 0, 1].into()),
  938. None,
  939. ),
  940. ),
  941. // (None, None, Some), (None, Some, Some)
  942. (
  943. (None, None, Some(8000)),
  944. (None, Some([8, 8, 8, 8].into()), Some(2130)),
  945. ),
  946. // (None, None, Some), (Some, None, Some)
  947. (
  948. (None, None, Some(8888)),
  949. (Some(([13, 32, 210, 19], 80).into()), None, Some(8000)),
  950. ),
  951. // (None, None, Some), (Some, Some, Some)
  952. (
  953. (None, None, Some(8000)),
  954. (
  955. Some(([104, 28, 11, 218], 7731).into()),
  956. Some([8, 8, 8, 8].into()),
  957. Some(2130),
  958. ),
  959. ),
  960. // (Some, Some, None), (Some, None, None)
  961. (
  962. (
  963. Some(([216, 58, 198, 177], 1234).into()),
  964. Some([1, 1, 1, 1].into()),
  965. None,
  966. ),
  967. (Some(([13, 32, 210, 19], 80).into()), None, None),
  968. ),
  969. // (Some, Some, None), (None, Some, None)
  970. (
  971. (
  972. Some(([54, 165, 51, 142], 0).into()),
  973. Some([127, 0, 0, 1].into()),
  974. None,
  975. ),
  976. (None, Some([172, 10, 0, 1].into()), None),
  977. ),
  978. // (Some, Some, None), (None, None, Some)
  979. (
  980. (
  981. Some(([104, 31, 86, 15], 53).into()),
  982. Some([192, 168, 0, 1].into()),
  983. None,
  984. ),
  985. (None, None, Some(8888)),
  986. ),
  987. // (Some, Some, None), (Some, Some, None)
  988. (
  989. (
  990. Some(([104, 131, 29, 33], 31111).into()),
  991. Some([172, 10, 0, 1].into()),
  992. None,
  993. ),
  994. (
  995. Some(([54, 165, 51, 142], 0).into()),
  996. Some([127, 0, 0, 1].into()),
  997. None,
  998. ),
  999. ),
  1000. // (Some, Some, None), (None, Some, Some)
  1001. (
  1002. (
  1003. Some(([13, 32, 210, 167], 65535).into()),
  1004. Some([10, 0, 0, 1].into()),
  1005. None,
  1006. ),
  1007. (None, Some([0, 0, 0, 0].into()), Some(443)),
  1008. ),
  1009. // (Some, Some, None), (Some, None, Some)
  1010. (
  1011. (
  1012. Some(([104, 28, 11, 218], 7731).into()),
  1013. Some([8, 8, 8, 8].into()),
  1014. None,
  1015. ),
  1016. (Some(([104, 31, 86, 15], 53).into()), None, Some(22)),
  1017. ),
  1018. // (Some, Some, None), (Some, Some, Some)
  1019. (
  1020. (
  1021. Some(([13, 32, 210, 248], 443).into()),
  1022. Some([0, 0, 0, 0].into()),
  1023. None,
  1024. ),
  1025. (
  1026. Some(([13, 32, 210, 167], 65535).into()),
  1027. Some([10, 0, 0, 1].into()),
  1028. Some(80),
  1029. ),
  1030. ),
  1031. // (None, Some, Some), (Some, None, None)
  1032. (
  1033. (None, Some([0, 0, 0, 0].into()), Some(8000)),
  1034. (Some(([104, 28, 11, 218], 7731).into()), None, None),
  1035. ),
  1036. // (None, Some, Some), (None, Some, None)
  1037. (
  1038. (None, Some([1, 1, 1, 1].into()), Some(8888)),
  1039. (None, Some([0, 0, 0, 0].into()), None),
  1040. ),
  1041. // (None, Some, Some), (None, None, Some)
  1042. (
  1043. (None, Some([0, 0, 0, 0].into()), Some(8000)),
  1044. (None, None, Some(2130)),
  1045. ),
  1046. // (None, Some, Some), (Some, Some, None)
  1047. (
  1048. (None, Some([1, 1, 1, 1].into()), Some(8888)),
  1049. (
  1050. Some(([13, 32, 210, 19], 80).into()),
  1051. Some([0, 0, 0, 0].into()),
  1052. None,
  1053. ),
  1054. ),
  1055. // (None, Some, Some), (None, Some, Some)
  1056. (
  1057. (None, Some([127, 0, 0, 1].into()), Some(0)),
  1058. (None, Some([172, 10, 0, 1].into()), Some(8080)),
  1059. ),
  1060. // (None, Some, Some), (Some, None, Some)
  1061. (
  1062. (None, Some([192, 168, 0, 1].into()), Some(22)),
  1063. (Some(([216, 58, 198, 177], 1234).into()), None, Some(8888)),
  1064. ),
  1065. // (None, Some, Some), (Some, Some, Some)
  1066. (
  1067. (None, Some([172, 10, 0, 1].into()), Some(8080)),
  1068. (
  1069. Some(([54, 165, 51, 142], 0).into()),
  1070. Some([127, 0, 0, 1].into()),
  1071. Some(0),
  1072. ),
  1073. ),
  1074. // (Some, None, Some), (Some, None, None)
  1075. (
  1076. (Some(([13, 32, 210, 167], 65535).into()), None, Some(80)),
  1077. (Some(([13, 32, 210, 248], 443).into()), None, None),
  1078. ),
  1079. // (Some, None, Some), (None, Some, None)
  1080. (
  1081. (Some(([104, 28, 11, 218], 7731).into()), None, Some(2130)),
  1082. (None, Some([192, 168, 0, 1].into()), None),
  1083. ),
  1084. // (Some, None, Some), (None, None, Some)
  1085. (
  1086. (Some(([13, 32, 210, 248], 443).into()), None, Some(443)),
  1087. (None, None, Some(80)),
  1088. ),
  1089. // (Some, None, Some), (Some, Some, None)
  1090. (
  1091. (Some(([13, 32, 210, 19], 80).into()), None, Some(8000)),
  1092. (
  1093. Some(([104, 28, 11, 218], 7731).into()),
  1094. Some([8, 8, 8, 8].into()),
  1095. None,
  1096. ),
  1097. ),
  1098. // (Some, None, Some), (None, Some, Some)
  1099. (
  1100. (Some(([216, 58, 198, 177], 1234).into()), None, Some(8888)),
  1101. (None, Some([0, 0, 0, 0].into()), Some(8000)),
  1102. ),
  1103. // (Some, None, Some), (Some, None, Some)
  1104. (
  1105. (Some(([13, 32, 210, 19], 80).into()), None, Some(8000)),
  1106. (Some(([104, 28, 11, 218], 7731).into()), None, Some(2130)),
  1107. ),
  1108. // (Some, None, Some), (Some, Some, Some)
  1109. (
  1110. (Some(([216, 58, 198, 177], 1234).into()), None, Some(8888)),
  1111. (
  1112. Some(([13, 32, 210, 19], 80).into()),
  1113. Some([0, 0, 0, 0].into()),
  1114. Some(8000),
  1115. ),
  1116. ),
  1117. // (Some, Some, Some), (Some, None, None)
  1118. (
  1119. (
  1120. Some(([54, 165, 51, 142], 0).into()),
  1121. Some([127, 0, 0, 1].into()),
  1122. Some(0),
  1123. ),
  1124. (Some(([104, 131, 29, 33], 31111).into()), None, None),
  1125. ),
  1126. // (Some, Some, Some), (None, Some, None)
  1127. (
  1128. (
  1129. Some(([104, 31, 86, 15], 53).into()),
  1130. Some([192, 168, 0, 1].into()),
  1131. Some(22),
  1132. ),
  1133. (None, Some([1, 1, 1, 1].into()), None),
  1134. ),
  1135. // (Some, Some, Some), (None, None, Some)
  1136. (
  1137. (
  1138. Some(([104, 131, 29, 33], 31111).into()),
  1139. Some([172, 10, 0, 1].into()),
  1140. Some(8080),
  1141. ),
  1142. (None, None, Some(0)),
  1143. ),
  1144. // (Some, Some, Some), (Some, Some, None)
  1145. (
  1146. (
  1147. Some(([13, 32, 210, 167], 65535).into()),
  1148. Some([10, 0, 0, 1].into()),
  1149. Some(80),
  1150. ),
  1151. (
  1152. Some(([13, 32, 210, 248], 443).into()),
  1153. Some([0, 0, 0, 0].into()),
  1154. None,
  1155. ),
  1156. ),
  1157. // (Some, Some, Some), (None, Some, Some)
  1158. (
  1159. (
  1160. Some(([104, 28, 11, 218], 7731).into()),
  1161. Some([8, 8, 8, 8].into()),
  1162. Some(2130),
  1163. ),
  1164. (None, Some([192, 168, 0, 1].into()), Some(22)),
  1165. ),
  1166. // (Some, Some, Some), (Some, None, Some)
  1167. (
  1168. (
  1169. Some(([13, 32, 210, 248], 443).into()),
  1170. Some([0, 0, 0, 0].into()),
  1171. Some(443),
  1172. ),
  1173. (Some(([13, 32, 210, 167], 65535).into()), None, Some(80)),
  1174. ),
  1175. // (Some, Some, Some), (Some, Some, Some)
  1176. (
  1177. (
  1178. Some(([13, 32, 210, 19], 80).into()),
  1179. Some([0, 0, 0, 0].into()),
  1180. Some(8000),
  1181. ),
  1182. (
  1183. Some(([104, 28, 11, 218], 7731).into()),
  1184. Some([8, 8, 8, 8].into()),
  1185. Some(2130),
  1186. ),
  1187. ),
  1188. ];
  1189.  
  1190. for &(
  1191. (arg_full_name, arg_ip, arg_port),
  1192. (config_file_full_name, config_file_ip, config_file_port),
  1193. ) in cases.iter()
  1194. {
  1195. let opt = Opt {
  1196. server_address: arg_full_name,
  1197. server_address_ip: arg_ip,
  1198. server_address_port: arg_port,
  1199. ..Default::default()
  1200. };
  1201.  
  1202. let config_file = ServerConfigFile {
  1203. address: config_file_full_name,
  1204. address_ip: config_file_ip,
  1205. address_port: config_file_port,
  1206. ..Default::default()
  1207. };
  1208.  
  1209. let expected = Err(ServerAddressError::ConflictingOptions {
  1210. address_in_arg: arg_full_name,
  1211. ip_in_arg: arg_ip,
  1212. port_in_arg: arg_port,
  1213. address_in_file: config_file_full_name,
  1214. ip_in_file: config_file_ip,
  1215. port_in_file: config_file_port,
  1216. });
  1217.  
  1218. let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
  1219.  
  1220. assert_eq!(expected, got);
  1221. }
  1222. }
  1223.  
  1224. #[test]
  1225. fn from_server_address_to_socket_addr() {
  1226. let cases = [
  1227. ([0, 0, 0, 0], 1224),
  1228. ([1, 1, 1, 1], 8888),
  1229. ([127, 0, 0, 1], 1),
  1230. ([13, 32, 210, 19], 80),
  1231. ([216, 58, 198, 177], 1234),
  1232. ([54, 165, 51, 142], 0),
  1233. ([104, 31, 86, 15], 53),
  1234. ([104, 131, 29, 33], 31111),
  1235. ([13, 32, 210, 167], 65535),
  1236. ([104, 28, 11, 218], 7731),
  1237. ([13, 32, 210, 248], 443),
  1238. ];
  1239.  
  1240. for &socket_addr in cases.iter() {
  1241. let socket_addr = socket_addr.into();
  1242.  
  1243. assert_eq!(socket_addr, SocketAddr::from(ServerAddress(socket_addr)));
  1244. assert_eq!(socket_addr, ServerAddress(socket_addr).into());
  1245. }
  1246. }
  1247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement