package types import ( "testing" "time" "github.com/stretchr/testify/require" wire "github.com/tendermint/tendermint/wire" ) var testProposal *Proposal func init() { var stamp, err = time.Parse(TimeFormat, "2018-02-11T07:09:22.765Z") if err != nil { panic(err) } testProposal = &Proposal{ Height: 12345, Round: 23456, BlockPartsHeader: PartSetHeader{111, []byte("blockparts")}, POLRound: -1, Timestamp: stamp, } } func TestProposalSignable(t *testing.T) { signBytes := testProposal.SignBytes("test_chain_id") signStr := string(signBytes) expected := `{"chain_id":"test_chain_id","proposal":{"block_parts_header":{"hash":"626C6F636B7061727473","total":111},"height":12345,"pol_block_id":{},"pol_round":-1,"round":23456,"timestamp":"2018-02-11T07:09:22.765Z"}}` if signStr != expected { t.Errorf("Got unexpected sign string for Proposal. Expected:\n%v\nGot:\n%v", expected, signStr) } } func TestProposalString(t *testing.T) { str := testProposal.String() expected := `Proposal{12345/23456 111:626C6F636B70 (-1,:0: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) } } func TestProposalVerifySignature(t *testing.T) { privVal := GenPrivValidatorFS("") pubKey := privVal.GetPubKey() prop := NewProposal(4, 2, PartSetHeader{777, []byte("proper")}, 2, BlockID{}) signBytes := prop.SignBytes("test_chain_id") // sign it signature, err := privVal.Signer.Sign(signBytes) require.NoError(t, err) // verify the same proposal valid := pubKey.VerifyBytes(prop.SignBytes("test_chain_id"), signature) require.True(t, valid) // serialize, deserialize and verify again.... newProp := new(Proposal) bs, err := wire.MarshalBinary(prop) require.NoError(t, err) err = wire.UnmarshalBinary(bs, &newProp) require.NoError(t, err) // verify the transmitted proposal newSignBytes := newProp.SignBytes("test_chain_id") require.Equal(t, string(signBytes), string(newSignBytes)) valid = pubKey.VerifyBytes(newSignBytes, signature) require.True(t, valid) } func BenchmarkProposalWriteSignBytes(b *testing.B) { for i := 0; i < b.N; i++ { testProposal.SignBytes("test_chain_id") } } func BenchmarkProposalSign(b *testing.B) { privVal := GenPrivValidatorFS("") for i := 0; i < b.N; i++ { _, err := privVal.Signer.Sign(testProposal.SignBytes("test_chain_id")) if err != nil { b.Error(err) } } } func BenchmarkProposalVerifySignature(b *testing.B) { signBytes := testProposal.SignBytes("test_chain_id") privVal := GenPrivValidatorFS("") signature, _ := privVal.Signer.Sign(signBytes) pubKey := privVal.GetPubKey() for i := 0; i < b.N; i++ { pubKey.VerifyBytes(testProposal.SignBytes("test_chain_id"), signature) } }