Browse Source

benchmark: proposals/engine: add test for `vote`

conectado 4 years ago
parent
commit
622c55dfce

+ 2 - 0
Cargo.lock

@@ -4092,7 +4092,9 @@ dependencies = [
  "pallet-common",
  "pallet-governance",
  "pallet-membership",
+ "pallet-recurring-reward",
  "pallet-timestamp",
+ "pallet-token-mint",
  "parity-scale-codec",
  "serde",
  "sp-arithmetic",

+ 4 - 1
runtime-modules/proposals/engine/Cargo.toml

@@ -16,9 +16,10 @@ sp-runtime = { package = 'sp-runtime', default-features = false, git = 'https://
 balances = { package = 'pallet-balances', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca'}
 membership = { package = 'pallet-membership', default-features = false, path = '../../membership'}
 common = { package = 'pallet-common', default-features = false, path = '../../common'}
-
 frame-benchmarking = { package = 'frame-benchmarking', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4', optional = true}
 governance = { package = 'pallet-governance', default-features = false, path = '../../governance', optional = true}
+recurringrewards = { package = 'pallet-recurring-reward', default-features = false, path = '../../recurring-reward', optional = true}
+minting = { package = 'pallet-token-mint', default-features = false, path = '../../token-minting', optional = true}
 
 [dev-dependencies]
 sp-io = { package = 'sp-io', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca'}
@@ -29,6 +30,8 @@ default = ['std']
 runtime-benchmarks = [
     'frame-benchmarking',
     'governance',
+    'recurringrewards',
+    'minting',
 ]
 std = [
 	'serde',

+ 52 - 9
runtime-modules/proposals/engine/src/benchmarking.rs

@@ -5,6 +5,7 @@ use core::convert::TryInto;
 use frame_benchmarking::{account, benchmarks};
 use governance::council::Module as Council;
 use membership::Module as Membership;
+use sp_std::cmp::min;
 use sp_std::prelude::*;
 use system as frame_system;
 use system::EventRecord;
@@ -19,16 +20,14 @@ fn get_byte(num: u32, byte_number: u8) -> u8 {
 
 // Method to generate a distintic valid handle
 // for a membership. For each index.
-// TODO: This will only work as long as max_handle_length >= 4
 fn handle_from_id<T: membership::Trait>(id: u32) -> Vec<u8> {
     let min_handle_length = Membership::<T>::min_handle_length();
-    // If the index is ever different from u32 change this
-    let mut handle = vec![
-        get_byte(id, 0),
-        get_byte(id, 1),
-        get_byte(id, 2),
-        get_byte(id, 3),
-    ];
+
+    let mut handle = vec![];
+
+    for i in 0..min(Membership::<T>::max_handle_length().try_into().unwrap(), 4) {
+        handle.push(get_byte(id, i));
+    }
 
     while handle.len() < (min_handle_length as usize) {
         handle.push(0u8);
@@ -75,6 +74,7 @@ benchmarks! {
     where_clause {
         where T: governance::council::Trait
     }
+
     _ { }
 
     vote {
@@ -106,6 +106,11 @@ benchmarks! {
 
         let proposal_id =
             ProposalsEngine::<T>::create_proposal(proposal_creation_parameters).unwrap();
+        assert!(Proposals::<T>::contains_key(proposal_id), "Proposal not created");
+        assert!(DispatchableCallCode::<T>::contains_key(proposal_id), "Dispatchable code not added");
+        assert_eq!(ProposalsEngine::<T>::proposal_codes(proposal_id), vec![0u8], "Dispatchable code does not match");
+        assert_eq!(ProposalsEngine::<T>::proposal_count(), 1, "Not correct number of proposals stored");
+        assert_eq!(ProposalsEngine::<T>::active_proposal_count(), 1, "Created proposal not active");
 
         let (account_voter_id, member_voter_id) = member_account::<T>("voter", 1);
 
@@ -116,5 +121,43 @@ benchmarks! {
             proposal_id,
             VoteKind::Approve,
             vec![0u8; i.try_into().unwrap()]
-        )
+      )
+      verify {
+          assert!(Proposals::<T>::contains_key(proposal_id), "Proposal should still exist");
+
+          let voting_results = ProposalsEngine::<T>::proposals(proposal_id).voting_results;
+
+          assert_eq!(
+              voting_results,
+              VotingResults{ approvals: 1, abstentions: 0, rejections: 0, slashes: 0 },
+              "There should only be 1 approval"
+          );
+
+          assert!(
+              VoteExistsByProposalByVoter::<T>::contains_key(proposal_id, member_voter_id),
+              "Voter not added to existing voters"
+          );
+
+          assert_eq!(
+              ProposalsEngine::<T>::vote_by_proposal_by_voter(proposal_id, member_voter_id),
+              VoteKind::Approve,
+              "Stored vote doesn't match"
+          );
+
+          assert_last_event::<T>(RawEvent::Voted(member_voter_id, proposal_id, VoteKind::Approve).into());
+      }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use crate::tests::mock::{initial_test_ext, Test};
+    use frame_support::assert_ok;
+
+    #[test]
+    fn test_vote() {
+        initial_test_ext().execute_with(|| {
+            assert_ok!(test_benchmark_vote::<Test>());
+        });
+    }
 }

+ 24 - 0
runtime-modules/proposals/engine/src/tests/mock/mod.rs

@@ -38,12 +38,17 @@ mod membership_mod {
     pub use membership::Event;
 }
 
+mod council {
+    pub use governance::council::Event;
+}
+
 impl_outer_event! {
     pub enum TestEvent for Test {
         balances<T>,
         engine<T>,
         membership_mod<T>,
         frame_system<T>,
+        council<T>,
     }
 }
 
@@ -170,6 +175,25 @@ impl pallet_timestamp::Trait for Test {
     type WeightInfo = ();
 }
 
+#[cfg(feature = "runtime-benchmarks")]
+impl governance::council::Trait for Test {
+    type Event = TestEvent;
+    type CouncilTermEnded = ();
+}
+
+#[cfg(feature = "runtime-benchmarks")]
+impl recurringrewards::Trait for Test {
+    type PayoutStatusHandler = ();
+    type RecipientId = u64;
+    type RewardRelationshipId = u64;
+}
+
+#[cfg(feature = "runtime-benchmarks")]
+impl minting::Trait for Test {
+    type Currency = Balances;
+    type MintId = u64;
+}
+
 pub fn initial_test_ext() -> sp_io::TestExternalities {
     let t = frame_system::GenesisConfig::default()
         .build_storage::<Test>()