mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-09 14:43:19 +00:00
As written, the encoding step unnecessarily made and moved multiple copies of the encoded representation. Reduce this to a single allocation and encode the data in-place so that a shift is no longer required. Also: Add a test to ensure letter digits are capitalized, which was previously not verified but was expected downstream. No functional changes.
75 lines
1.6 KiB
Go
75 lines
1.6 KiB
Go
package bytes
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strconv"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
// This is a trivial test for protobuf compatibility.
|
|
func TestMarshal(t *testing.T) {
|
|
bz := []byte("hello world")
|
|
dataB := HexBytes(bz)
|
|
bz2, err := dataB.Marshal()
|
|
assert.Nil(t, err)
|
|
assert.Equal(t, bz, bz2)
|
|
|
|
var dataB2 HexBytes
|
|
err = (&dataB2).Unmarshal(bz)
|
|
assert.Nil(t, err)
|
|
assert.Equal(t, dataB, dataB2)
|
|
}
|
|
|
|
// Test that the hex encoding works.
|
|
func TestJSONMarshal(t *testing.T) {
|
|
type TestStruct struct {
|
|
B1 []byte
|
|
B2 HexBytes
|
|
}
|
|
|
|
cases := []struct {
|
|
input []byte
|
|
expected string
|
|
}{
|
|
{[]byte(``), `{"B1":"","B2":""}`},
|
|
{[]byte(`a`), `{"B1":"YQ==","B2":"61"}`},
|
|
{[]byte(`abc`), `{"B1":"YWJj","B2":"616263"}`},
|
|
{[]byte("\x1a\x2b\x3c"), `{"B1":"Gis8","B2":"1A2B3C"}`},
|
|
}
|
|
|
|
for i, tc := range cases {
|
|
tc := tc
|
|
t.Run(fmt.Sprintf("Case %d", i), func(t *testing.T) {
|
|
ts := TestStruct{B1: tc.input, B2: tc.input}
|
|
|
|
// Test that it marshals correctly to JSON.
|
|
jsonBytes, err := json.Marshal(ts)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
assert.Equal(t, string(jsonBytes), tc.expected)
|
|
|
|
// TODO do fuzz testing to ensure that unmarshal fails
|
|
|
|
// Test that unmarshaling works correctly.
|
|
ts2 := TestStruct{}
|
|
err = json.Unmarshal(jsonBytes, &ts2)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
assert.Equal(t, ts2.B1, tc.input)
|
|
assert.Equal(t, ts2.B2, HexBytes(tc.input))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestHexBytes_String(t *testing.T) {
|
|
hs := HexBytes([]byte("test me"))
|
|
if _, err := strconv.ParseInt(hs.String(), 16, 64); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|