From 88080338eca9001b6be0abc1558abf4f511c410b Mon Sep 17 00:00:00 2001 From: bgallois <benjamin@gallois.cc> Date: Tue, 12 Dec 2023 18:49:56 +0100 Subject: [PATCH] add end2end test grandpa offences --- pallets/authority-members/src/impls.rs | 3 ++ pallets/authority-members/src/lib.rs | 2 ++ runtime/gdev/tests/integration_tests.rs | 44 +++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/pallets/authority-members/src/impls.rs b/pallets/authority-members/src/impls.rs index 4a2a53304..ade9f7437 100644 --- a/pallets/authority-members/src/impls.rs +++ b/pallets/authority-members/src/impls.rs @@ -59,6 +59,9 @@ where { if !blacklist.contains(&member_id) { blacklist.push(member_id); + Self::deposit_event(Event::MemberAddedToBlacklist { + member: member_id, + }); add_db_reads_writes(0, 1); } Self::insert_out(member_id); diff --git a/pallets/authority-members/src/lib.rs b/pallets/authority-members/src/lib.rs index 355eb1ff7..6858083e1 100644 --- a/pallets/authority-members/src/lib.rs +++ b/pallets/authority-members/src/lib.rs @@ -179,6 +179,8 @@ pub mod pallet { MemberRemoved { member: T::MemberId }, /// A member has been removed from the blacklist. MemberRemovedFromBlacklist { member: T::MemberId }, + /// A member has been blacklisted. + MemberAddedToBlacklist { member: T::MemberId }, } // ERRORS // diff --git a/runtime/gdev/tests/integration_tests.rs b/runtime/gdev/tests/integration_tests.rs index af667a70e..d9e2e90a4 100644 --- a/runtime/gdev/tests/integration_tests.rs +++ b/runtime/gdev/tests/integration_tests.rs @@ -1370,3 +1370,47 @@ fn test_imonline_offence() { )); }) } +#[test] +fn test_grandpa_offence() { + ExtBuilder::new(1, 3, 4).build().execute_with(|| { + run_to_block(1); + let session_index = Session::current_index(); + let current_validators = <Runtime as pallet_im_online::Config>::ValidatorSet::validators(); + // Construct an offence where all validators (member: 1) are offenders + let mut offenders = current_validators + .into_iter() + .enumerate() + .filter_map(|(_, id)| { + <Runtime as pallet_session::historical::Config>::FullIdentificationOf::convert( + id.clone(), + ) + .map(|full_id| (id, full_id)) + }) + .collect::<Vec<IdentificationTuple<Runtime>>>(); + let keys = ImOnline::keys(); + let validator_set_count = keys.len() as u32; + let time_slot = pallet_grandpa::TimeSlot { + set_id: 0, + round: 0, + }; + let offence = pallet_grandpa::EquivocationOffence { + time_slot, + session_index, + validator_set_count, + offender: offenders.pop().unwrap().into(), + }; + let _ = Offences::report_offence(vec![], offence); + // An offence is deposited + System::assert_has_event(RuntimeEvent::Offences(pallet_offences::Event::Offence { + kind: *b"grandpa:equivoca", + timeslot: vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + })); + // Offenders are punished + System::assert_has_event(RuntimeEvent::AuthorityMembers( + pallet_authority_members::Event::MemberGoOffline { member: 1 }, + )); + System::assert_has_event(RuntimeEvent::AuthorityMembers( + pallet_authority_members::Event::MemberAddedToBlacklist { member: 1 }, + )); + }) +} -- GitLab