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