Unit-test for Statemine - send_xcm_transact_with_remark_with_event_works

This commit is contained in:
Branislav Kontur
2023-01-05 11:19:22 +01:00
parent a80781e83d
commit 0985898e45
6 changed files with 207 additions and 12 deletions
Generated
+8
View File
@@ -190,19 +190,27 @@ checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9"
name = "asset-test-utils"
version = "1.0.0"
dependencies = [
"cumulus-pallet-parachain-system",
"cumulus-primitives-core",
"cumulus-primitives-parachain-inherent",
"cumulus-test-relay-sproof-builder",
"frame-support",
"frame-system",
"hex-literal",
"pallet-balances",
"pallet-collator-selection",
"pallet-session",
"pallet-xcm",
"parachain-info",
"parachains-common",
"polkadot-parachain 0.9.31",
"sp-consensus-aura",
"sp-core",
"sp-io",
"sp-runtime",
"sp-std",
"substrate-wasm-builder",
"xcm",
]
[[package]]
@@ -91,7 +91,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
spec_name: create_runtime_str!("statemine"),
impl_name: create_runtime_str!("statemine"),
authoring_version: 1,
spec_version: 9300,
spec_version: 9301,
impl_version: 0,
apis: RUNTIME_API_VERSIONS,
transaction_version: 8,
@@ -1,4 +1,4 @@
use asset_test_utils::{ExtBuilder, RuntimeHelper};
use asset_test_utils::{mock_open_hrmp_channel, ExtBuilder, RuntimeHelper};
use frame_support::{
assert_noop, assert_ok,
traits::PalletInfo,
@@ -6,10 +6,11 @@ use frame_support::{
};
use parachains_common::{AccountId, AuraId};
pub use statemine_runtime::{
constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, Runtime,
SessionKeys, System, TrustBackedAssets,
constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit,
ParachainSystem, PolkadotXcm, Runtime, RuntimeEvent, RuntimeOrigin, SessionKeys, System,
TrustBackedAssets,
};
use xcm::latest::prelude::*;
use xcm::{latest::prelude::*, VersionedMultiLocation, VersionedXcm};
use xcm_executor::traits::WeightTrader;
pub const ALICE: [u8; 32] = [1u8; 32];
@@ -304,3 +305,62 @@ fn test_that_buying_ed_refund_does_not_refund() {
assert_eq!(Assets::total_supply(1), ExistentialDeposit::get());
});
}
#[test]
fn test_send_xcm_transact_with_remark_with_event_works() {
let runtime_para_id = 1015;
let bridge_hub_para_id = 1013;
ExtBuilder::<Runtime>::default()
.with_collators(vec![AccountId::from(ALICE)])
.with_session_keys(vec![(
AccountId::from(ALICE),
AccountId::from(ALICE),
SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) },
)])
.with_tracing()
.with_safe_xcm_version(3)
.with_para_id(runtime_para_id.into())
.build()
.execute_with(|| {
// open hrmp channel
mock_open_hrmp_channel::<Runtime, ParachainSystem>(
runtime_para_id.into(),
bridge_hub_para_id.into(),
);
// prepare xcm message with Transact
let message = Xcm(vec![ExportMessage {
network: Wococo,
destination: X1(Parachain(1000)),
xcm: Xcm(vec![Transact {
origin_kind: OriginKind::SovereignAccount,
require_weight_at_most: 1000000000,
call: vec![0, 8, 20, 104, 101, 108, 108, 111].into(),
}]),
}]);
// simulate send export_message to bridge-hub
assert_ok!(PolkadotXcm::send(
RuntimeOrigin::signed(AccountId::from(ALICE)),
Box::new(VersionedMultiLocation::V3(MultiLocation {
parents: 1,
interior: X1(Parachain(bridge_hub_para_id))
})),
Box::new(VersionedXcm::from(message.clone()))
));
// check xcm sent-like events occured
let events = System::events();
assert!(!events.is_empty());
assert!(System::events().iter().any(|r| matches!(
r.event,
RuntimeEvent::PolkadotXcm(pallet_xcm::Event::Sent(..))
)));
assert!(System::events().iter().any(|r| matches!(
r.event,
RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. })
)));
});
}
@@ -22,6 +22,16 @@ sp-core = { git = "https://github.com/paritytech/substrate", default-features =
# Cumulus
pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false }
parachains-common = { path = "../../../common", default-features = false }
cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false }
cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false }
cumulus-primitives-parachain-inherent = { path = "../../../../primitives/parachain-inherent", default-features = false }
cumulus-test-relay-sproof-builder = { path = "../../../../test/relay-sproof-builder", default-features = false }
parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false }
# Polkadot
xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" }
pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" }
polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" }
[dev-dependencies]
hex-literal = "0.3.4"
@@ -32,14 +42,22 @@ substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", bran
[features]
default = [ "std" ]
std = [
"cumulus-pallet-parachain-system/std",
"cumulus-primitives-core/std",
"cumulus-test-relay-sproof-builder/std",
"cumulus-primitives-parachain-inherent/std",
"frame-support/std",
"frame-system/std",
"pallet-balances/std",
"pallet-collator-selection/std",
"pallet-session/std",
"pallet-xcm/std",
"parachains-common/std",
"parachain-info/std",
"polkadot-parachain/std",
"sp-consensus-aura/std",
"sp-io/std",
"sp-runtime/std",
"sp-std/std",
"xcm/std",
]
@@ -1,11 +1,20 @@
use frame_support::traits::GenesisBuild;
use cumulus_primitives_core::{AbridgedHrmpChannel, ParaId, PersistedValidationData};
use cumulus_primitives_parachain_inherent::ParachainInherentData;
use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder;
use frame_support::{
dispatch::{RawOrigin, UnfilteredDispatchable},
inherent::{InherentData, ProvideInherent},
traits::GenesisBuild,
};
use sp_std::marker::PhantomData;
use frame_support::traits::OriginTrait;
use parachains_common::AccountId;
use polkadot_parachain::primitives::{HrmpChannelId, RelayChainBlockNumber};
use sp_consensus_aura::AURA_ENGINE_ID;
use sp_core::Encode;
use sp_runtime::{Digest, DigestItem};
use xcm::prelude::XcmVersion;
pub type BalanceOf<Runtime> = <Runtime as pallet_balances::Config>::Balance;
pub type AccountIdOf<Runtime> = <Runtime as frame_system::Config>::AccountId;
@@ -22,19 +31,39 @@ pub struct ExtBuilder<
collators: Vec<AccountIdOf<Runtime>>,
// keys added to pallet session
keys: Vec<(AccountIdOf<Runtime>, ValidatorIdOf<Runtime>, SessionKeysOf<Runtime>)>,
// safe xcm version for pallet_xcm
safe_xcm_version: Option<XcmVersion>,
// para id
para_id: Option<ParaId>,
_runtime: PhantomData<Runtime>,
}
impl<Runtime: frame_system::Config + pallet_balances::Config + pallet_session::Config> Default
for ExtBuilder<Runtime>
impl<
Runtime: frame_system::Config
+ pallet_balances::Config
+ pallet_session::Config
+ pallet_xcm::Config,
> Default for ExtBuilder<Runtime>
{
fn default() -> ExtBuilder<Runtime> {
ExtBuilder { balances: vec![], collators: vec![], keys: vec![], _runtime: PhantomData }
ExtBuilder {
balances: vec![],
collators: vec![],
keys: vec![],
safe_xcm_version: None,
para_id: None,
_runtime: PhantomData,
}
}
}
impl<Runtime: frame_system::Config + pallet_balances::Config + pallet_session::Config>
ExtBuilder<Runtime>
impl<
Runtime: frame_system::Config
+ pallet_balances::Config
+ pallet_session::Config
+ pallet_xcm::Config
+ parachain_info::Config,
> ExtBuilder<Runtime>
{
pub fn with_balances(
mut self,
@@ -61,6 +90,16 @@ impl<Runtime: frame_system::Config + pallet_balances::Config + pallet_session::C
self
}
pub fn with_safe_xcm_version(mut self, safe_xcm_version: XcmVersion) -> Self {
self.safe_xcm_version = Some(safe_xcm_version);
self
}
pub fn with_para_id(mut self, para_id: ParaId) -> Self {
self.para_id = Some(para_id);
self
}
pub fn build(self) -> sp_io::TestExternalities
where
Runtime:
@@ -69,6 +108,20 @@ impl<Runtime: frame_system::Config + pallet_balances::Config + pallet_session::C
{
let mut t = frame_system::GenesisConfig::default().build_storage::<Runtime>().unwrap();
<pallet_xcm::GenesisConfig as GenesisBuild<Runtime>>::assimilate_storage(
&pallet_xcm::GenesisConfig { safe_xcm_version: self.safe_xcm_version },
&mut t,
)
.unwrap();
if let Some(para_id) = self.para_id {
<parachain_info::GenesisConfig as frame_support::traits::GenesisBuild<Runtime>>::assimilate_storage(
&parachain_info::GenesisConfig { parachain_id: para_id },
&mut t,
)
.unwrap();
}
pallet_balances::GenesisConfig::<Runtime> { balances: self.balances.into() }
.assimilate_storage(&mut t)
.unwrap();
@@ -137,3 +190,59 @@ where
<Runtime as frame_system::Config>::RuntimeOrigin::signed(account_id.into())
}
}
/// Helper function which emulates opening HRMP channel which is needed for XcmpQueue xcm router to pass
pub fn mock_open_hrmp_channel<
C: cumulus_pallet_parachain_system::Config,
T: ProvideInherent<Call = cumulus_pallet_parachain_system::Call<C>>,
>(
sender: ParaId,
recipient: ParaId,
) {
let n = 1_u32;
let mut sproof_builder = RelayStateSproofBuilder::default();
sproof_builder.para_id = sender;
sproof_builder.hrmp_channels.insert(
HrmpChannelId { sender, recipient },
AbridgedHrmpChannel {
max_capacity: 10,
max_total_size: 10_000_000_u32,
max_message_size: 10_000_000_u32,
msg_count: 10,
total_size: 10_000_000_u32,
mqc_head: None,
},
);
sproof_builder.hrmp_egress_channel_index = Some(vec![recipient]);
let (relay_parent_storage_root, relay_chain_state) = sproof_builder.into_state_root_and_proof();
let vfp = PersistedValidationData {
relay_parent_number: n as RelayChainBlockNumber,
relay_parent_storage_root,
..Default::default()
};
// It is insufficient to push the validation function params
// to storage; they must also be included in the inherent data.
let inherent_data = {
let mut inherent_data = InherentData::default();
let system_inherent_data = ParachainInherentData {
validation_data: vfp.clone(),
relay_chain_state,
downward_messages: Default::default(),
horizontal_messages: Default::default(),
};
inherent_data
.put_data(
cumulus_primitives_parachain_inherent::INHERENT_IDENTIFIER,
&system_inherent_data,
)
.expect("failed to put VFP inherent");
inherent_data
};
// execute the block
T::create_inherent(&inherent_data)
.expect("got an inherent")
.dispatch_bypass_filter(RawOrigin::None.into())
.expect("dispatch succeeded");
}
@@ -87,7 +87,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
spec_name: create_runtime_str!("westmint"),
impl_name: create_runtime_str!("westmint"),
authoring_version: 1,
spec_version: 9300,
spec_version: 9301,
impl_version: 0,
apis: RUNTIME_API_VERSIONS,
transaction_version: 8,