-
Notifications
You must be signed in to change notification settings - Fork 310
/
benchmarks.rs
127 lines (110 loc) · 4.8 KB
/
benchmarks.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright 2019-2022 PureStake Inc.
// This file is part of Moonbeam.
// Moonbeam 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.
// Moonbeam 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 Moonbeam. If not, see <http://www.gnu.org/licenses/>.
#![cfg(feature = "runtime-benchmarks")]
use crate::{Call, Config, Pallet};
use frame_benchmarking::{benchmarks, impl_benchmark_test_suite};
use frame_system::RawOrigin;
use xcm::latest::prelude::*;
benchmarks! {
// This where clause allows us to create assetTypes
where_clause { where T::AssetType: From<MultiLocation> }
register_asset {
// does not really matter what we register
let asset_type = T::AssetType::default();
let metadata = T::AssetRegistrarMetadata::default();
let amount = 1u32.into();
let asset_id: T::AssetId = asset_type.clone().into();
}: _(RawOrigin::Root, asset_type.clone(), metadata, amount, true)
verify {
assert_eq!(Pallet::<T>::asset_id_type(asset_id), Some(asset_type));
}
set_asset_units_per_second {
// We make it dependent on the number of existing assets already
let x in 5..100;
for i in 0..x {
let asset_type: T::AssetType = MultiLocation::new(0, X1(GeneralIndex(i as u128))).into();
let metadata = T::AssetRegistrarMetadata::default();
let amount = 1u32.into();
Pallet::<T>::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?;
Pallet::<T>::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1, i)?;
}
// does not really matter what we register, as long as it is different than the previous
let asset_type = T::AssetType::default();
let metadata = T::AssetRegistrarMetadata::default();
let amount = 1u32.into();
let asset_id: T::AssetId = asset_type.clone().into();
Pallet::<T>::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?;
}: _(RawOrigin::Root, asset_type.clone(), 1, x)
verify {
assert!(Pallet::<T>::supported_fee_payment_assets().contains(&asset_type));
assert_eq!(Pallet::<T>::asset_type_units_per_second(asset_type), Some(1));
}
change_existing_asset_type {
// We make it dependent on the number of existing assets already
let x in 5..100;
for i in 0..x {
let asset_type: T::AssetType = MultiLocation::new(0, X1(GeneralIndex(i as u128))).into();
let metadata = T::AssetRegistrarMetadata::default();
let amount = 1u32.into();
Pallet::<T>::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?;
Pallet::<T>::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1, i)?;
}
let new_asset_type = T::AssetType::default();
let asset_type_to_be_changed: T::AssetType = MultiLocation::new(
0,
X1(GeneralIndex((x-1) as u128))
).into();
let asset_id_to_be_changed = asset_type_to_be_changed.into();
}: _(RawOrigin::Root, asset_id_to_be_changed, new_asset_type.clone(), x)
verify {
assert_eq!(Pallet::<T>::asset_id_type(asset_id_to_be_changed), Some(new_asset_type.clone()));
assert_eq!(Pallet::<T>::asset_type_units_per_second(&new_asset_type), Some(1));
assert!(Pallet::<T>::supported_fee_payment_assets().contains(&new_asset_type));
}
remove_supported_asset {
// We make it dependent on the number of existing assets already
let x in 5..100;
for i in 0..x {
let asset_type: T::AssetType = MultiLocation::new(0, X1(GeneralIndex(i as u128))).into();
let metadata = T::AssetRegistrarMetadata::default();
let amount = 1u32.into();
Pallet::<T>::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?;
Pallet::<T>::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1, i)?;
}
let asset_type_to_be_removed: T::AssetType = MultiLocation::new(
0,
X1(GeneralIndex((x-1) as u128))
).into();
// We try to remove the last asset type
}: _(RawOrigin::Root, asset_type_to_be_removed.clone(), x)
verify {
assert!(!Pallet::<T>::supported_fee_payment_assets().contains(&asset_type_to_be_removed));
assert_eq!(Pallet::<T>::asset_type_units_per_second(asset_type_to_be_removed), None);
}
}
#[cfg(test)]
mod tests {
use crate::mock::Test;
use sp_io::TestExternalities;
pub fn new_test_ext() -> TestExternalities {
let t = frame_system::GenesisConfig::default()
.build_storage::<Test>()
.unwrap();
TestExternalities::new(t)
}
}
impl_benchmark_test_suite!(
Pallet,
crate::benchmarks::tests::new_test_ext(),
crate::mock::Test
);