diff --git a/crates/configuration/src/parachain.rs b/crates/configuration/src/parachain.rs index cb4a4c2d7065d4619c1db459483b7d26a625c9fa..d90eebc970281b1d0068e07b15b748489822f5ba 100644 --- a/crates/configuration/src/parachain.rs +++ b/crates/configuration/src/parachain.rs @@ -384,7 +384,7 @@ mod tests { use super::*; #[test] - fn parachain_config_builder_should_build_a_new_parachain_config_correctly() { + fn parachain_config_builder_should_succeeds_and_returns_a_new_parachain_config() { let parachain_config = ParachainConfigBuilder::new() .with_id(1000) .with_collator(|collator1| { @@ -461,4 +461,202 @@ mod tests { bootnodes_addresses.iter().collect::<Vec<_>>() ); } + + #[test] + fn parachain_config_builder_should_fails_and_returns_a_para_id_and_an_error_if_first_collator_is_invalid( + ) { + let (para_id, errors) = ParachainConfigBuilder::new() + .with_id(1000) + .with_collator(|collator| { + collator + .with_name("collator") + .with_command("invalid command") + }) + .build() + .unwrap_err(); + + assert_eq!(para_id, 14321); + assert_eq!(errors.len(), 1); + assert_eq!( + errors.get(0).unwrap().to_string(), + "collators['collator'].command: 'invalid command' shouldn't contains whitespace" + ); + } + + #[test] + fn parachain_config_builder_with_at_least_one_collator_should_fails_and_returns_a_para_id_and_an_error_if_chain_is_invalid( + ) { + let (para_id, errors) = ParachainConfigBuilder::new() + .with_id(1000) + .with_collator(|collator| { + collator + .with_name("collator") + .with_command("command") + .validator(true) + }) + .with_chain("invalid chain") + .build() + .unwrap_err(); + + assert_eq!(para_id, 5425); + assert_eq!(errors.len(), 1); + assert_eq!( + errors.get(0).unwrap().to_string(), + "chain: 'invalid chain' shouldn't contains whitespace" + ); + } + + #[test] + fn parachain_config_builder_with_at_least_one_collator_should_fails_and_returns_a_para_id_and_an_error_if_genesis_wasm_generator_is_invalid( + ) { + let (para_id, errors) = ParachainConfigBuilder::new() + .with_id(1000) + .with_collator(|collator| { + collator + .with_name("collator") + .with_command("command") + .validator(true) + }) + .with_genesis_wasm_generator("invalid command") + .build() + .unwrap_err(); + + assert_eq!(para_id, 1234); + assert_eq!(errors.len(), 1); + assert_eq!( + errors.get(0).unwrap().to_string(), + "genesis_wasm_generator: 'invalid command' shouldn't contains whitespace" + ); + } + + #[test] + fn parachain_config_builder_with_at_least_one_collator_should_fails_and_returns_a_para_id_and_an_error_if_genesis_state_generator_is_invalid( + ) { + let (para_id, errors) = ParachainConfigBuilder::new() + .with_id(1000) + .with_collator(|collator| { + collator + .with_name("collator") + .with_command("command") + .validator(true) + }) + .with_genesis_state_generator("invalid command") + .build() + .unwrap_err(); + + assert_eq!(para_id, 12345); + assert_eq!(errors.len(), 1); + assert_eq!( + errors.get(0).unwrap().to_string(), + "genesis_state_generator: 'invalid command' shouldn't contains whitespace" + ); + } + + #[test] + fn parachain_config_builder_with_at_least_one_collator_should_fails_and_returns_a_para_id_and_an_error_if_bootnodes_addresses_are_invalid( + ) { + let (para_id, errors) = ParachainConfigBuilder::new() + .with_id(2000) + .with_collator(|collator| { + collator + .with_name("collator") + .with_command("command") + .validator(true) + }) + .with_bootnodes_addresses(vec!["/ip4//tcp/45421", "//10.42.153.10/tcp/43111"]) + .build() + .unwrap_err(); + + assert_eq!(para_id, 2000); + assert_eq!(errors.len(), 2); + assert_eq!( + errors.get(0).unwrap().to_string(), + "bootnodes_addresses[0]: '/ip4//tcp/45421' failed to parse: invalid IPv4 address syntax" + ); + assert_eq!( + errors.get(1).unwrap().to_string(), + "bootnodes_addresses[1]: '//10.42.153.10/tcp/43111' unknown protocol string: " + ); + } + + #[test] + fn parachain_config_builder_with_at_least_one_collator_should_fails_and_returns_a_para_id_and_an_error_if_second_collator_is_invalid( + ) { + let (para_id, errors) = ParachainConfigBuilder::new() + .with_id(2000) + .with_collator(|collator1| { + collator1 + .with_name("collator1") + .with_command("command1") + .invulnerable(true) + .bootnode(true) + }) + .with_collator(|collator2| { + collator2 + .with_name("collator2") + .with_command("invalid command") + .with_initial_balance(20000000) + }) + .build() + .unwrap_err(); + + assert_eq!(para_id, 2000); + assert_eq!(errors.len(), 1); + assert_eq!( + errors.get(0).unwrap().to_string(), + "collators['collator2'].command: 'invalid command' shouldn't contains whitespace" + ); + } + + #[test] + fn parachain_config_builder_should_fails_and_returns_a_para_id_and_multiple_errors_if_multiple_fields_are_invalid( + ) { + let (para_id, errors) = ParachainConfigBuilder::new() + .with_id(2000) + .with_collator(|collator1| { + collator1 + .with_name("collator1") + .with_command("invalid command") + .invulnerable(true) + .bootnode(true) + .with_resources(|resources| { + resources + .with_limit_cpu("invalid") + .with_request_memory("1G") + }) + }) + .with_collator(|collator2| { + collator2 + .with_name("collator2") + .with_command("command2") + .with_image("invalid.image") + .with_initial_balance(20000000) + }) + .with_bootnodes_addresses(vec!["/ip4//tcp/45421", "//10.42.153.10/tcp/43111"]) + .build() + .unwrap_err(); + + assert_eq!(para_id, 2000); + assert_eq!(errors.len(), 5); + assert_eq!( + errors.get(0).unwrap().to_string(), + "collators['collator1'].command: 'invalid command' shouldn't contains whitespace" + ); + assert_eq!( + errors.get(1).unwrap().to_string(), + r"collators['collator1'].resources.limit_cpu: 'invalid' doesn't match regex '^\d+(.\d+)?(m|K|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$'", + ); + assert_eq!( + errors.get(2).unwrap().to_string(), + "collators['collator2'].image: 'invalid.image' doesn't match regex '^([ip]|[hostname]/)?[tag_name]:[tag_version]?$'" + ); + assert_eq!( + errors.get(3).unwrap().to_string(), + "bootnodes_addresses[0]: '/ip4//tcp/45421' failed to parse: invalid IPv4 address syntax" + ); + assert_eq!( + errors.get(4).unwrap().to_string(), + "bootnodes_addresses[1]: '//10.42.153.10/tcp/43111' unknown protocol string: " + ); + } }