From bcdad301d8549a6a983f4351cb273ba4e31d825b Mon Sep 17 00:00:00 2001 From: l0r1s <contact@lorismoulin.com> Date: Fri, 14 Jul 2023 18:38:05 +0100 Subject: [PATCH] feat: update ValidationError::PortAlreadyUsed message and added NodeConfigBuilder tests for port validation --- crates/configuration/src/shared/errors.rs | 2 +- crates/configuration/src/shared/node.rs | 84 +++++++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/crates/configuration/src/shared/errors.rs b/crates/configuration/src/shared/errors.rs index 0ff10fd..27c02f8 100644 --- a/crates/configuration/src/shared/errors.rs +++ b/crates/configuration/src/shared/errors.rs @@ -96,6 +96,6 @@ pub enum ConversionError { /// A validation error for shared types across fields. #[derive(thiserror::Error, Debug, Clone)] pub enum ValidationError { - #[error("'{0}' is already used")] + #[error("'{0}' is already used across config")] PortAlreadyUsed(Port), } diff --git a/crates/configuration/src/shared/node.rs b/crates/configuration/src/shared/node.rs index 70fa330..158340e 100644 --- a/crates/configuration/src/shared/node.rs +++ b/crates/configuration/src/shared/node.rs @@ -760,4 +760,88 @@ mod tests { r"resources.request_memory: 'invalid' doesn't match regex '^\d+(.\d+)?(m|K|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$'" ); } + + #[test] + fn node_config_builder_should_fails_and_returns_an_error_and_node_name_if_ws_port_is_already_used( + ) { + let validation_context = Rc::new(RefCell::new(ValidationContext { + used_ports: vec![30333], + })); + let (node_name, errors) = + NodeConfigBuilder::new(ChainDefaultContext::default(), validation_context) + .with_name("node") + .with_ws_port(30333) + .build() + .unwrap_err(); + + assert_eq!(node_name, "node"); + assert_eq!(errors.len(), 1); + assert_eq!( + errors.get(0).unwrap().to_string(), + "ws_port: '30333' is already used across config" + ); + } + + #[test] + fn node_config_builder_should_fails_and_returns_an_error_and_node_name_if_rpc_port_is_already_used( + ) { + let validation_context = Rc::new(RefCell::new(ValidationContext { + used_ports: vec![4444], + })); + let (node_name, errors) = + NodeConfigBuilder::new(ChainDefaultContext::default(), validation_context) + .with_name("node") + .with_rpc_port(4444) + .build() + .unwrap_err(); + + assert_eq!(node_name, "node"); + assert_eq!(errors.len(), 1); + assert_eq!( + errors.get(0).unwrap().to_string(), + "rpc_port: '4444' is already used across config" + ); + } + + #[test] + fn node_config_builder_should_fails_and_returns_an_error_and_node_name_if_prometheus_port_is_already_used( + ) { + let validation_context = Rc::new(RefCell::new(ValidationContext { + used_ports: vec![9089], + })); + let (node_name, errors) = + NodeConfigBuilder::new(ChainDefaultContext::default(), validation_context) + .with_name("node") + .with_prometheus_port(9089) + .build() + .unwrap_err(); + + assert_eq!(node_name, "node"); + assert_eq!(errors.len(), 1); + assert_eq!( + errors.get(0).unwrap().to_string(), + "prometheus_port: '9089' is already used across config" + ); + } + + #[test] + fn node_config_builder_should_fails_and_returns_and_error_and_node_name_if_p2p_port_is_already_used( + ) { + let validation_context = Rc::new(RefCell::new(ValidationContext { + used_ports: vec![45093], + })); + let (node_name, errors) = + NodeConfigBuilder::new(ChainDefaultContext::default(), validation_context) + .with_name("node") + .with_p2p_port(45093) + .build() + .unwrap_err(); + + assert_eq!(node_name, "node"); + assert_eq!(errors.len(), 1); + assert_eq!( + errors.get(0).unwrap().to_string(), + "p2p_port: '45093' is already used across config" + ); + } } -- GitLab