216 lines
7.4 KiB
Rust
216 lines
7.4 KiB
Rust
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// This file is part of Substrate.
|
|
|
|
// Substrate 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.
|
|
|
|
// Substrate 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 Substrate. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
//! Tests for the Zagros Runtime Configuration
|
|
|
|
use std::collections::HashSet;
|
|
|
|
use crate::{xcm_config::LocationConverter, *};
|
|
use frame_support::traits::WhitelistedStorageKeys;
|
|
use sp_core::{crypto::Ss58Codec, hexdisplay::HexDisplay};
|
|
use sp_keyring::Sr25519Keyring::Alice;
|
|
use xcm_runtime_apis::conversions::LocationToAccountHelper;
|
|
|
|
#[test]
|
|
fn remove_keys_weight_is_sensible() {
|
|
use pezkuwi_runtime_common::crowdloan::WeightInfo;
|
|
let max_weight = <Runtime as crowdloan::Config>::WeightInfo::refund(RemoveKeysLimit::get());
|
|
// Max remove keys limit should be no more than half the total block weight.
|
|
assert!((max_weight * 2).all_lt(BlockWeights::get().max_block));
|
|
}
|
|
|
|
#[test]
|
|
fn sample_size_is_sensible() {
|
|
use pezkuwi_runtime_common::auctions::WeightInfo;
|
|
// Need to clean up all samples at the end of an auction.
|
|
let samples: BlockNumber = EndingPeriod::get() / SampleLength::get();
|
|
let max_weight: frame_support::weights::Weight =
|
|
RocksDbWeight::get().reads_writes(samples.into(), samples.into());
|
|
// Max sample cleanup should be no more than half the total block weight.
|
|
assert!((max_weight * 2).all_lt(BlockWeights::get().max_block));
|
|
assert!((<Runtime as auctions::Config>::WeightInfo::on_initialize() * 2)
|
|
.all_lt(BlockWeights::get().max_block));
|
|
}
|
|
|
|
#[test]
|
|
fn call_size() {
|
|
RuntimeCall::assert_size_under(256);
|
|
}
|
|
|
|
#[test]
|
|
fn sanity_check_teleport_assets_weight() {
|
|
// This test sanity checks that at least 50 teleports can exist in a block.
|
|
// Usually when XCM runs into an issue, it will return a weight of `Weight::MAX`,
|
|
// so this test will certainly ensure that this problem does not occur.
|
|
use frame_support::dispatch::GetDispatchInfo;
|
|
let weight = pallet_xcm::Call::<Runtime>::limited_teleport_assets {
|
|
dest: Box::new(Here.into()),
|
|
beneficiary: Box::new(Here.into()),
|
|
assets: Box::new((Here, 200_000).into()),
|
|
fee_asset_id: Box::new(Here.into()),
|
|
weight_limit: Unlimited,
|
|
}
|
|
.get_dispatch_info()
|
|
.call_weight;
|
|
|
|
assert!((weight * 50).all_lt(BlockWeights::get().max_block));
|
|
}
|
|
|
|
#[test]
|
|
fn check_whitelist() {
|
|
let whitelist: HashSet<String> = AllPalletsWithSystem::whitelisted_storage_keys()
|
|
.iter()
|
|
.map(|e| HexDisplay::from(&e.key).to_string())
|
|
.collect();
|
|
|
|
// Block number
|
|
assert!(whitelist.contains("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac"));
|
|
// Total issuance
|
|
assert!(whitelist.contains("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80"));
|
|
// Execution phase
|
|
assert!(whitelist.contains("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a"));
|
|
// Event count
|
|
assert!(whitelist.contains("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850"));
|
|
// System events
|
|
assert!(whitelist.contains("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7"));
|
|
// Configuration ActiveConfig
|
|
assert!(whitelist.contains("06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385"));
|
|
// XcmPallet VersionDiscoveryQueue
|
|
assert!(whitelist.contains("1405f2411d0af5a7ff397e7c9dc68d194a222ba0333561192e474c59ed8e30e1"));
|
|
// XcmPallet SafeXcmVersion
|
|
assert!(whitelist.contains("1405f2411d0af5a7ff397e7c9dc68d196323ae84c43568be0d1394d5d0d522c4"));
|
|
}
|
|
|
|
#[test]
|
|
fn check_treasury_pallet_id() {
|
|
assert_eq!(
|
|
<Treasury as frame_support::traits::PalletInfoAccess>::index() as u8,
|
|
pallet_staking_async_rc_runtime_constants::TREASURY_PALLET_ID
|
|
);
|
|
}
|
|
|
|
#[cfg(all(test, feature = "try-runtime"))]
|
|
mod remote_tests {
|
|
use super::*;
|
|
use frame_try_runtime::{runtime_decl_for_try_runtime::TryRuntime, UpgradeCheckSelect};
|
|
use remote_externalities::{
|
|
Builder, Mode, OfflineConfig, OnlineConfig, SnapshotConfig, Transport,
|
|
};
|
|
use std::env::var;
|
|
|
|
#[tokio::test]
|
|
async fn run_migrations() {
|
|
if var("RUN_MIGRATION_TESTS").is_err() {
|
|
return;
|
|
}
|
|
|
|
sp_tracing::try_init_simple();
|
|
let transport: Transport =
|
|
var("WS").unwrap_or("wss://zagros-rpc.pezkuwichain.io:443".to_string()).into();
|
|
let maybe_state_snapshot: Option<SnapshotConfig> = var("SNAP").map(|s| s.into()).ok();
|
|
let mut ext = Builder::<Block>::default()
|
|
.mode(if let Some(state_snapshot) = maybe_state_snapshot {
|
|
Mode::OfflineOrElseOnline(
|
|
OfflineConfig { state_snapshot: state_snapshot.clone() },
|
|
OnlineConfig {
|
|
transport,
|
|
state_snapshot: Some(state_snapshot),
|
|
..Default::default()
|
|
},
|
|
)
|
|
} else {
|
|
Mode::Online(OnlineConfig { transport, ..Default::default() })
|
|
})
|
|
.build()
|
|
.await
|
|
.unwrap();
|
|
ext.execute_with(|| Runtime::on_runtime_upgrade(UpgradeCheckSelect::PreAndPost));
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn location_conversion_works() {
|
|
// the purpose of hardcoded values is to catch an unintended location conversion logic change.
|
|
struct TestCase {
|
|
description: &'static str,
|
|
location: Location,
|
|
expected_account_id_str: &'static str,
|
|
}
|
|
|
|
let test_cases = vec![
|
|
// DescribeTerminus
|
|
TestCase {
|
|
description: "DescribeTerminus Child",
|
|
location: Location::new(0, [Teyrchain(1111)]),
|
|
expected_account_id_str: "5Ec4AhP4h37t7TFsAZ4HhFq6k92usAAJDUC3ADSZ4H4Acru3",
|
|
},
|
|
// DescribePalletTerminal
|
|
TestCase {
|
|
description: "DescribePalletTerminal Child",
|
|
location: Location::new(0, [Teyrchain(1111), PalletInstance(50)]),
|
|
expected_account_id_str: "5FjEBrKn3STAFsZpQF4jzwxUYHNGnNgzdZqSQfTzeJ82XKp6",
|
|
},
|
|
// DescribeAccountId32Terminal
|
|
TestCase {
|
|
description: "DescribeAccountId32Terminal Child",
|
|
location: Location::new(
|
|
0,
|
|
[Teyrchain(1111), AccountId32 { network: None, id: AccountId::from(Alice).into() }],
|
|
),
|
|
expected_account_id_str: "5EEMro9RRDpne4jn9TuD7cTB6Amv1raVZ3xspSkqb2BF3FJH",
|
|
},
|
|
// DescribeAccountKey20Terminal
|
|
TestCase {
|
|
description: "DescribeAccountKey20Terminal Child",
|
|
location: Location::new(
|
|
0,
|
|
[Teyrchain(1111), AccountKey20 { network: None, key: [0u8; 20] }],
|
|
),
|
|
expected_account_id_str: "5HohjXdjs6afcYcgHHSstkrtGfxgfGKsnZ1jtewBpFiGu4DL",
|
|
},
|
|
// DescribeTreasuryVoiceTerminal
|
|
TestCase {
|
|
description: "DescribeTreasuryVoiceTerminal Child",
|
|
location: Location::new(
|
|
0,
|
|
[Teyrchain(1111), Plurality { id: BodyId::Treasury, part: BodyPart::Voice }],
|
|
),
|
|
expected_account_id_str: "5GenE4vJgHvwYVcD6b4nBvH5HNY4pzpVHWoqwFpNMFT7a2oX",
|
|
},
|
|
// DescribeBodyTerminal
|
|
TestCase {
|
|
description: "DescribeBodyTerminal Child",
|
|
location: Location::new(
|
|
0,
|
|
[Teyrchain(1111), Plurality { id: BodyId::Unit, part: BodyPart::Voice }],
|
|
),
|
|
expected_account_id_str: "5DPgGBFTTYm1dGbtB1VWHJ3T3ScvdrskGGx6vSJZNP1WNStV",
|
|
},
|
|
];
|
|
|
|
for tc in test_cases {
|
|
let expected =
|
|
AccountId::from_string(tc.expected_account_id_str).expect("Invalid AccountId string");
|
|
|
|
let got = LocationToAccountHelper::<AccountId, LocationConverter>::convert_location(
|
|
tc.location.into(),
|
|
)
|
|
.unwrap();
|
|
|
|
assert_eq!(got, expected, "{}", tc.description);
|
|
}
|
|
}
|