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  }