whisper: use hexutil.UnmarshalFixedText for topic parsing

This commit is contained in:
Bas van Kervel 2017-06-21 12:58:00 +02:00
parent a4e4c76cb3
commit c62d5422bb
3 changed files with 27 additions and 34 deletions

@ -35,7 +35,7 @@ var (
Action: utils.MigrateFlags(localConsole),
Name: "console",
Usage: "Start an interactive JavaScript environment",
Flags: append(append(nodeFlags, rpcFlags...), consoleFlags...),
Flags: append(append(append(nodeFlags, rpcFlags...), consoleFlags...), whisperFlags...),
Category: "CONSOLE COMMANDS",
Description: `
The Geth console is an interactive shell for the JavaScript runtime environment

@ -19,9 +19,6 @@
package whisperv5
import (
"encoding/json"
"fmt"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
)
@ -47,19 +44,12 @@ func (topic *TopicType) String() string {
return string(common.ToHex(topic[:]))
}
func (t *TopicType) MarshalJSON() ([]byte, error) {
return json.Marshal(hexutil.Bytes(t[:]))
// MarshalText returns the hex representation of t.
func (t TopicType) MarshalText() ([]byte, error) {
return hexutil.Bytes(t[:]).MarshalText()
}
// UnmarshalJSON parses a hex representation to a topic.
func (t *TopicType) UnmarshalJSON(input []byte) error {
var data hexutil.Bytes
if err := json.Unmarshal(input, &data); err != nil {
return err
}
if len(data) != TopicLength {
return fmt.Errorf("unmarshalJSON failed: topic must be exactly %d bytes(%d)", TopicLength, len(input))
}
*t = BytesToTopic(data)
return nil
// UnmarshalText parses a hex representation to a topic.
func (t *TopicType) UnmarshalText(input []byte) error {
return hexutil.UnmarshalFixedText("Topic", input, t[:])
}

@ -16,7 +16,10 @@
package whisperv5
import "testing"
import (
"encoding/json"
"testing"
)
var topicStringTests = []struct {
topic TopicType
@ -53,15 +56,6 @@ var bytesToTopicTests = []struct {
{topic: TopicType{0x00, 0x00, 0x00, 0x00}, data: nil},
}
func TestBytesToTopic(t *testing.T) {
for i, tst := range bytesToTopicTests {
top := BytesToTopic(tst.data)
if top != tst.topic {
t.Fatalf("failed test %d: have %v, want %v.", i, t, tst.topic)
}
}
}
var unmarshalTestsGood = []struct {
topic TopicType
data []byte
@ -94,14 +88,23 @@ var unmarshalTestsUgly = []struct {
{topic: TopicType{0x01, 0x00, 0x00, 0x00}, data: []byte(`"0x00000001"`)},
}
func TestBytesToTopic(t *testing.T) {
for i, tst := range bytesToTopicTests {
top := BytesToTopic(tst.data)
if top != tst.topic {
t.Fatalf("failed test %d: have %v, want %v.", i, t, tst.topic)
}
}
}
func TestUnmarshalTestsGood(t *testing.T) {
for i, tst := range unmarshalTestsGood {
var top TopicType
err := top.UnmarshalJSON(tst.data)
err := json.Unmarshal(tst.data, &top)
if err != nil {
t.Fatalf("failed test %d. input: %v. err: %v", i, tst.data, err)
t.Errorf("failed test %d. input: %v. err: %v", i, tst.data, err)
} else if top != tst.topic {
t.Fatalf("failed test %d: have %v, want %v.", i, t, tst.topic)
t.Errorf("failed test %d: have %v, want %v.", i, t, tst.topic)
}
}
}
@ -110,7 +113,7 @@ func TestUnmarshalTestsBad(t *testing.T) {
// in this test UnmarshalJSON() is supposed to fail
for i, tst := range unmarshalTestsBad {
var top TopicType
err := top.UnmarshalJSON(tst.data)
err := json.Unmarshal(tst.data, &top)
if err == nil {
t.Fatalf("failed test %d. input: %v.", i, tst.data)
}
@ -121,11 +124,11 @@ func TestUnmarshalTestsUgly(t *testing.T) {
// in this test UnmarshalJSON() is NOT supposed to fail, but result should be wrong
for i, tst := range unmarshalTestsUgly {
var top TopicType
err := top.UnmarshalJSON(tst.data)
err := json.Unmarshal(tst.data, &top)
if err != nil {
t.Fatalf("failed test %d. input: %v.", i, tst.data)
t.Errorf("failed test %d. input: %v.", i, tst.data)
} else if top == tst.topic {
t.Fatalf("failed test %d: have %v, want %v.", i, top, tst.topic)
t.Errorf("failed test %d: have %v, want %v.", i, top, tst.topic)
}
}
}