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.NoError(t, err) assert.Equal(t, bz, bz2) var dataB2 HexBytes err = (&dataB2).Unmarshal(bz) assert.NoError(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) } }