Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::net::{IpAddr, SocketAddr};
- // internal dependencies
- use crate::config::opt::Opt;
- use crate::config::ServerConfigFile;
- use crate::DEFAULT_SERVER_IP_ADDRESS;
- // external dependencies
- use failure::Fail;
- #[derive(Debug, Fail, PartialEq, Eq)]
- pub enum ServerAddressError {
- #[fail(
- display = "found conflicting options provided in command line arguments or/and \
- environmental variables (address: {:?}, address_ip: {:?}, \
- address_port: {:?}), you can set server address by providing value \
- \"address\" (ie. \"127.0.0.1:8000\") or values \"address_ip\" \
- (ie. \"127.0.0.1\") and \"address_port\" (ie. \"8000\") together, \
- but not both configurations at the same time",
- _0, _1, _2
- )]
- ConflictingOptionsInArguments(Option<SocketAddr>, Option<IpAddr>, Option<u16>),
- #[fail(
- display = "found conflicting options, don't know which to choose - in config file: \
- (\"address\": {:?}, \"address_ip\": {:?}, \"address_port\": {:?}) \
- and in command line arguments or/and environmental variables: \
- (\"address\": {:?}, \"address_ip\": {:?}, \"address_port\": {:?})",
- address_in_file, ip_in_file, port_in_file, address_in_arg, ip_in_arg, port_in_arg
- )]
- ConflictingOptions {
- address_in_file: Option<SocketAddr>,
- ip_in_file: Option<IpAddr>,
- port_in_file: Option<u16>,
- address_in_arg: Option<SocketAddr>,
- ip_in_arg: Option<IpAddr>,
- port_in_arg: Option<u16>,
- },
- }
- #[derive(Debug, PartialEq, Eq)]
- pub struct ServerAddress(SocketAddr);
- impl Default for ServerAddress {
- fn default() -> Self {
- Self(
- DEFAULT_SERVER_IP_ADDRESS
- .parse()
- .unwrap_or_else(|_| ([0, 0, 0, 0], 8000).into()),
- )
- }
- }
- impl ServerAddress {
- fn with_port(mut self, port: u16) -> Self {
- self.0.set_port(port);
- self
- }
- fn with_ip(mut self, ip: IpAddr) -> Self {
- self.0.set_ip(ip);
- self
- }
- // todo: add cases when ports/ips are the same, even if they are set in multiple places
- pub fn from_opt(opt: &Opt) -> Result<Self, ServerAddressError> {
- match (
- opt.server_address,
- opt.server_address_ip,
- opt.server_address_port,
- ) {
- // full socket address
- (Some(address), None, None) => Ok(Self(address)),
- // ip and port separately
- (None, Some(ip), Some(port)) => Ok(Self(SocketAddr::new(ip, port))),
- // no information about socket address - use default
- (None, None, None) => Ok(Default::default()),
- // only ip provided - use port from default
- (None, Some(ip), None) => Ok(Self::default().with_ip(ip)),
- // only port provided - use ip from default
- (None, None, Some(port)) => Ok(Self::default().with_port(port)),
- // everything else is considered as conflicting options:
- // - full_address + ip + port
- // - full_address + ip
- // - full_address + port
- (address, ip, port) => Err(ServerAddressError::ConflictingOptionsInArguments(
- address, ip, port,
- )),
- }
- }
- pub fn from_opt_with_config_file(
- opt: &Opt,
- config_file: &ServerConfigFile,
- ) -> Result<Self, ServerAddressError> {
- let address = match (
- config_file.address,
- config_file.address_ip,
- config_file.address_port,
- opt.server_address,
- opt.server_address_ip,
- opt.server_address_port,
- ) {
- // full address
- (Some(address), None, None, None, None, None)
- | (None, None, None, Some(address), None, None) => Self(address),
- // ip and port separately
- (None, Some(ip), Some(port), None, None, None)
- | (None, None, None, None, Some(ip), Some(port))
- | (None, Some(ip), None, None, None, Some(port))
- | (None, None, Some(port), None, Some(ip), None) => Self(SocketAddr::new(ip, port)),
- // only ip provided - use default port
- (None, Some(ip), None, None, None, None) | (None, None, None, None, Some(ip), None) => {
- ServerAddress::default().with_ip(ip)
- }
- // only port provided - use default ip
- (None, None, Some(port), None, None, None)
- | (None, None, None, None, None, Some(port)) => {
- ServerAddress::default().with_port(port)
- }
- // no address-related options, use default
- (None, None, None, None, None, None) => ServerAddress::default(),
- // conflicting options
- (
- address_file,
- address_ip_file,
- address_port_file,
- address_arg,
- address_ip_arg,
- address_port_arg,
- ) => {
- return Err(ServerAddressError::ConflictingOptions {
- address_in_file: address_file,
- ip_in_file: address_ip_file,
- port_in_file: address_port_file,
- address_in_arg: address_arg,
- ip_in_arg: address_ip_arg,
- port_in_arg: address_port_arg,
- });
- }
- };
- Ok(address)
- }
- }
- impl From<ServerAddress> for SocketAddr {
- fn from(server_address: ServerAddress) -> Self {
- server_address.0
- }
- }
- /*
- Yes, I know this is madness, but I was writing the tests to de-stress :-)
- */
- #[cfg(test)]
- mod tests {
- use super::*;
- // ServerAddress::from_opt
- // Ok
- // (Some, None, None)
- #[test]
- fn from_opt_when_correct_full_address_provided() {
- let cases = [
- ([0, 0, 0, 0], 8000),
- ([1, 1, 1, 1], 8888),
- ([127, 0, 0, 1], 0),
- ([192, 168, 0, 1], 22),
- ([172, 10, 0, 1], 8080),
- ([10, 0, 0, 1], 80),
- ([8, 8, 8, 8], 2130),
- ([0, 0, 0, 0], 443),
- ];
- for &full_address in cases.iter() {
- let full_address = full_address.into();
- let opt = Opt {
- server_address: Some(full_address),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(full_address));
- let got = ServerAddress::from_opt(&opt);
- assert_eq!(expected, got);
- }
- }
- // (None, Some, Some)
- #[test]
- fn from_opt_when_correct_ip_and_port_provided() {
- let cases = [
- ([0, 0, 0, 0], 8000),
- ([1, 1, 1, 1], 8888),
- ([127, 0, 0, 1], 0),
- ([192, 168, 0, 1], 22),
- ([172, 10, 0, 1], 8080),
- ([10, 0, 0, 1], 80),
- ([8, 8, 8, 8], 2130),
- ([0, 0, 0, 0], 443),
- ];
- for &(ip, port) in cases.iter() {
- let ip = ip.into();
- let opt = Opt {
- server_address_ip: Some(ip),
- server_address_port: Some(port),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(SocketAddr::new(ip, port)));
- let got = ServerAddress::from_opt(&opt);
- assert_eq!(expected, got);
- }
- }
- // (None, Some, None)
- #[test]
- fn from_opt_when_correct_ip_provided() {
- let cases = [
- [0, 0, 0, 0],
- [1, 1, 1, 1],
- [127, 0, 0, 1],
- [192, 168, 0, 1],
- [172, 10, 0, 1],
- [10, 0, 0, 1],
- [8, 8, 8, 8],
- [0, 0, 0, 0],
- ];
- let default_port = ServerAddress::default().0.port();
- for &ip in cases.iter() {
- let ip = ip.into();
- let opt = Opt {
- server_address_ip: Some(ip),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(SocketAddr::new(ip, default_port)));
- let got = ServerAddress::from_opt(&opt);
- assert_eq!(expected, got);
- }
- }
- // (None, None, Some)
- #[test]
- fn from_opt_when_correct_port_provided() {
- let cases = [8000, 8888, 0, 22, 8080, 80, 2130, 443];
- let default_ip = ServerAddress::default().0.ip();
- for &port in cases.iter() {
- let opt = Opt {
- server_address_port: Some(port),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(SocketAddr::new(default_ip, port)));
- let got = ServerAddress::from_opt(&opt);
- assert_eq!(expected, got);
- }
- }
- // Err
- // (Some, Some, Some)
- #[test]
- fn from_opt_when_full_address_and_ip_and_port_provided() {
- let cases = [
- (([13, 32, 210, 19], 80), [0, 0, 0, 0], 8000),
- (([216, 58, 198, 177], 1234), [1, 1, 1, 1], 8888),
- (([54, 165, 51, 142], 0), [127, 0, 0, 1], 0),
- (([104, 31, 86, 15], 53), [192, 168, 0, 1], 22),
- (([104, 131, 29, 33], 31111), [172, 10, 0, 1], 8080),
- (([13, 32, 210, 167], 65535), [10, 0, 0, 1], 80),
- (([104, 28, 11, 218], 7731), [8, 8, 8, 8], 2130),
- (([13, 32, 210, 248], 443), [0, 0, 0, 0], 443),
- ];
- for &(full_address, ip, port) in cases.iter() {
- let some_full_address = Some(full_address.into());
- let some_ip = Some(ip.into());
- let some_port = Some(port);
- let opt = Opt {
- server_address: some_full_address,
- server_address_ip: some_ip,
- server_address_port: some_port,
- ..Default::default()
- };
- let expected = Err(ServerAddressError::ConflictingOptionsInArguments(
- some_full_address,
- some_ip,
- some_port,
- ));
- let got = ServerAddress::from_opt(&opt);
- assert_eq!(expected, got);
- }
- }
- // (Some, Some, None)
- #[test]
- fn from_opt_when_full_address_and_ip_provided() {
- let cases = [
- (([13, 32, 210, 19], 80), [0, 0, 0, 0]),
- (([216, 58, 198, 177], 1234), [1, 1, 1, 1]),
- (([54, 165, 51, 142], 0), [127, 0, 0, 1]),
- (([104, 31, 86, 15], 53), [192, 168, 0, 1]),
- (([104, 131, 29, 33], 31111), [172, 10, 0, 1]),
- (([13, 32, 210, 167], 65535), [10, 0, 0, 1]),
- (([104, 28, 11, 218], 7731), [8, 8, 8, 8]),
- (([13, 32, 210, 248], 443), [0, 0, 0, 0]),
- ];
- for &(full_address, ip) in cases.iter() {
- let some_full_address = Some(full_address.into());
- let some_ip = Some(ip.into());
- let opt = Opt {
- server_address: some_full_address,
- server_address_ip: some_ip,
- ..Default::default()
- };
- let expected = Err(ServerAddressError::ConflictingOptionsInArguments(
- some_full_address,
- some_ip,
- None,
- ));
- let got = ServerAddress::from_opt(&opt);
- assert_eq!(expected, got);
- }
- }
- // (Some, None, Some)
- #[test]
- fn from_opt_when_full_address_and_port_provided() {
- let cases = [
- (([13, 32, 210, 19], 80), 8000),
- (([216, 58, 198, 177], 1234), 8888),
- (([54, 165, 51, 142], 0), 0),
- (([104, 31, 86, 15], 53), 22),
- (([104, 131, 29, 33], 31111), 8080),
- (([13, 32, 210, 167], 65535), 80),
- (([104, 28, 11, 218], 7731), 2130),
- (([13, 32, 210, 248], 443), 443),
- ];
- for &(full_address, port) in cases.iter() {
- let some_full_address = Some(full_address.into());
- let some_port = Some(port);
- let opt = Opt {
- server_address: some_full_address,
- server_address_port: some_port,
- ..Default::default()
- };
- let expected = Err(ServerAddressError::ConflictingOptionsInArguments(
- some_full_address,
- None,
- some_port,
- ));
- let got = ServerAddress::from_opt(&opt);
- assert_eq!(expected, got);
- }
- }
- // ServerAddress::from_opt_with_config_file
- // Ok
- // (Some, None, None), (None, None, None)
- #[test]
- fn from_opt_with_config_file_when_correct_full_address_in_arg_provided() {
- let cases = [
- ([0, 0, 0, 0], 8000),
- ([1, 1, 1, 1], 8888),
- ([127, 0, 0, 1], 0),
- ([192, 168, 0, 1], 22),
- ([172, 10, 0, 1], 8080),
- ([10, 0, 0, 1], 80),
- ([8, 8, 8, 8], 2130),
- ([0, 0, 0, 0], 443),
- ];
- let config_file = ServerConfigFile::default();
- for &full_address in cases.iter() {
- let full_address = full_address.into();
- let opt = Opt {
- server_address: Some(full_address),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(full_address));
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // (None, Some, Some), (None, None, None)
- #[test]
- fn from_opt_with_config_file_when_correct_ip_and_port_in_arg_provided() {
- let cases = [
- ([0, 0, 0, 0], 8000),
- ([1, 1, 1, 1], 8888),
- ([127, 0, 0, 1], 0),
- ([192, 168, 0, 1], 22),
- ([172, 10, 0, 1], 8080),
- ([10, 0, 0, 1], 80),
- ([8, 8, 8, 8], 2130),
- ([0, 0, 0, 0], 443),
- ];
- let config_file = ServerConfigFile::default();
- for &(ip, port) in cases.iter() {
- let ip = ip.into();
- let opt = Opt {
- server_address_ip: Some(ip),
- server_address_port: Some(port),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(SocketAddr::new(ip, port)));
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // (None, Some, None), (None, None, None)
- #[test]
- fn from_opt_with_config_file_when_correct_ip_in_arg_provided() {
- let cases = [
- [0, 0, 0, 0],
- [1, 1, 1, 1],
- [127, 0, 0, 1],
- [192, 168, 0, 1],
- [172, 10, 0, 1],
- [10, 0, 0, 1],
- [8, 8, 8, 8],
- [0, 0, 0, 0],
- ];
- let config_file = ServerConfigFile::default();
- let default_port = ServerAddress::default().0.port();
- for &ip in cases.iter() {
- let ip = ip.into();
- let opt = Opt {
- server_address_ip: Some(ip),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(SocketAddr::new(ip, default_port)));
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // (None, None, Some), (None, None, None)
- #[test]
- fn from_opt_with_config_file_when_correct_port_in_arg_provided() {
- let cases = [8000, 8888, 0, 22, 8080, 80, 2130, 443];
- let config_file = ServerConfigFile::default();
- let default_ip = ServerAddress::default().0.ip();
- for &port in cases.iter() {
- let opt = Opt {
- server_address_port: Some(port),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(SocketAddr::new(default_ip, port)));
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // (None, None, None), (Some, None, None)
- #[test]
- fn from_opt_with_config_file_when_correct_full_address_in_config_file_provided() {
- let cases = [
- ([0, 0, 0, 0], 8000),
- ([1, 1, 1, 1], 8888),
- ([127, 0, 0, 1], 0),
- ([192, 168, 0, 1], 22),
- ([172, 10, 0, 1], 8080),
- ([10, 0, 0, 1], 80),
- ([8, 8, 8, 8], 2130),
- ([0, 0, 0, 0], 443),
- ];
- let opt = Opt::default();
- for &full_address in cases.iter() {
- let full_address = full_address.into();
- let config_file = ServerConfigFile {
- address: Some(full_address),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(full_address));
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // (None, None, None), (None, Some, Some)
- #[test]
- fn from_opt_with_config_file_when_correct_ip_and_port_in_config_file_provided() {
- let cases = [
- ([0, 0, 0, 0].into(), 8000),
- ([1, 1, 1, 1].into(), 8888),
- ([127, 0, 0, 1].into(), 0),
- ([192, 168, 0, 1].into(), 22),
- ([172, 10, 0, 1].into(), 8080),
- ([10, 0, 0, 1].into(), 80),
- ([8, 8, 8, 8].into(), 2130),
- ([0, 0, 0, 0].into(), 443),
- ];
- let opt = Opt::default();
- for &(ip, port) in cases.iter() {
- let config_file = ServerConfigFile {
- address_ip: Some(ip),
- address_port: Some(port),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(SocketAddr::new(ip, port)));
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // (None, None, None), (None, Some, None)
- #[test]
- fn from_opt_with_config_file_when_correct_ip_in_config_file_provided() {
- let cases = [
- [0, 0, 0, 0],
- [1, 1, 1, 1],
- [127, 0, 0, 1],
- [192, 168, 0, 1],
- [172, 10, 0, 1],
- [10, 0, 0, 1],
- [8, 8, 8, 8],
- [0, 0, 0, 0],
- ];
- let opt = Opt::default();
- let default_port = ServerAddress::default().0.port();
- for &ip in cases.iter() {
- let ip = ip.into();
- let config_file = ServerConfigFile {
- address_ip: Some(ip),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(SocketAddr::new(ip, default_port)));
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // (None, None, None), (None, None, Some)
- #[test]
- fn from_opt_with_config_file_when_correct_port_in_config_file_provided() {
- let cases = [8000, 8888, 0, 22, 8080, 80, 2130, 443];
- let default_ip = ServerAddress::default().0.ip();
- let opt = Opt::default();
- for &port in cases.iter() {
- let config_file = ServerConfigFile {
- address_port: Some(port),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(SocketAddr::new(default_ip, port)));
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // (None, Some, None), (None, None, Some)
- #[test]
- fn from_opt_with_config_file_when_correct_ip_in_arg_and_port_in_config_file_provided() {
- let cases = [
- ([0, 0, 0, 0], 8000),
- ([1, 1, 1, 1], 8888),
- ([127, 0, 0, 1], 0),
- ([192, 168, 0, 1], 22),
- ([172, 10, 0, 1], 8080),
- ([10, 0, 0, 1], 80),
- ([8, 8, 8, 8], 2130),
- ([0, 0, 0, 0], 443),
- ];
- for &(ip, port) in cases.iter() {
- let ip = ip.into();
- let opt = Opt {
- server_address_ip: Some(ip),
- ..Default::default()
- };
- let config_file = ServerConfigFile {
- address_port: Some(port),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(SocketAddr::new(ip, port)));
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // (None, None, Some), (None, Some, None)
- #[test]
- fn from_opt_with_config_file_when_correct_ip_in_config_file_and_port_in_arg_provided() {
- let cases = [
- ([0, 0, 0, 0], 8000),
- ([1, 1, 1, 1], 8888),
- ([127, 0, 0, 1], 0),
- ([192, 168, 0, 1], 22),
- ([172, 10, 0, 1], 8080),
- ([10, 0, 0, 1], 80),
- ([8, 8, 8, 8], 2130),
- ([0, 0, 0, 0], 443),
- ];
- for &(ip, port) in cases.iter() {
- let ip = ip.into();
- let opt = Opt {
- server_address_port: Some(port),
- ..Default::default()
- };
- let config_file = ServerConfigFile {
- address_ip: Some(ip),
- ..Default::default()
- };
- let expected = Ok(ServerAddress(SocketAddr::new(ip, port)));
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // Err
- // (Some, Some, Some), (Some, Some, Some)
- #[test]
- fn from_opt_with_config_file_when_full_address_and_ip_and_port_provided_in_arg_and_config_file()
- {
- let arg_cases = [
- (([13, 32, 210, 19], 80), [0, 0, 0, 0], 8000),
- (([216, 58, 198, 177], 1234), [1, 1, 1, 1], 8888),
- (([54, 165, 51, 142], 0), [127, 0, 0, 1], 0),
- (([104, 31, 86, 15], 53), [192, 168, 0, 1], 22),
- (([104, 131, 29, 33], 31111), [172, 10, 0, 1], 8080),
- (([13, 32, 210, 167], 65535), [10, 0, 0, 1], 80),
- (([104, 28, 11, 218], 7731), [8, 8, 8, 8], 2130),
- (([13, 32, 210, 248], 443), [0, 0, 0, 0], 443),
- ];
- let config_file_cases = [
- (([104, 28, 11, 218], 7731), [8, 8, 8, 8], 2130),
- (([13, 32, 210, 19], 80), [0, 0, 0, 0], 8000),
- (([104, 131, 29, 33], 31111), [172, 10, 0, 1], 8080),
- (([216, 58, 198, 177], 1234), [1, 1, 1, 1], 8888),
- (([54, 165, 51, 142], 0), [127, 0, 0, 1], 0),
- (([13, 32, 210, 248], 443), [0, 0, 0, 0], 443),
- (([104, 31, 86, 15], 53), [192, 168, 0, 1], 22),
- (([13, 32, 210, 167], 65535), [10, 0, 0, 1], 80),
- ];
- for (
- &(arg_full_address, arg_ip, arg_port),
- &(config_file_full_address, config_file_ip, config_file_port),
- ) in arg_cases.iter().zip(config_file_cases.iter())
- {
- let some_arg_full_address = Some(arg_full_address.into());
- let some_arg_ip = Some(arg_ip.into());
- let some_arg_port = Some(arg_port);
- let some_config_file_full_address = Some(config_file_full_address.into());
- let some_config_file_ip = Some(config_file_ip.into());
- let some_config_file_port = Some(config_file_port);
- let opt = Opt {
- server_address: some_arg_full_address,
- server_address_ip: some_arg_ip,
- server_address_port: some_arg_port,
- ..Default::default()
- };
- let config_file = ServerConfigFile {
- address: some_config_file_full_address,
- address_ip: some_config_file_ip,
- address_port: some_config_file_port,
- ..Default::default()
- };
- let expected = Err(ServerAddressError::ConflictingOptions {
- address_in_arg: some_arg_full_address,
- ip_in_arg: some_arg_ip,
- port_in_arg: some_arg_port,
- address_in_file: some_config_file_full_address,
- ip_in_file: some_config_file_ip,
- port_in_file: some_config_file_port,
- });
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // (Some, None, None), (Some, None, None)
- #[test]
- fn from_opt_with_config_file_when_full_address_provided_in_arg_and_config_file() {
- let arg_cases = [
- ([13, 32, 210, 19], 80),
- ([216, 58, 198, 177], 1234),
- ([54, 165, 51, 142], 0),
- ([104, 31, 86, 15], 53),
- ([104, 131, 29, 33], 31111),
- ([13, 32, 210, 167], 65535),
- ([104, 28, 11, 218], 7731),
- ([13, 32, 210, 248], 443),
- ];
- let config_file_cases = [
- ([104, 28, 11, 218], 7731),
- ([13, 32, 210, 19], 80),
- ([104, 131, 29, 33], 31111),
- ([216, 58, 198, 177], 1234),
- ([54, 165, 51, 142], 0),
- ([13, 32, 210, 248], 443),
- ([104, 31, 86, 15], 53),
- ([13, 32, 210, 167], 65535),
- ];
- for (&arg_full_address, &config_file_full_address) in
- arg_cases.iter().zip(config_file_cases.iter())
- {
- let some_arg_full_address = Some(arg_full_address.into());
- let some_config_file_full_address = Some(config_file_full_address.into());
- let opt = Opt {
- server_address: some_arg_full_address,
- ..Default::default()
- };
- let config_file = ServerConfigFile {
- address: some_config_file_full_address,
- ..Default::default()
- };
- let expected = Err(ServerAddressError::ConflictingOptions {
- address_in_arg: some_arg_full_address,
- ip_in_arg: None,
- port_in_arg: None,
- address_in_file: some_config_file_full_address,
- ip_in_file: None,
- port_in_file: None,
- });
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // (Some, None, None), (None, Some, None)
- #[test]
- fn from_opt_with_config_file_when_full_address_provided_in_arg_and_ip_in_config_file() {
- let cases = [
- (([13, 32, 210, 19], 80), [104, 28, 11, 218]),
- (([216, 58, 198, 177], 1234), [13, 32, 210, 19]),
- (([54, 165, 51, 142], 0), [104, 131, 29, 33]),
- (([104, 31, 86, 15], 53), [216, 58, 198, 177]),
- (([104, 131, 29, 33], 31111), [54, 165, 51, 142]),
- (([13, 32, 210, 167], 65535), [13, 32, 210, 248]),
- (([104, 28, 11, 218], 7731), [104, 31, 86, 15]),
- (([13, 32, 210, 248], 443), [13, 32, 210, 167]),
- ];
- for &(arg_full_address, config_file_ip) in cases.iter() {
- let some_arg_full_address = Some(arg_full_address.into());
- let some_config_file_ip = Some(config_file_ip.into());
- let opt = Opt {
- server_address: some_arg_full_address,
- ..Default::default()
- };
- let config_file = ServerConfigFile {
- address_ip: some_config_file_ip,
- ..Default::default()
- };
- let expected = Err(ServerAddressError::ConflictingOptions {
- address_in_arg: some_arg_full_address,
- ip_in_arg: None,
- port_in_arg: None,
- address_in_file: None,
- ip_in_file: some_config_file_ip,
- port_in_file: None,
- });
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- // Some of the cases are duplicated here in reference to the tests above
- #[test]
- fn from_opt_with_config_wile_conflicting_options() {
- let cases = [
- // (Some, None, None), (Some, None, None)
- (
- (Some(([13, 32, 210, 19], 80).into()), None, None),
- (Some(([104, 28, 11, 218], 7731).into()), None, None),
- ),
- // (Some, None, None), (None, Some, None)
- (
- (Some(([216, 58, 198, 177], 1234).into()), None, None),
- (None, Some([0, 0, 0, 0].into()), None),
- ),
- // (Some, None, None), (None, None, Some)
- (
- (Some(([54, 165, 51, 142], 0).into()), None, None),
- (None, None, Some(8080)),
- ),
- // (Some, None, None), (Some, Some, None)
- (
- (Some(([104, 31, 86, 15], 53).into()), None, None),
- (
- Some(([216, 58, 198, 177], 1234).into()),
- Some([1, 1, 1, 1].into()),
- None,
- ),
- ),
- // (Some, None, None), (None, Some, Some)
- (
- (Some(([104, 131, 29, 33], 31111).into()), None, None),
- (None, Some([127, 0, 0, 1].into()), Some(0)),
- ),
- // (Some, None, None), (Some, None, Some)
- (
- (Some(([13, 32, 210, 167], 65535).into()), None, None),
- (Some(([13, 32, 210, 248], 443).into()), None, Some(443)),
- ),
- // (Some, None, None), (Some, Some, Some)
- (
- (Some(([104, 28, 11, 218], 7731).into()), None, None),
- (
- Some(([104, 31, 86, 15], 53).into()),
- Some([192, 168, 0, 1].into()),
- Some(22),
- ),
- ),
- // (None, Some, None), (Some, None, None)
- (
- (None, Some([0, 0, 0, 0].into()), None),
- (Some(([13, 32, 210, 167], 65535).into()), None, None),
- ),
- // (None, Some, None), (None, Some, None)
- (
- (None, Some([0, 0, 0, 0].into()), None),
- (None, Some([8, 8, 8, 8].into()), None),
- ),
- // (None, Some, None), (Some, Some, None)
- (
- (None, Some([0, 0, 0, 0].into()), None),
- (
- Some(([104, 28, 11, 218], 7731).into()),
- Some([8, 8, 8, 8].into()),
- None,
- ),
- ),
- // (None, Some, None), (None, Some, Some)
- (
- (None, Some([1, 1, 1, 1].into()), None),
- (None, Some([0, 0, 0, 0].into()), Some(000)),
- ),
- // (None, Some, None), (Some, None, Some)
- (
- (None, Some([127, 0, 0, 1].into()), None),
- (Some(([104, 131, 29, 33], 31111).into()), None, Some(8080)),
- ),
- // (None, Some, None), (Some, Some, Some)
- (
- (None, Some([192, 168, 0, 1].into()), None),
- (
- Some(([216, 58, 198, 177], 1234).into()),
- Some([1, 1, 1, 1].into()),
- Some(8888),
- ),
- ),
- // (None, None, Some), (Some, None, None)
- (
- (None, None, Some(8080)),
- (Some(([54, 165, 51, 142], 0).into()), None, None),
- ),
- // (None, None, Some), (None, None, Some)
- ((None, None, Some(2130)), (None, None, Some(22))),
- // (None, None, Some), (Some, Some, None)
- (
- (None, None, Some(443)),
- (
- Some(([13, 32, 210, 167], 65535).into()),
- Some([10, 0, 0, 1].into()),
- None,
- ),
- ),
- // (None, None, Some), (None, Some, Some)
- (
- (None, None, Some(8000)),
- (None, Some([8, 8, 8, 8].into()), Some(2130)),
- ),
- // (None, None, Some), (Some, None, Some)
- (
- (None, None, Some(8888)),
- (Some(([13, 32, 210, 19], 80).into()), None, Some(8000)),
- ),
- // (None, None, Some), (Some, Some, Some)
- (
- (None, None, Some(8000)),
- (
- Some(([104, 28, 11, 218], 7731).into()),
- Some([8, 8, 8, 8].into()),
- Some(2130),
- ),
- ),
- // (Some, Some, None), (Some, None, None)
- (
- (
- Some(([216, 58, 198, 177], 1234).into()),
- Some([1, 1, 1, 1].into()),
- None,
- ),
- (Some(([13, 32, 210, 19], 80).into()), None, None),
- ),
- // (Some, Some, None), (None, Some, None)
- (
- (
- Some(([54, 165, 51, 142], 0).into()),
- Some([127, 0, 0, 1].into()),
- None,
- ),
- (None, Some([172, 10, 0, 1].into()), None),
- ),
- // (Some, Some, None), (None, None, Some)
- (
- (
- Some(([104, 31, 86, 15], 53).into()),
- Some([192, 168, 0, 1].into()),
- None,
- ),
- (None, None, Some(8888)),
- ),
- // (Some, Some, None), (Some, Some, None)
- (
- (
- Some(([104, 131, 29, 33], 31111).into()),
- Some([172, 10, 0, 1].into()),
- None,
- ),
- (
- Some(([54, 165, 51, 142], 0).into()),
- Some([127, 0, 0, 1].into()),
- None,
- ),
- ),
- // (Some, Some, None), (None, Some, Some)
- (
- (
- Some(([13, 32, 210, 167], 65535).into()),
- Some([10, 0, 0, 1].into()),
- None,
- ),
- (None, Some([0, 0, 0, 0].into()), Some(443)),
- ),
- // (Some, Some, None), (Some, None, Some)
- (
- (
- Some(([104, 28, 11, 218], 7731).into()),
- Some([8, 8, 8, 8].into()),
- None,
- ),
- (Some(([104, 31, 86, 15], 53).into()), None, Some(22)),
- ),
- // (Some, Some, None), (Some, Some, Some)
- (
- (
- Some(([13, 32, 210, 248], 443).into()),
- Some([0, 0, 0, 0].into()),
- None,
- ),
- (
- Some(([13, 32, 210, 167], 65535).into()),
- Some([10, 0, 0, 1].into()),
- Some(80),
- ),
- ),
- // (None, Some, Some), (Some, None, None)
- (
- (None, Some([0, 0, 0, 0].into()), Some(8000)),
- (Some(([104, 28, 11, 218], 7731).into()), None, None),
- ),
- // (None, Some, Some), (None, Some, None)
- (
- (None, Some([1, 1, 1, 1].into()), Some(8888)),
- (None, Some([0, 0, 0, 0].into()), None),
- ),
- // (None, Some, Some), (None, None, Some)
- (
- (None, Some([0, 0, 0, 0].into()), Some(8000)),
- (None, None, Some(2130)),
- ),
- // (None, Some, Some), (Some, Some, None)
- (
- (None, Some([1, 1, 1, 1].into()), Some(8888)),
- (
- Some(([13, 32, 210, 19], 80).into()),
- Some([0, 0, 0, 0].into()),
- None,
- ),
- ),
- // (None, Some, Some), (None, Some, Some)
- (
- (None, Some([127, 0, 0, 1].into()), Some(0)),
- (None, Some([172, 10, 0, 1].into()), Some(8080)),
- ),
- // (None, Some, Some), (Some, None, Some)
- (
- (None, Some([192, 168, 0, 1].into()), Some(22)),
- (Some(([216, 58, 198, 177], 1234).into()), None, Some(8888)),
- ),
- // (None, Some, Some), (Some, Some, Some)
- (
- (None, Some([172, 10, 0, 1].into()), Some(8080)),
- (
- Some(([54, 165, 51, 142], 0).into()),
- Some([127, 0, 0, 1].into()),
- Some(0),
- ),
- ),
- // (Some, None, Some), (Some, None, None)
- (
- (Some(([13, 32, 210, 167], 65535).into()), None, Some(80)),
- (Some(([13, 32, 210, 248], 443).into()), None, None),
- ),
- // (Some, None, Some), (None, Some, None)
- (
- (Some(([104, 28, 11, 218], 7731).into()), None, Some(2130)),
- (None, Some([192, 168, 0, 1].into()), None),
- ),
- // (Some, None, Some), (None, None, Some)
- (
- (Some(([13, 32, 210, 248], 443).into()), None, Some(443)),
- (None, None, Some(80)),
- ),
- // (Some, None, Some), (Some, Some, None)
- (
- (Some(([13, 32, 210, 19], 80).into()), None, Some(8000)),
- (
- Some(([104, 28, 11, 218], 7731).into()),
- Some([8, 8, 8, 8].into()),
- None,
- ),
- ),
- // (Some, None, Some), (None, Some, Some)
- (
- (Some(([216, 58, 198, 177], 1234).into()), None, Some(8888)),
- (None, Some([0, 0, 0, 0].into()), Some(8000)),
- ),
- // (Some, None, Some), (Some, None, Some)
- (
- (Some(([13, 32, 210, 19], 80).into()), None, Some(8000)),
- (Some(([104, 28, 11, 218], 7731).into()), None, Some(2130)),
- ),
- // (Some, None, Some), (Some, Some, Some)
- (
- (Some(([216, 58, 198, 177], 1234).into()), None, Some(8888)),
- (
- Some(([13, 32, 210, 19], 80).into()),
- Some([0, 0, 0, 0].into()),
- Some(8000),
- ),
- ),
- // (Some, Some, Some), (Some, None, None)
- (
- (
- Some(([54, 165, 51, 142], 0).into()),
- Some([127, 0, 0, 1].into()),
- Some(0),
- ),
- (Some(([104, 131, 29, 33], 31111).into()), None, None),
- ),
- // (Some, Some, Some), (None, Some, None)
- (
- (
- Some(([104, 31, 86, 15], 53).into()),
- Some([192, 168, 0, 1].into()),
- Some(22),
- ),
- (None, Some([1, 1, 1, 1].into()), None),
- ),
- // (Some, Some, Some), (None, None, Some)
- (
- (
- Some(([104, 131, 29, 33], 31111).into()),
- Some([172, 10, 0, 1].into()),
- Some(8080),
- ),
- (None, None, Some(0)),
- ),
- // (Some, Some, Some), (Some, Some, None)
- (
- (
- Some(([13, 32, 210, 167], 65535).into()),
- Some([10, 0, 0, 1].into()),
- Some(80),
- ),
- (
- Some(([13, 32, 210, 248], 443).into()),
- Some([0, 0, 0, 0].into()),
- None,
- ),
- ),
- // (Some, Some, Some), (None, Some, Some)
- (
- (
- Some(([104, 28, 11, 218], 7731).into()),
- Some([8, 8, 8, 8].into()),
- Some(2130),
- ),
- (None, Some([192, 168, 0, 1].into()), Some(22)),
- ),
- // (Some, Some, Some), (Some, None, Some)
- (
- (
- Some(([13, 32, 210, 248], 443).into()),
- Some([0, 0, 0, 0].into()),
- Some(443),
- ),
- (Some(([13, 32, 210, 167], 65535).into()), None, Some(80)),
- ),
- // (Some, Some, Some), (Some, Some, Some)
- (
- (
- Some(([13, 32, 210, 19], 80).into()),
- Some([0, 0, 0, 0].into()),
- Some(8000),
- ),
- (
- Some(([104, 28, 11, 218], 7731).into()),
- Some([8, 8, 8, 8].into()),
- Some(2130),
- ),
- ),
- ];
- for &(
- (arg_full_name, arg_ip, arg_port),
- (config_file_full_name, config_file_ip, config_file_port),
- ) in cases.iter()
- {
- let opt = Opt {
- server_address: arg_full_name,
- server_address_ip: arg_ip,
- server_address_port: arg_port,
- ..Default::default()
- };
- let config_file = ServerConfigFile {
- address: config_file_full_name,
- address_ip: config_file_ip,
- address_port: config_file_port,
- ..Default::default()
- };
- let expected = Err(ServerAddressError::ConflictingOptions {
- address_in_arg: arg_full_name,
- ip_in_arg: arg_ip,
- port_in_arg: arg_port,
- address_in_file: config_file_full_name,
- ip_in_file: config_file_ip,
- port_in_file: config_file_port,
- });
- let got = ServerAddress::from_opt_with_config_file(&opt, &config_file);
- assert_eq!(expected, got);
- }
- }
- #[test]
- fn from_server_address_to_socket_addr() {
- let cases = [
- ([0, 0, 0, 0], 1224),
- ([1, 1, 1, 1], 8888),
- ([127, 0, 0, 1], 1),
- ([13, 32, 210, 19], 80),
- ([216, 58, 198, 177], 1234),
- ([54, 165, 51, 142], 0),
- ([104, 31, 86, 15], 53),
- ([104, 131, 29, 33], 31111),
- ([13, 32, 210, 167], 65535),
- ([104, 28, 11, 218], 7731),
- ([13, 32, 210, 248], 443),
- ];
- for &socket_addr in cases.iter() {
- let socket_addr = socket_addr.into();
- assert_eq!(socket_addr, SocketAddr::from(ServerAddress(socket_addr)));
- assert_eq!(socket_addr, ServerAddress(socket_addr).into());
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement