package types
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/golang/protobuf/proto"
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/tendermint/tendermint/types/proto3"
|
|
)
|
|
|
|
func TestProto3Compatibility(t *testing.T) {
|
|
tm, err := time.Parse("Mon Jan 2 15:04:05 -0700 MST 2006", "Mon Jan 2 15:04:05 -0700 MST 2006")
|
|
assert.NoError(t, err)
|
|
// add some nanos, otherwise protobuf will skip over this while amino (still) won't!
|
|
tm = tm.Add(50000 * time.Nanosecond)
|
|
seconds := tm.Unix()
|
|
nanos := int32(tm.Nanosecond())
|
|
t.Log("seconds", seconds)
|
|
t.Log("nanos", nanos)
|
|
|
|
pbHeader := proto3.Header{
|
|
ChainID: "cosmos",
|
|
Height: 150,
|
|
Time: &proto3.Timestamp{Seconds: seconds, Nanos: nanos},
|
|
NumTxs: 7,
|
|
LastBlockID: &proto3.BlockID{
|
|
Hash: []byte("some serious hashing"),
|
|
PartsHeader: &proto3.PartSetHeader{
|
|
Total: 8,
|
|
Hash: []byte("some more serious hashing"),
|
|
},
|
|
},
|
|
TotalTxs: 100,
|
|
LastCommitHash: []byte("commit hash"),
|
|
DataHash: []byte("data hash"),
|
|
ValidatorsHash: []byte("validators hash"),
|
|
}
|
|
aminoHeader := Header{
|
|
ChainID: "cosmos",
|
|
Height: 150,
|
|
Time: tm,
|
|
NumTxs: 7,
|
|
LastBlockID: BlockID{
|
|
Hash: []byte("some serious hashing"),
|
|
PartsHeader: PartSetHeader{
|
|
Total: 8,
|
|
Hash: []byte("some more serious hashing"),
|
|
},
|
|
},
|
|
TotalTxs: 100,
|
|
LastCommitHash: []byte("commit hash"),
|
|
DataHash: []byte("data hash"),
|
|
ValidatorsHash: []byte("validators hash"),
|
|
}
|
|
ab, err := cdc.MarshalBinaryBare(aminoHeader)
|
|
assert.NoError(t, err, "unexpected error")
|
|
|
|
pb, err := proto.Marshal(&pbHeader)
|
|
assert.NoError(t, err, "unexpected error")
|
|
// This works:
|
|
assert.Equal(t, ab, pb, "encoding doesn't match")
|
|
|
|
emptyLastBlockPb := proto3.Header{
|
|
ChainID: "cosmos",
|
|
Height: 150,
|
|
Time: &proto3.Timestamp{Seconds: seconds, Nanos: nanos},
|
|
NumTxs: 7,
|
|
// This is not fully skipped in amino (yet) although it is empty:
|
|
LastBlockID: &proto3.BlockID{
|
|
PartsHeader: &proto3.PartSetHeader{
|
|
},
|
|
},
|
|
TotalTxs: 100,
|
|
LastCommitHash: []byte("commit hash"),
|
|
DataHash: []byte("data hash"),
|
|
ValidatorsHash: []byte("validators hash"),
|
|
}
|
|
emptyLastBlockAm := Header{
|
|
ChainID: "cosmos",
|
|
Height: 150,
|
|
Time: tm,
|
|
NumTxs: 7,
|
|
TotalTxs: 100,
|
|
LastCommitHash: []byte("commit hash"),
|
|
DataHash: []byte("data hash"),
|
|
ValidatorsHash: []byte("validators hash"),
|
|
}
|
|
|
|
ab, err = cdc.MarshalBinaryBare(emptyLastBlockAm)
|
|
assert.NoError(t, err, "unexpected error")
|
|
|
|
pb, err = proto.Marshal(&emptyLastBlockPb)
|
|
assert.NoError(t, err, "unexpected error")
|
|
// This works:
|
|
assert.Equal(t, ab, pb, "encoding doesn't match")
|
|
|
|
pb, err = proto.Marshal(&proto3.Header{})
|
|
assert.NoError(t, err, "unexpected error")
|
|
t.Log(pb)
|
|
|
|
// While in protobuf Header{} encodes to an empty byte slice it does not in amino:
|
|
ab, err = cdc.MarshalBinaryBare(Header{})
|
|
assert.NoError(t, err, "unexpected error")
|
|
t.Log(ab)
|
|
|
|
pb, err = proto.Marshal(&proto3.Timestamp{})
|
|
assert.NoError(t, err, "unexpected error")
|
|
t.Log(pb)
|
|
|
|
ab, err = cdc.MarshalBinaryBare(time.Time{})
|
|
assert.NoError(t, err, "unexpected error")
|
|
t.Log(ab)
|
|
}
|