From 752a3a6c242218cd9db8e582385f78497d53d38d Mon Sep 17 00:00:00 2001 From: Sam Kleinman Date: Wed, 5 Jan 2022 14:21:40 -0500 Subject: [PATCH] types: tests should not panic (#7506) --- types/block_test.go | 19 +++++++++++----- types/evidence_test.go | 4 +++- types/light_test.go | 4 ++++ types/node_info_test.go | 30 +++++++++++++------------- types/proposal_test.go | 36 +++++++++++++++++-------------- types/validation_test.go | 4 ++++ types/validator_set_test.go | 43 ++++++++++++++++--------------------- types/validator_test.go | 9 ++++---- types/vote_set_test.go | 10 ++++++++- types/vote_test.go | 1 + 10 files changed, 93 insertions(+), 67 deletions(-) diff --git a/types/block_test.go b/types/block_test.go index 91f7f475d..54292463a 100644 --- a/types/block_test.go +++ b/types/block_test.go @@ -68,6 +68,7 @@ func TestBlockValidateBasic(t *testing.T) { voteSet, valSet, vals := randVoteSet(ctx, t, h-1, 1, tmproto.PrecommitType, 10, 1) commit, err := makeCommit(ctx, lastID, h-1, 1, voteSet, vals, time.Now()) + require.NoError(t, err) ev, err := NewMockDuplicateVoteEvidenceWithValidator(ctx, h, time.Now(), vals[0], "block-test-chain") @@ -154,6 +155,7 @@ func TestBlockMakePartSetWithEvidence(t *testing.T) { voteSet, _, vals := randVoteSet(ctx, t, h-1, 1, tmproto.PrecommitType, 10, 1) commit, err := makeCommit(ctx, lastID, h-1, 1, voteSet, vals, time.Now()) + require.NoError(t, err) ev, err := NewMockDuplicateVoteEvidenceWithValidator(ctx, h, time.Now(), vals[0], "block-test-chain") @@ -175,6 +177,7 @@ func TestBlockHashesTo(t *testing.T) { lastID := makeBlockIDRandom() h := int64(3) + voteSet, valSet, vals := randVoteSet(ctx, t, h-1, 1, tmproto.PrecommitType, 10, 1) commit, err := makeCommit(ctx, lastID, h-1, 1, voteSet, vals, time.Now()) require.NoError(t, err) @@ -293,6 +296,7 @@ func TestCommitValidateBasic(t *testing.T) { defer cancel() com := randCommit(ctx, t, time.Now()) + tc.malleateCommit(com) assert.Equal(t, tc.expectErr, com.ValidateBasic() != nil, "Validate Basic had an unexpected result") }) @@ -365,7 +369,7 @@ func TestHeaderHash(t *testing.T) { LastResultsHash: tmhash.Sum([]byte("last_results_hash")), EvidenceHash: tmhash.Sum([]byte("evidence_hash")), ProposerAddress: crypto.AddressHash([]byte("proposer_address")), - }, hexBytesFromString("F740121F553B5418C3EFBD343C2DBFE9E007BB67B0D020A0741374BAB65242A4")}, + }, hexBytesFromString(t, "F740121F553B5418C3EFBD343C2DBFE9E007BB67B0D020A0741374BAB65242A4")}, {"nil header yields nil", nil, nil}, {"nil ValidatorsHash yields nil", &Header{ Version: version.Consensus{Block: 1, App: 2}, @@ -475,16 +479,18 @@ func randCommit(ctx context.Context, t *testing.T, now time.Time) *Commit { h := int64(3) voteSet, _, vals := randVoteSet(ctx, t, h-1, 1, tmproto.PrecommitType, 10, 1) commit, err := makeCommit(ctx, lastID, h-1, 1, voteSet, vals, now) + require.NoError(t, err) return commit } -func hexBytesFromString(s string) bytes.HexBytes { +func hexBytesFromString(t *testing.T, s string) bytes.HexBytes { + t.Helper() + b, err := hex.DecodeString(s) - if err != nil { - panic(err) - } + require.NoError(t, err) + return bytes.HexBytes(b) } @@ -558,6 +564,7 @@ func TestCommitToVoteSet(t *testing.T) { voteSet, valSet, vals := randVoteSet(ctx, t, h-1, 1, tmproto.PrecommitType, 10, 1) commit, err := makeCommit(ctx, lastID, h-1, 1, voteSet, vals, time.Now()) + assert.NoError(t, err) chainID := voteSet.ChainID() @@ -684,6 +691,7 @@ func TestBlockProtoBuf(t *testing.T) { h := mrand.Int63() c1 := randCommit(ctx, t, time.Now()) + b1 := MakeBlock(h, []Tx{Tx([]byte{1})}, &Commit{Signatures: []CommitSig{}}, []Evidence{}) b1.ProposerAddress = tmrand.Bytes(crypto.AddressSize) @@ -877,6 +885,7 @@ func TestSignedHeaderProtoBuf(t *testing.T) { defer cancel() commit := randCommit(ctx, t, time.Now()) + h := MakeRandHeader() sh := SignedHeader{Header: &h, Commit: commit} diff --git a/types/evidence_test.go b/types/evidence_test.go index 9dfa45606..440531aa9 100644 --- a/types/evidence_test.go +++ b/types/evidence_test.go @@ -112,6 +112,7 @@ func TestLightClientAttackEvidenceBasic(t *testing.T) { commonHeight := height - 1 nValidators := 10 voteSet, valSet, privVals := randVoteSet(ctx, t, height, 1, tmproto.PrecommitType, nValidators, 1) + header := makeHeaderRandom() header.Height = height blockID := makeBlockID(tmhash.Sum([]byte("blockhash")), math.MaxInt32, tmhash.Sum([]byte("partshash"))) @@ -174,6 +175,7 @@ func TestLightClientAttackEvidenceValidation(t *testing.T) { commonHeight := height - 1 nValidators := 10 voteSet, valSet, privVals := randVoteSet(ctx, t, height, 1, tmproto.PrecommitType, nValidators, 1) + header := makeHeaderRandom() header.Height = height header.ValidatorsHash = valSet.Hash() @@ -358,7 +360,7 @@ func TestEvidenceVectors(t *testing.T) { height := int64(5) commonHeight := height - 1 nValidators := 10 - voteSet, valSet, privVals := deterministicVoteSet(ctx, height, 1, tmproto.PrecommitType, 1) + voteSet, valSet, privVals := deterministicVoteSet(ctx, t, height, 1, tmproto.PrecommitType, 1) header := &Header{ Version: version.Consensus{Block: 1, App: 1}, ChainID: chainID, diff --git a/types/light_test.go b/types/light_test.go index 1fe5fca47..eb35474e2 100644 --- a/types/light_test.go +++ b/types/light_test.go @@ -19,11 +19,13 @@ func TestLightBlockValidateBasic(t *testing.T) { header := MakeRandHeader() commit := randCommit(ctx, t, time.Now()) vals, _ := randValidatorPrivValSet(ctx, t, 5, 1) + header.Height = commit.Height header.LastBlockID = commit.BlockID header.ValidatorsHash = vals.Hash() header.Version.Block = version.BlockProtocol vals2, _ := randValidatorPrivValSet(ctx, t, 3, 1) + vals3 := vals.Copy() vals3.Proposer = &Validator{} commit.BlockID.Hash = header.Hash() @@ -66,6 +68,7 @@ func TestLightBlockProtobuf(t *testing.T) { header := MakeRandHeader() commit := randCommit(ctx, t, time.Now()) vals, _ := randValidatorPrivValSet(ctx, t, 5, 1) + header.Height = commit.Height header.LastBlockID = commit.BlockID header.Version.Block = version.BlockProtocol @@ -120,6 +123,7 @@ func TestSignedHeaderValidateBasic(t *testing.T) { defer cancel() commit := randCommit(ctx, t, time.Now()) + chainID := "𠜎" timestamp := time.Date(math.MaxInt64, 0, 0, 0, 0, 0, math.MaxInt64, time.UTC) h := Header{ diff --git a/types/node_info_test.go b/types/node_info_test.go index 9a5a90d51..c14570c96 100644 --- a/types/node_info_test.go +++ b/types/node_info_test.go @@ -75,12 +75,12 @@ func TestNodeInfoValidate(t *testing.T) { name := "testing" // test case passes - ni = testNodeInfo(nodeKeyID, name) + ni = testNodeInfo(t, nodeKeyID, name) ni.Channels = channels assert.NoError(t, ni.Validate()) for _, tc := range testCases { - ni := testNodeInfo(nodeKeyID, name) + ni := testNodeInfo(t, nodeKeyID, name) ni.Channels = channels tc.malleateNodeInfo(&ni) err := ni.Validate() @@ -97,11 +97,12 @@ func testNodeID() NodeID { return NodeIDFromPubKey(ed25519.GenPrivKey().PubKey()) } -func testNodeInfo(id NodeID, name string) NodeInfo { - return testNodeInfoWithNetwork(id, name, "testing") +func testNodeInfo(t *testing.T, id NodeID, name string) NodeInfo { + return testNodeInfoWithNetwork(t, id, name, "testing") } -func testNodeInfoWithNetwork(id NodeID, name, network string) NodeInfo { +func testNodeInfoWithNetwork(t *testing.T, id NodeID, name, network string) NodeInfo { + t.Helper() return NodeInfo{ ProtocolVersion: ProtocolVersion{ P2P: version.P2PProtocol, @@ -109,23 +110,22 @@ func testNodeInfoWithNetwork(id NodeID, name, network string) NodeInfo { App: 0, }, NodeID: id, - ListenAddr: fmt.Sprintf("127.0.0.1:%d", getFreePort()), + ListenAddr: fmt.Sprintf("127.0.0.1:%d", getFreePort(t)), Network: network, Version: "1.2.3-rc0-deadbeef", Channels: []byte{testCh}, Moniker: name, Other: NodeInfoOther{ TxIndex: "on", - RPCAddress: fmt.Sprintf("127.0.0.1:%d", getFreePort()), + RPCAddress: fmt.Sprintf("127.0.0.1:%d", getFreePort(t)), }, } } -func getFreePort() int { +func getFreePort(t *testing.T) int { + t.Helper() port, err := tmnet.GetFreePort() - if err != nil { - panic(err) - } + require.NoError(t, err) return port } @@ -137,8 +137,8 @@ func TestNodeInfoCompatible(t *testing.T) { var newTestChannel byte = 0x2 // test NodeInfo is compatible - ni1 := testNodeInfo(nodeKey1ID, name) - ni2 := testNodeInfo(nodeKey2ID, name) + ni1 := testNodeInfo(t, nodeKey1ID, name) + ni2 := testNodeInfo(t, nodeKey2ID, name) assert.NoError(t, ni1.CompatibleWith(ni2)) // add another channel; still compatible @@ -155,14 +155,14 @@ func TestNodeInfoCompatible(t *testing.T) { } for _, tc := range testCases { - ni := testNodeInfo(nodeKey2ID, name) + ni := testNodeInfo(t, nodeKey2ID, name) tc.malleateNodeInfo(&ni) assert.Error(t, ni1.CompatibleWith(ni)) } } func TestNodeInfoAddChannel(t *testing.T) { - nodeInfo := testNodeInfo(testNodeID(), "testing") + nodeInfo := testNodeInfo(t, testNodeID(), "testing") nodeInfo.Channels = []byte{} require.Empty(t, nodeInfo.Channels) diff --git a/types/proposal_test.go b/types/proposal_test.go index ff6ad7f1e..472c66af5 100644 --- a/types/proposal_test.go +++ b/types/proposal_test.go @@ -16,17 +16,13 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) -var ( - testProposal *Proposal - pbp *tmproto.Proposal -) +func getTestProposal(t testing.TB) *Proposal { + t.Helper() -func init() { - var stamp, err = time.Parse(TimeFormat, "2018-02-11T07:09:22.765Z") - if err != nil { - panic(err) - } - testProposal = &Proposal{ + stamp, err := time.Parse(TimeFormat, "2018-02-11T07:09:22.765Z") + require.NoError(t, err) + + return &Proposal{ Height: 12345, Round: 23456, BlockID: BlockID{Hash: []byte("--June_15_2020_amino_was_removed"), @@ -34,13 +30,12 @@ func init() { POLRound: -1, Timestamp: stamp, } - pbp = testProposal.ToProto() } func TestProposalSignable(t *testing.T) { chainID := "test_chain_id" - signBytes := ProposalSignBytes(chainID, pbp) - pb := CanonicalizeProposal(chainID, pbp) + signBytes := ProposalSignBytes(chainID, getTestProposal(t).ToProto()) + pb := CanonicalizeProposal(chainID, getTestProposal(t).ToProto()) expected, err := protoio.MarshalDelimited(&pb) require.NoError(t, err) @@ -48,7 +43,7 @@ func TestProposalSignable(t *testing.T) { } func TestProposalString(t *testing.T) { - str := testProposal.String() + str := getTestProposal(t).String() expected := `Proposal{12345/23456 (2D2D4A756E655F31355F323032305F616D696E6F5F7761735F72656D6F766564:111:2D2D4A756E65, -1) 000000000000 @ 2018-02-11T07:09:22.765Z}` if str != expected { t.Errorf("got unexpected string for Proposal. Expected:\n%v\nGot:\n%v", expected, str) @@ -99,6 +94,10 @@ func TestProposalVerifySignature(t *testing.T) { } func BenchmarkProposalWriteSignBytes(b *testing.B) { + pbp := getTestProposal(b).ToProto() + + b.ResetTimer() + for i := 0; i < b.N; i++ { ProposalSignBytes("test_chain_id", pbp) } @@ -109,7 +108,10 @@ func BenchmarkProposalSign(b *testing.B) { defer cancel() privVal := NewMockPV() + + pbp := getTestProposal(b).ToProto() b.ResetTimer() + for i := 0; i < b.N; i++ { err := privVal.SignProposal(ctx, "test_chain_id", pbp) if err != nil { @@ -119,17 +121,19 @@ func BenchmarkProposalSign(b *testing.B) { } func BenchmarkProposalVerifySignature(b *testing.B) { + testProposal := getTestProposal(b) + pbp := testProposal.ToProto() ctx, cancel := context.WithCancel(context.Background()) defer cancel() - b.ResetTimer() - privVal := NewMockPV() err := privVal.SignProposal(ctx, "test_chain_id", pbp) require.NoError(b, err) pubKey, err := privVal.GetPubKey(ctx) require.NoError(b, err) + b.ResetTimer() + for i := 0; i < b.N; i++ { pubKey.VerifySignature(ProposalSignBytes("test_chain_id", pbp), testProposal.Signature) } diff --git a/types/validation_test.go b/types/validation_test.go index b287a5f24..7900ee5ce 100644 --- a/types/validation_test.go +++ b/types/validation_test.go @@ -64,6 +64,7 @@ func TestValidatorSet_VerifyCommit_All(t *testing.T) { defer cancel() _, valSet, vals := randVoteSet(ctx, t, tc.height, round, tmproto.PrecommitType, tc.valSize, 10) + totalVotes := tc.blockVotes + tc.absentVotes + tc.nilVotes sigs := make([]CommitSig, totalVotes) vi := 0 @@ -146,6 +147,7 @@ func TestValidatorSet_VerifyCommit_CheckAllSignatures(t *testing.T) { voteSet, valSet, vals := randVoteSet(ctx, t, h, 0, tmproto.PrecommitType, 4, 10) commit, err := makeCommit(ctx, blockID, h, 0, voteSet, vals, time.Now()) + require.NoError(t, err) require.NoError(t, valSet.VerifyCommit(chainID, blockID, h, commit)) @@ -175,6 +177,7 @@ func TestValidatorSet_VerifyCommitLight_ReturnsAsSoonAsMajorityOfVotingPowerSign voteSet, valSet, vals := randVoteSet(ctx, t, h, 0, tmproto.PrecommitType, 4, 10) commit, err := makeCommit(ctx, blockID, h, 0, voteSet, vals, time.Now()) + require.NoError(t, err) require.NoError(t, valSet.VerifyCommit(chainID, blockID, h, commit)) @@ -201,6 +204,7 @@ func TestValidatorSet_VerifyCommitLightTrusting_ReturnsAsSoonAsTrustLevelOfVotin voteSet, valSet, vals := randVoteSet(ctx, t, h, 0, tmproto.PrecommitType, 4, 10) commit, err := makeCommit(ctx, blockID, h, 0, voteSet, vals, time.Now()) + require.NoError(t, err) require.NoError(t, valSet.VerifyCommit(chainID, blockID, h, commit)) diff --git a/types/validator_set_test.go b/types/validator_set_test.go index ac628f423..096327626 100644 --- a/types/validator_set_test.go +++ b/types/validator_set_test.go @@ -86,6 +86,7 @@ func TestValidatorSetValidateBasic(t *testing.T) { val, _, err := randValidator(ctx, false, 1) require.NoError(t, err) + badVal := &Validator{} testCases := []struct { @@ -178,9 +179,7 @@ func BenchmarkValidatorSetCopy(b *testing.B) { pubKey := privKey.PubKey() val := NewValidator(pubKey, 10) err := vset.UpdateWithChangeSet([]*Validator{val}) - if err != nil { - panic("Failed to add validator") - } + require.NoError(b, err) } b.StartTimer() @@ -337,8 +336,8 @@ func TestProposerSelection3(t *testing.T) { } // serialize, deserialize, check proposer - b := vset.toBytes() - vset = vset.fromBytes(b) + b := vset.toBytes(t) + vset = vset.fromBytes(t, b) computed := vset.GetProposer() // findGetProposer() if i != 0 { @@ -394,8 +393,9 @@ func randValidator(ctx context.Context, randPower bool, minPower int64) (*Valida } pubKey, err := privVal.GetPubKey(ctx) if err != nil { - return nil, nil, fmt.Errorf("could not retrieve pubkey %w", err) + return nil, nil, err } + val := NewValidator(pubKey, votePower) return val, privVal, nil } @@ -410,32 +410,23 @@ func randModuloValidatorSet(numValidators int) *ValidatorSet { return NewValidatorSet(validators) } -func (vals *ValidatorSet) toBytes() []byte { +func (vals *ValidatorSet) toBytes(t *testing.T) []byte { pbvs, err := vals.ToProto() - if err != nil { - panic(err) - } + require.NoError(t, err) bz, err := pbvs.Marshal() - if err != nil { - panic(err) - } + require.NoError(t, err) return bz } -func (vals *ValidatorSet) fromBytes(b []byte) *ValidatorSet { +func (vals *ValidatorSet) fromBytes(t *testing.T, b []byte) *ValidatorSet { pbvs := new(tmproto.ValidatorSet) err := pbvs.Unmarshal(b) - if err != nil { - // DATA HAS BEEN CORRUPTED OR THE SPEC HAS CHANGED - panic(err) - } + require.NoError(t, err) vs, err := ValidatorSetFromProto(pbvs) - if err != nil { - panic(err) - } + require.NoError(t, err) return vs } @@ -1148,7 +1139,7 @@ type testVSetCfg struct { func randTestVSetCfg(t *testing.T, nBase, nAddMax int) testVSetCfg { if nBase <= 0 || nAddMax < 0 { - panic(fmt.Sprintf("bad parameters %v %v", nBase, nAddMax)) + t.Fatalf("bad parameters %v %v", nBase, nAddMax) } const maxPower = 1000 @@ -1427,6 +1418,7 @@ func TestValidatorSetProtoBuf(t *testing.T) { valset3.Proposer = nil valset4, _ := randValidatorPrivValSet(ctx, t, 10, 100) + valset4.Proposer = &Validator{} testCases := []struct { @@ -1573,6 +1565,7 @@ func BenchmarkValidatorSet_VerifyCommitLight_Ed25519(b *testing.B) { // nolint b.ReportAllocs() // generate n validators voteSet, valSet, vals := randVoteSet(ctx, b, h, 0, tmproto.PrecommitType, n, int64(n*5)) + // create a commit with n validators commit, err := makeCommit(ctx, blockID, h, 0, voteSet, vals, time.Now()) require.NoError(b, err) @@ -1618,15 +1611,17 @@ func BenchmarkValidatorSet_VerifyCommitLightTrusting_Ed25519(b *testing.B) { // where each validator has a power of 50 // // EXPOSED FOR TESTING. -func deterministicValidatorSet(ctx context.Context) (*ValidatorSet, []PrivValidator) { +func deterministicValidatorSet(ctx context.Context, t *testing.T) (*ValidatorSet, []PrivValidator) { var ( valz = make([]*Validator, 10) privValidators = make([]PrivValidator, 10) ) + t.Helper() + for i := 0; i < 10; i++ { // val, privValidator := DeterministicValidator(ed25519.PrivKey([]byte(deterministicKeys[i]))) - val, privValidator := deterministicValidator(ctx, ed25519.GenPrivKeyFromSecret([]byte(fmt.Sprintf("key: %x", i)))) + val, privValidator := deterministicValidator(ctx, t, ed25519.GenPrivKeyFromSecret([]byte(fmt.Sprintf("key: %x", i)))) valz[i] = val privValidators[i] = privValidator } diff --git a/types/validator_test.go b/types/validator_test.go index 8ff746290..1e29787fd 100644 --- a/types/validator_test.go +++ b/types/validator_test.go @@ -2,7 +2,6 @@ package types import ( "context" - "fmt" "testing" "github.com/stretchr/testify/assert" @@ -16,6 +15,7 @@ func TestValidatorProtoBuf(t *testing.T) { val, _, err := randValidator(ctx, true, 100) require.NoError(t, err) + testCases := []struct { msg string v1 *Validator @@ -112,14 +112,13 @@ func TestValidatorValidateBasic(t *testing.T) { // deterministicValidator returns a deterministic validator, useful for testing. // UNSTABLE -func deterministicValidator(ctx context.Context, key crypto.PrivKey) (*Validator, PrivValidator) { +func deterministicValidator(ctx context.Context, t *testing.T, key crypto.PrivKey) (*Validator, PrivValidator) { + t.Helper() privVal := NewMockPV() privVal.PrivKey = key var votePower int64 = 50 pubKey, err := privVal.GetPubKey(ctx) - if err != nil { - panic(fmt.Errorf("could not retrieve pubkey %w", err)) - } + require.NoError(t, err, "could not retrieve pubkey") val := NewValidator(pubKey, votePower) return val, privVal } diff --git a/types/vote_set_test.go b/types/vote_set_test.go index a116180e7..a3ef9e802 100644 --- a/types/vote_set_test.go +++ b/types/vote_set_test.go @@ -21,6 +21,7 @@ func TestVoteSet_AddVote_Good(t *testing.T) { height, round := int64(1), int32(0) voteSet, _, privValidators := randVoteSet(ctx, t, height, round, tmproto.PrevoteType, 10, 1) + val0 := privValidators[0] val0p, err := val0.GetPubKey(ctx) @@ -289,6 +290,7 @@ func TestVoteSet_Conflicts(t *testing.T) { height, round := int64(1), int32(0) voteSet, _, privValidators := randVoteSet(ctx, t, height, round, tmproto.PrevoteType, 4, 1) + blockHash1 := tmrand.Bytes(32) blockHash2 := tmrand.Bytes(32) @@ -421,6 +423,7 @@ func TestVoteSet_MakeCommit(t *testing.T) { height, round := int64(1), int32(0) voteSet, _, privValidators := randVoteSet(ctx, t, height, round, tmproto.PrecommitType, 10, 1) + blockHash, blockPartSetHeader := crypto.CRandBytes(32), PartSetHeader{123, crypto.CRandBytes(32)} voteProto := &Vote{ @@ -504,18 +507,22 @@ func randVoteSet( numValidators int, votingPower int64, ) (*VoteSet, *ValidatorSet, []PrivValidator) { + t.Helper() valSet, privValidators := randValidatorPrivValSet(ctx, t, numValidators, votingPower) + return NewVoteSet("test_chain_id", height, round, signedMsgType, valSet), valSet, privValidators } func deterministicVoteSet( ctx context.Context, + t *testing.T, height int64, round int32, signedMsgType tmproto.SignedMsgType, votingPower int64, ) (*VoteSet, *ValidatorSet, []PrivValidator) { - valSet, privValidators := deterministicValidatorSet(ctx) + t.Helper() + valSet, privValidators := deterministicValidatorSet(ctx, t) return NewVoteSet("test_chain_id", height, round, signedMsgType, valSet), valSet, privValidators } @@ -528,6 +535,7 @@ func randValidatorPrivValSet(ctx context.Context, t testing.TB, numValidators in for i := 0; i < numValidators; i++ { val, privValidator, err := randValidator(ctx, false, votingPower) require.NoError(t, err) + valz[i] = val privValidators[i] = privValidator } diff --git a/types/vote_test.go b/types/vote_test.go index c4591f085..c4102229b 100644 --- a/types/vote_test.go +++ b/types/vote_test.go @@ -315,6 +315,7 @@ func getSampleCommit(ctx context.Context, t testing.TB) *Commit { lastID := makeBlockIDRandom() voteSet, _, vals := randVoteSet(ctx, t, 2, 1, tmproto.PrecommitType, 10, 1) commit, err := makeCommit(ctx, lastID, 2, 1, voteSet, vals, time.Now()) + require.NoError(t, err) return commit