Skip to content

Commit 2dbcd1d

Browse files
authored
Add benchmarks to oracle (#985)
* Add benchmarks to oracle * Add cfg for runtime-benchmarks * toml format
1 parent 58f847f commit 2dbcd1d

File tree

5 files changed

+103
-4
lines changed

5 files changed

+103
-4
lines changed

oracle/Cargo.toml

+8
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ sp-application-crypto = { workspace = true }
1818
sp-io = { workspace = true }
1919
sp-runtime = { workspace = true }
2020
sp-std = { workspace = true }
21+
frame-benchmarking = { workspace = true, optional = true }
2122

2223
orml-traits = { path = "../traits", version = "0.8.0", default-features = false }
2324
orml-utilities = { path = "../utilities", version = "0.8.0", default-features = false }
@@ -28,6 +29,7 @@ sp-core = { workspace = true }
2829
[features]
2930
default = [ "std" ]
3031
std = [
32+
"frame-benchmarking?/std",
3133
"frame-support/std",
3234
"frame-system/std",
3335
"orml-traits/std",
@@ -45,3 +47,9 @@ try-runtime = [
4547
"frame-system/try-runtime",
4648
"sp-runtime/try-runtime",
4749
]
50+
runtime-benchmarks = [
51+
"frame-benchmarking/runtime-benchmarks",
52+
"frame-support/runtime-benchmarks",
53+
"frame-system/runtime-benchmarks",
54+
"sp-runtime/runtime-benchmarks",
55+
]

oracle/src/benchmarking.rs

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
use super::*;
2+
use crate::Pallet as Oracle;
3+
4+
use frame_benchmarking::v2::*;
5+
6+
use frame_support::assert_ok;
7+
use frame_system::{Pallet as System, RawOrigin};
8+
use sp_std::vec;
9+
10+
#[instance_benchmarks]
11+
mod benchmarks {
12+
use super::*;
13+
14+
#[benchmark]
15+
fn feed_values(x: Linear<1, { T::BenchmarkHelper::get_currency_id_value_pairs().len() as u32 }>) {
16+
// Register the caller
17+
let caller: T::AccountId = whitelisted_caller();
18+
T::Members::add(&caller);
19+
20+
let values = T::BenchmarkHelper::get_currency_id_value_pairs()[..x as usize]
21+
.to_vec()
22+
.try_into()
23+
.expect("Must succeed since at worst the length remained the same.");
24+
25+
#[extrinsic_call]
26+
_(RawOrigin::Signed(caller.clone()), values);
27+
28+
assert!(HasDispatched::<T, I>::get().contains(&caller));
29+
}
30+
31+
#[benchmark]
32+
fn on_finalize() {
33+
// Register the caller
34+
let caller: T::AccountId = whitelisted_caller();
35+
T::Members::add(&caller);
36+
37+
// Feed some values before running `on_finalize` hook
38+
System::<T>::set_block_number(1u32.into());
39+
let values = T::BenchmarkHelper::get_currency_id_value_pairs();
40+
assert_ok!(Oracle::<T, I>::feed_values(RawOrigin::Signed(caller).into(), values));
41+
42+
#[block]
43+
{
44+
Oracle::<T, I>::on_finalize(System::<T>::block_number());
45+
}
46+
47+
assert!(!HasDispatched::<T, I>::exists());
48+
}
49+
50+
impl_benchmark_test_suite! {
51+
Oracle,
52+
crate::mock::new_test_ext(),
53+
crate::mock::Test,
54+
}
55+
}

oracle/src/lib.rs

+15
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ use sp_std::{prelude::*, vec};
4141

4242
pub use crate::default_combine_data::DefaultCombineData;
4343

44+
#[cfg(feature = "runtime-benchmarks")]
45+
mod benchmarking;
46+
4447
mod default_combine_data;
4548
mod mock;
4649
mod tests;
@@ -49,6 +52,15 @@ mod weights;
4952
pub use module::*;
5053
pub use weights::WeightInfo;
5154

55+
#[cfg(feature = "runtime-benchmarks")]
56+
/// Helper trait for benchmarking.
57+
pub trait BenchmarkHelper<OracleKey, OracleValue, L: Get<u32>> {
58+
/// Returns a list of `(oracle_key, oracle_value)` pairs to be used for benchmarking.
59+
///
60+
/// NOTE: User should ensure to at least submit two values, otherwise the benchmark linear analysis might fail.
61+
fn get_currency_id_value_pairs() -> BoundedVec<(OracleKey, OracleValue), L>;
62+
}
63+
5264
#[frame_support::pallet]
5365
pub mod module {
5466
use super::*;
@@ -100,6 +112,9 @@ pub mod module {
100112
/// Maximum size the vector used for feed values
101113
#[pallet::constant]
102114
type MaxFeedValues: Get<u32>;
115+
116+
#[cfg(feature = "runtime-benchmarks")]
117+
type BenchmarkHelper: BenchmarkHelper<Self::OracleKey, Self::OracleValue, Self::MaxFeedValues>;
103118
}
104119

105120
#[pallet::error]

oracle/src/mock.rs

+24-3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ impl frame_system::Config for Test {
2727

2828
thread_local! {
2929
static TIME: RefCell<u32> = RefCell::new(0);
30+
static MEMBERS: RefCell<Vec<AccountId>> = RefCell::new(vec![1, 2, 3]);
3031
}
3132

3233
pub struct Timestamp;
@@ -46,14 +47,28 @@ impl Timestamp {
4647

4748
parameter_types! {
4849
pub const RootOperatorAccountId: AccountId = 4;
49-
pub static OracleMembers: Vec<AccountId> = vec![1, 2, 3];
50+
pub const MaxFeedValues: u32 = 5;
5051
}
5152

5253
pub struct Members;
5354

5455
impl SortedMembers<AccountId> for Members {
5556
fn sorted_members() -> Vec<AccountId> {
56-
OracleMembers::get()
57+
MEMBERS.with(|v| v.borrow().clone())
58+
}
59+
60+
#[cfg(feature = "runtime-benchmarks")]
61+
fn add(who: &AccountId) {
62+
MEMBERS.with(|v| v.borrow_mut().push(*who));
63+
}
64+
}
65+
66+
#[cfg(feature = "runtime-benchmarks")]
67+
pub struct BenchmarkHelper;
68+
#[cfg(feature = "runtime-benchmarks")]
69+
impl crate::BenchmarkHelper<Key, Value, MaxFeedValues> for BenchmarkHelper {
70+
fn get_currency_id_value_pairs() -> BoundedVec<(Key, Value), MaxFeedValues> {
71+
vec![(1, 1), (2, 2), (3, 3)].try_into().unwrap()
5772
}
5873
}
5974

@@ -68,7 +83,9 @@ impl Config for Test {
6883
type Members = Members;
6984
type WeightInfo = ();
7085
type MaxHasDispatchedSize = ConstU32<100>;
71-
type MaxFeedValues = ConstU32<5>;
86+
type MaxFeedValues = MaxFeedValues;
87+
#[cfg(feature = "runtime-benchmarks")]
88+
type BenchmarkHelper = BenchmarkHelper;
7289
}
7390

7491
type Block = frame_system::mocking::MockBlock<Test>;
@@ -80,6 +97,10 @@ construct_runtime!(
8097
}
8198
);
8299

100+
pub fn set_members(members: Vec<AccountId>) {
101+
MEMBERS.with(|v| *v.borrow_mut() = members);
102+
}
103+
83104
// This function basically just builds a genesis storage key/value store
84105
// according to our desired mockup.
85106
pub fn new_test_ext() -> sp_io::TestExternalities {

oracle/src/tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ fn get_all_values_should_work() {
290290
#[test]
291291
fn change_member_should_work() {
292292
new_test_ext().execute_with(|| {
293-
OracleMembers::set(vec![2, 3, 4]);
293+
set_members(vec![2, 3, 4]);
294294
<ModuleOracle as ChangeMembers<AccountId>>::change_members_sorted(&[4], &[1], &[2, 3, 4]);
295295
assert_noop!(
296296
ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(50, 1000)].try_into().unwrap()),

0 commit comments

Comments
 (0)