mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-10 15:07:24 +00:00
This is the first iteration of model-based testing in Go Tendermint. The test runner is using the static JSON fixtures located under the ./json directory. In the future, the Rust tensgen binary will be used to generate those (given the static intermediate scenarios and the test seed, which will be published along with each testgen release). Closes: #5322
78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
package bytes
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// The main purpose of HexBytes is to enable HEX-encoding for json/encoding.
|
|
type HexBytes []byte
|
|
|
|
var (
|
|
_ json.Marshaler = HexBytes{}
|
|
_ json.Unmarshaler = &HexBytes{}
|
|
)
|
|
|
|
// Marshal needed for protobuf compatibility
|
|
func (bz HexBytes) Marshal() ([]byte, error) {
|
|
return bz, nil
|
|
}
|
|
|
|
// Unmarshal needed for protobuf compatibility
|
|
func (bz *HexBytes) Unmarshal(data []byte) error {
|
|
*bz = data
|
|
return nil
|
|
}
|
|
|
|
// MarshalJSON implements the json.Marshaler interface. The hex bytes is a
|
|
// quoted hexadecimal encoded string.
|
|
func (bz HexBytes) MarshalJSON() ([]byte, error) {
|
|
s := strings.ToUpper(hex.EncodeToString(bz))
|
|
jbz := make([]byte, len(s)+2)
|
|
jbz[0] = '"'
|
|
copy(jbz[1:], s)
|
|
jbz[len(jbz)-1] = '"'
|
|
return jbz, nil
|
|
}
|
|
|
|
// UnmarshalJSON implements the json.Umarshaler interface.
|
|
func (bz *HexBytes) UnmarshalJSON(data []byte) error {
|
|
if bytes.Equal(data, []byte("null")) {
|
|
return nil
|
|
}
|
|
|
|
if len(data) < 2 || data[0] != '"' || data[len(data)-1] != '"' {
|
|
return fmt.Errorf("invalid hex string: %s", data)
|
|
}
|
|
|
|
bz2, err := hex.DecodeString(string(data[1 : len(data)-1]))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
*bz = bz2
|
|
|
|
return nil
|
|
}
|
|
|
|
// Allow it to fulfill various interfaces in light-client, etc...
|
|
func (bz HexBytes) Bytes() []byte {
|
|
return bz
|
|
}
|
|
|
|
func (bz HexBytes) String() string {
|
|
return strings.ToUpper(hex.EncodeToString(bz))
|
|
}
|
|
|
|
func (bz HexBytes) Format(s fmt.State, verb rune) {
|
|
switch verb {
|
|
case 'p':
|
|
s.Write([]byte(fmt.Sprintf("%p", bz)))
|
|
default:
|
|
s.Write([]byte(fmt.Sprintf("%X", []byte(bz))))
|
|
}
|
|
}
|