light: model-based tests (#5461)

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
This commit is contained in:
Anton Kaliaev
2020-11-02 12:07:18 +04:00
committed by GitHub
parent 886235311f
commit 8e6194626e
13 changed files with 3656 additions and 3 deletions
+17 -2
View File
@@ -1,7 +1,9 @@
package bytes
import (
"bytes"
"encoding/hex"
"encoding/json"
"fmt"
"strings"
)
@@ -9,6 +11,11 @@ import (
// 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
@@ -20,7 +27,8 @@ func (bz *HexBytes) Unmarshal(data []byte) error {
return nil
}
// This is the point of Bytes.
// 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)
@@ -30,16 +38,23 @@ func (bz HexBytes) MarshalJSON() ([]byte, error) {
return jbz, nil
}
// This is the point of Bytes.
// 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
}