benchmarking.rs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #![cfg(feature = "runtime-benchmarks")]
  2. use super::*;
  3. use crate::Module as ProposalsEngine;
  4. use core::convert::TryInto;
  5. use frame_benchmarking::{account, benchmarks};
  6. use governance::council::Module as Council;
  7. use membership::Module as Membership;
  8. use sp_std::prelude::*;
  9. use system as frame_system;
  10. use system::EventRecord;
  11. use system::Module as System;
  12. use system::RawOrigin;
  13. const SEED: u32 = 0;
  14. fn get_byte(num: u32, byte_number: u8) -> u8 {
  15. ((num & (0xff << (8 * byte_number))) >> 8 * byte_number) as u8
  16. }
  17. // Method to generate a distintic valid handle
  18. // for a membership. For each index.
  19. // TODO: This will only work as long as max_handle_length >= 4
  20. fn handle_from_id<T: membership::Trait>(id: u32) -> Vec<u8> {
  21. let min_handle_length = Membership::<T>::min_handle_length();
  22. // If the index is ever different from u32 change this
  23. let mut handle = vec![
  24. get_byte(id, 0),
  25. get_byte(id, 1),
  26. get_byte(id, 2),
  27. get_byte(id, 3),
  28. ];
  29. while handle.len() < (min_handle_length as usize) {
  30. handle.push(0u8);
  31. }
  32. handle
  33. }
  34. fn assert_last_event<T: Trait>(generic_event: <T as Trait>::Event) {
  35. let events = System::<T>::events();
  36. let system_event: <T as frame_system::Trait>::Event = generic_event.into();
  37. // compare to the last event record
  38. let EventRecord { event, .. } = &events[events.len() - 1];
  39. assert_eq!(event, &system_event);
  40. }
  41. fn member_account<T: membership::Trait>(
  42. name: &'static str,
  43. id: u32,
  44. ) -> (T::AccountId, T::MemberId) {
  45. let account_id = account::<T::AccountId>(name, id, SEED);
  46. let handle = handle_from_id::<T>(id);
  47. let authority_account = account::<T::AccountId>(name, 0, SEED);
  48. Membership::<T>::set_screening_authority(RawOrigin::Root.into(), authority_account.clone())
  49. .unwrap();
  50. Membership::<T>::add_screened_member(
  51. RawOrigin::Signed(authority_account.clone()).into(),
  52. account_id.clone(),
  53. Some(handle),
  54. None,
  55. None,
  56. )
  57. .unwrap();
  58. (account_id, T::MemberId::from(id.try_into().unwrap()))
  59. }
  60. const MAX_BYTES: u32 = 16384;
  61. benchmarks! {
  62. where_clause {
  63. where T: governance::council::Trait
  64. }
  65. _ { }
  66. vote {
  67. let i in 0 .. MAX_BYTES;
  68. let (account_id, member_id) = member_account::<T>("member", 0);
  69. let proposal_parameters = ProposalParameters {
  70. voting_period: T::BlockNumber::from(1),
  71. grace_period: Zero::zero(),
  72. approval_quorum_percentage: 1,
  73. approval_threshold_percentage: 1,
  74. slashing_quorum_percentage: 0,
  75. slashing_threshold_percentage: 1,
  76. required_stake: None,
  77. constitutionality: 0,
  78. };
  79. let proposal_creation_parameters = ProposalCreationParameters {
  80. account_id,
  81. proposer_id: member_id,
  82. proposal_parameters,
  83. title: vec![0u8],
  84. description: vec![0u8],
  85. staking_account_id: None,
  86. encoded_dispatchable_call_code: vec![0u8],
  87. exact_execution_block: None,
  88. };
  89. let proposal_id =
  90. ProposalsEngine::<T>::create_proposal(proposal_creation_parameters).unwrap();
  91. let (account_voter_id, member_voter_id) = member_account::<T>("voter", 1);
  92. Council::<T>::set_council(RawOrigin::Root.into(), vec![account_voter_id.clone()]).unwrap();
  93. }: _ (
  94. RawOrigin::Signed(account_voter_id),
  95. member_voter_id,
  96. proposal_id,
  97. VoteKind::Approve,
  98. vec![0u8; i.try_into().unwrap()]
  99. )
  100. }