github.com/Oyster-zx/tendermint@v0.34.24-fork/test/e2e/tests/evidence_test.go (about) 1 package e2e_test 2 3 import ( 4 "bytes" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 9 e2e "github.com/tendermint/tendermint/test/e2e/pkg" 10 "github.com/tendermint/tendermint/types" 11 ) 12 13 // assert that all nodes that have blocks at the height of a misbehavior has evidence 14 // for that misbehavior 15 func TestEvidence_Misbehavior(t *testing.T) { 16 blocks := fetchBlockChain(t) 17 testNode(t, func(t *testing.T, node e2e.Node) { 18 seenEvidence := make(map[int64]struct{}) 19 for _, block := range blocks { 20 // Find any evidence blaming this node in this block 21 var nodeEvidence types.Evidence 22 for _, evidence := range block.Evidence.Evidence { 23 switch evidence := evidence.(type) { 24 case *types.DuplicateVoteEvidence: 25 if bytes.Equal(evidence.VoteA.ValidatorAddress, node.PrivvalKey.PubKey().Address()) { 26 nodeEvidence = evidence 27 } 28 default: 29 t.Fatalf("unexpected evidence type %T", evidence) 30 } 31 } 32 if nodeEvidence == nil { 33 continue // no evidence for the node at this height 34 } 35 36 // Check that evidence was as expected 37 misbehavior, ok := node.Misbehaviors[nodeEvidence.Height()] 38 require.True(t, ok, "found unexpected evidence %v in height %v", 39 nodeEvidence, block.Height) 40 41 switch misbehavior { 42 case "double-prevote": 43 require.IsType(t, &types.DuplicateVoteEvidence{}, nodeEvidence, "unexpected evidence type") 44 default: 45 t.Fatalf("unknown misbehavior %v", misbehavior) 46 } 47 48 seenEvidence[nodeEvidence.Height()] = struct{}{} 49 } 50 // see if there is any evidence that we were expecting but didn't see 51 for height, misbehavior := range node.Misbehaviors { 52 _, ok := seenEvidence[height] 53 require.True(t, ok, "expected evidence for %v misbehavior at height %v by node but was never found", 54 misbehavior, height) 55 } 56 }) 57 }