tests: document RLP tests
This commit is contained in:
		| @@ -13,11 +13,22 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | // RLPTest is the JSON structure of a single RLP test. | ||||||
| type RLPTest struct { | type RLPTest struct { | ||||||
|  | 	// If the value of In is "INVALID" or "VALID", the test | ||||||
|  | 	// checks whether Out can be decoded into a value of | ||||||
|  | 	// type interface{}. | ||||||
|  | 	// | ||||||
|  | 	// For other JSON values, In is treated as a driver for | ||||||
|  | 	// calls to rlp.Stream. The test also verifies that encoding | ||||||
|  | 	// In produces the bytes in Out. | ||||||
| 	In interface{} | 	In interface{} | ||||||
|  |  | ||||||
|  | 	// Out is a hex-encoded RLP value. | ||||||
| 	Out string | 	Out string | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // RunRLPTest runs the tests in the given file, skipping tests by name. | ||||||
| func RunRLPTest(file string, skip []string) error { | func RunRLPTest(file string, skip []string) error { | ||||||
| 	f, err := os.Open(file) | 	f, err := os.Open(file) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -27,6 +38,7 @@ func RunRLPTest(file string, skip []string) error { | |||||||
| 	return RunRLPTestWithReader(f, skip) | 	return RunRLPTestWithReader(f, skip) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // RunRLPTest runs the tests encoded in r, skipping tests by name. | ||||||
| func RunRLPTestWithReader(r io.Reader, skip []string) error { | func RunRLPTestWithReader(r io.Reader, skip []string) error { | ||||||
| 	var tests map[string]*RLPTest | 	var tests map[string]*RLPTest | ||||||
| 	if err := readJson(r, &tests); err != nil { | 	if err := readJson(r, &tests); err != nil { | ||||||
| @@ -49,6 +61,8 @@ func (t *RLPTest) Run() error { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("invalid hex in Out") | 		return fmt.Errorf("invalid hex in Out") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// Handle simple decoding tests with no actual In value. | ||||||
| 	if t.In == "VALID" || t.In == "INVALID" { | 	if t.In == "VALID" || t.In == "INVALID" { | ||||||
| 		return checkDecodeInterface(outb, t.In == "VALID") | 		return checkDecodeInterface(outb, t.In == "VALID") | ||||||
| 	} | 	} | ||||||
| @@ -62,7 +76,7 @@ func (t *RLPTest) Run() error { | |||||||
| 	if !bytes.Equal(b, outb) { | 	if !bytes.Equal(b, outb) { | ||||||
| 		return fmt.Errorf("encode produced %x, want %x", b, outb) | 		return fmt.Errorf("encode produced %x, want %x", b, outb) | ||||||
| 	} | 	} | ||||||
| 	// Test decoding from a stream. | 	// Test stream decoding. | ||||||
| 	s := rlp.NewStream(bytes.NewReader(outb), 0) | 	s := rlp.NewStream(bytes.NewReader(outb), 0) | ||||||
| 	return checkDecodeFromJSON(s, in) | 	return checkDecodeFromJSON(s, in) | ||||||
| } | } | ||||||
| @@ -103,8 +117,10 @@ func translateJSON(v interface{}) interface{} { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // checkDecodeFromJSON decodes from s guided by exp. For each JSON | // checkDecodeFromJSON decodes from s guided by exp. exp drives the | ||||||
| // value, the value decoded from the RLP stream must match. | // Stream by invoking decoding operations (Uint, Big, List, ...) based | ||||||
|  | // on the type of each value. The value decoded from the RLP stream | ||||||
|  | // must match the JSON value. | ||||||
| func checkDecodeFromJSON(s *rlp.Stream, exp interface{}) error { | func checkDecodeFromJSON(s *rlp.Stream, exp interface{}) error { | ||||||
| 	switch exp := exp.(type) { | 	switch exp := exp.(type) { | ||||||
| 	case uint64: | 	case uint64: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user