--- a/runtime/common/mod.rs +++ b/runtime/common/mod.rs @@ -25,7 +25,7 @@ pub mod weights; #[cfg(test)] -mod tests; +pub mod tests; use sp_core::H160; use frame_support::traits::{Currency, OnUnbalanced, Imbalance}; --- a/runtime/common/tests/mod.rs +++ b/runtime/common/tests/mod.rs @@ -14,4 +14,35 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -mod xcm; +use sp_runtime::BuildStorage; +use sp_core::{Public, Pair}; +use sp_std::vec; +use up_common::types::AuraId; +use crate::{GenesisConfig, ParachainInfoConfig, AuraConfig}; + +pub mod xcm; + +fn get_from_seed(seed: &str) -> ::Public { + TPublic::Pair::from_string(&format!("//{}", seed), None) + .expect("static values are valid; qed") + .public() +} + +fn new_test_ext(para_id: u32) -> sp_io::TestExternalities { + let cfg = GenesisConfig { + aura: AuraConfig { + authorities: vec![ + get_from_seed::("Alice"), + get_from_seed::("Bob"), + ], + }, + parachain_info: ParachainInfoConfig { + parachain_id: para_id.into(), + }, + ..GenesisConfig::default() + }; + + cfg.build_storage() + .unwrap() + .into() +} --- a/runtime/common/tests/xcm.rs +++ b/runtime/common/tests/xcm.rs @@ -17,45 +17,31 @@ use xcm_executor::traits::ShouldExecute; use xcm::latest::prelude::*; use logtest::Logger; -use crate::{ - Call, - xcm_config::Barrier, -}; +use crate::Call; +use super::new_test_ext; -fn catch_xcm_barrier_log(logger: &mut Logger, expected_msg: &str) { +fn catch_xcm_barrier_log( + logger: &mut Logger, + expected_msg: &str +) -> Result<(), String> { for record in logger { if record.target() == "xcm::barrier" && record.args() == expected_msg { - return; + return Ok(()); } } - panic!("the expected XCM barrier log `{}` is not found", expected_msg); + Err(format!("the expected XCM barrier log `{}` is not found", expected_msg)) } -#[test] -fn xcm_barrier_denies_transact() { - // We have a `AllowTopLevelPaidExecutionFrom` barrier, - // so an XCM program should start from one of the following commands: - // * `WithdrawAsset` - // * `ReceiveTeleportedAsset` - // * `ReserveAssetDeposited` - // * `ClaimAsset` - // We use the `WithdrawAsset` in this test - +/// WARNING: Uses log capturing +/// See https://docs.rs/logtest/latest/logtest/index.html#constraints +pub fn barrier_denies_transact(logger: &mut Logger) { let location = MultiLocation { parents: 0, interior: Junctions::Here, }; - // let id = AssetId::Concrete(location.clone()); - // let fun = Fungibility::Fungible(42); - // let multiasset = MultiAsset { - // id, - // fun, - // }; - // let withdraw_inst = WithdrawAsset(multiasset.into()); - // We will never decode this "call", // so it is irrelevant what we are passing to the `transact` cmd. let fake_encoded_call = vec![0u8]; @@ -67,13 +53,11 @@ }; let mut xcm_program = Xcm::(vec![transact_inst]); - - let mut logger = Logger::start(); let max_weight = 100_000; - let mut weight_credit = 0; + let mut weight_credit = 100_000_000; - let result = Barrier::should_execute( + let result = B::should_execute( &location, &mut xcm_program, max_weight, @@ -82,5 +66,108 @@ assert!(result.is_err(), "the barrier should disallow the XCM transact cmd"); - catch_xcm_barrier_log(&mut logger, "transact XCM rejected"); + catch_xcm_barrier_log(logger, "transact XCM rejected").unwrap(); +} + +fn xcm_execute( + self_para_id: u32, + location: &MultiLocation, + xcm: &mut Xcm +) -> Result<(), ()> { + new_test_ext(self_para_id).execute_with(|| { + let max_weight = 100_000; + let mut weight_credit = 100_000_000; + + B::should_execute( + &location, + xcm, + max_weight, + &mut weight_credit + ) + }) +} + +fn make_multiassets(location: &MultiLocation) -> MultiAssets { + let id = AssetId::Concrete(location.clone()); + let fun = Fungibility::Fungible(42); + let multiasset = MultiAsset { + id, + fun, + }; + + multiasset.into() +} + +fn make_transfer_reserve_asset(location: &MultiLocation) -> Xcm { + let assets = make_multiassets(location); + let inst = TransferReserveAsset { + assets, + dest: location.clone(), + xcm: Xcm(vec![]), + }; + + Xcm::(vec![inst]) +} + +fn make_deposit_reserve_asset(location: &MultiLocation) -> Xcm { + let assets = make_multiassets(location); + let inst = DepositReserveAsset { + assets: assets.into(), + max_assets: 42, + dest: location.clone(), + xcm: Xcm(vec![]), + }; + + Xcm::(vec![inst]) +} + +fn expect_transfer_location_denied( + logger: &mut Logger, + self_para_id: u32, + location: &MultiLocation, + xcm: &mut Xcm +) -> Result<(), String> { + let result = xcm_execute::(self_para_id, location, xcm); + + if result.is_ok() { + return Err("the barrier should deny the unknown location".into()); + } + + catch_xcm_barrier_log(logger, "Unexpected deposit or transfer location") +} + +/// WARNING: Uses log capturing +/// See https://docs.rs/logtest/latest/logtest/index.html#constraints +pub fn barrier_denies_transfer_from_unknown_location( + logger: &mut Logger, + self_para_id: u32, +) -> Result<(), String> +where + B: ShouldExecute +{ + const UNKNOWN_PARACHAIN_ID: u32 = 4057; + + let unknown_location = MultiLocation { + parents: 1, + interior: X1(Parachain(UNKNOWN_PARACHAIN_ID)), + }; + + let mut transfer_reserve_asset = make_transfer_reserve_asset(&unknown_location); + let mut deposit_reserve_asset = make_deposit_reserve_asset(&unknown_location); + + expect_transfer_location_denied::( + logger, + self_para_id, + &unknown_location, + &mut transfer_reserve_asset + )?; + + expect_transfer_location_denied::( + logger, + self_para_id, + &unknown_location, + &mut deposit_reserve_asset + )?; + + Ok(()) } --- a/runtime/opal/src/lib.rs +++ b/runtime/opal/src/lib.rs @@ -37,6 +37,9 @@ pub mod xcm_config; +#[cfg(test)] +mod tests; + pub use runtime_common::*; pub const RUNTIME_NAME: &str = "opal"; --- /dev/null +++ b/runtime/opal/src/tests/logcapture.rs @@ -0,0 +1,25 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +use logtest::Logger; +use super::xcm::opal_xcm_tests; + +#[test] +fn opal_log_capture_tests() { + let mut logger = Logger::start(); + + opal_xcm_tests(&mut logger); +} --- /dev/null +++ b/runtime/opal/src/tests/mod.rs @@ -0,0 +1,18 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +mod xcm; +mod logcapture; --- /dev/null +++ b/runtime/opal/src/tests/xcm.rs @@ -0,0 +1,32 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +use logtest::Logger; +use crate::{ + runtime_common::tests::xcm::*, + xcm_config::Barrier, +}; + +const OPAL_PARA_ID: u32 = 2095; // Same as Quartz + +pub fn opal_xcm_tests(logger: &mut Logger) { + barrier_denies_transact::(logger); + + barrier_denies_transfer_from_unknown_location::( + logger, + OPAL_PARA_ID, + ).expect_err("opal runtime allows any location"); +} --- a/runtime/quartz/src/lib.rs +++ b/runtime/quartz/src/lib.rs @@ -37,6 +37,9 @@ pub mod xcm_config; +#[cfg(test)] +mod tests; + pub use runtime_common::*; pub const RUNTIME_NAME: &str = "quartz"; --- /dev/null +++ b/runtime/quartz/src/tests/logcapture.rs @@ -0,0 +1,25 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +use logtest::Logger; +use super::xcm::quartz_xcm_tests; + +#[test] +fn quartz_log_capture_tests() { + let mut logger = Logger::start(); + + quartz_xcm_tests(&mut logger); +} --- /dev/null +++ b/runtime/quartz/src/tests/mod.rs @@ -0,0 +1,18 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +mod xcm; +mod logcapture; --- /dev/null +++ b/runtime/quartz/src/tests/xcm.rs @@ -0,0 +1,32 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +use logtest::Logger; +use crate::{ + runtime_common::tests::xcm::*, + xcm_config::Barrier, +}; + +const QUARTZ_PARA_ID: u32 = 2095; + +pub fn quartz_xcm_tests(logger: &mut Logger) { + barrier_denies_transact::(logger); + + barrier_denies_transfer_from_unknown_location::( + logger, + QUARTZ_PARA_ID, + ).expect("quartz runtime denies an unknown location"); +} --- a/runtime/unique/src/lib.rs +++ b/runtime/unique/src/lib.rs @@ -37,6 +37,9 @@ pub mod xcm_config; +#[cfg(test)] +mod tests; + pub use runtime_common::*; pub const RUNTIME_NAME: &str = "unique"; --- /dev/null +++ b/runtime/unique/src/tests/logcapture.rs @@ -0,0 +1,25 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +use logtest::Logger; +use super::xcm::unique_xcm_tests; + +#[test] +fn unique_log_capture_tests() { + let mut logger = Logger::start(); + + unique_xcm_tests(&mut logger); +} --- /dev/null +++ b/runtime/unique/src/tests/mod.rs @@ -0,0 +1,18 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +mod xcm; +mod logcapture; --- /dev/null +++ b/runtime/unique/src/tests/xcm.rs @@ -0,0 +1,32 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +use logtest::Logger; +use crate::{ + runtime_common::tests::xcm::*, + xcm_config::Barrier, +}; + +const UNIQUE_PARA_ID: u32 = 2037; + +pub fn unique_xcm_tests(logger: &mut Logger) { + barrier_denies_transact::(logger); + + barrier_denies_transfer_from_unknown_location::( + logger, + UNIQUE_PARA_ID, + ).expect("unique runtime denies an unknown location"); +}