mod.rs 33.6 KiB
Newer Older

#[test]
fn get_and_wrap_version_works() {
	new_test_ext_with_balances_and_xcm_version(vec![], None).execute_with(|| {
		let remote_a: MultiLocation = Parachain(1000).into();
		let remote_b: MultiLocation = Parachain(1001).into();
		let remote_c: MultiLocation = Parachain(1002).into();

		// no `safe_xcm_version` version at `GenesisConfig`
		assert_eq!(XcmPallet::get_version_for(&remote_a), None);
		assert_eq!(XcmPallet::get_version_for(&remote_b), None);
		assert_eq!(XcmPallet::get_version_for(&remote_c), None);
		assert_eq!(VersionDiscoveryQueue::<Test>::get().into_inner(), vec![]);

		// set default XCM version (a.k.a. `safe_xcm_version`)
		assert_ok!(XcmPallet::force_default_xcm_version(RuntimeOrigin::root(), Some(1)));
		assert_eq!(XcmPallet::get_version_for(&remote_a), None);
		assert_eq!(XcmPallet::get_version_for(&remote_b), None);
		assert_eq!(XcmPallet::get_version_for(&remote_c), None);
		assert_eq!(VersionDiscoveryQueue::<Test>::get().into_inner(), vec![]);

		// set XCM version only for `remote_a`
		assert_ok!(XcmPallet::force_xcm_version(
			RuntimeOrigin::root(),
			Box::new(remote_a),
			XCM_VERSION
		));
		assert_eq!(XcmPallet::get_version_for(&remote_a), Some(XCM_VERSION));
		assert_eq!(XcmPallet::get_version_for(&remote_b), None);
		assert_eq!(XcmPallet::get_version_for(&remote_c), None);
		assert_eq!(VersionDiscoveryQueue::<Test>::get().into_inner(), vec![]);

		let xcm = Xcm::<()>::default();

		// wrap version - works because remote_a has `XCM_VERSION`
		assert_eq!(
			XcmPallet::wrap_version(&remote_a, xcm.clone()),
			Ok(VersionedXcm::from(xcm.clone()))
		);
		// does not work because remote_b has unknown version and default is set to 1, and
		// `XCM_VERSION` cannot be wrapped to the `1`
		assert_eq!(XcmPallet::wrap_version(&remote_b, xcm.clone()), Err(()));
		assert_eq!(VersionDiscoveryQueue::<Test>::get().into_inner(), vec![(remote_b.into(), 1)]);

		// set default to the `XCM_VERSION`
		assert_ok!(XcmPallet::force_default_xcm_version(RuntimeOrigin::root(), Some(XCM_VERSION)));
		assert_eq!(XcmPallet::get_version_for(&remote_b), None);
		assert_eq!(XcmPallet::get_version_for(&remote_c), None);

		// now works, because default is `XCM_VERSION`
		assert_eq!(
			XcmPallet::wrap_version(&remote_b, xcm.clone()),
			Ok(VersionedXcm::from(xcm.clone()))
		);
		assert_eq!(VersionDiscoveryQueue::<Test>::get().into_inner(), vec![(remote_b.into(), 2)]);

		// change remote_c to `1`
		assert_ok!(XcmPallet::force_xcm_version(RuntimeOrigin::root(), Box::new(remote_c), 1));

		// does not work because remote_c has `1` and default is `XCM_VERSION` which cannot be
		// wrapped to the `1`
		assert_eq!(XcmPallet::wrap_version(&remote_c, xcm.clone()), Err(()));
		assert_eq!(VersionDiscoveryQueue::<Test>::get().into_inner(), vec![(remote_b.into(), 2)]);
	})
}