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

View File

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

View File

@ -19,9 +19,6 @@
package whisperv5 package whisperv5
import ( import (
"encoding/json"
"fmt"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
) )
@ -47,19 +44,12 @@ func (topic *TopicType) String() string {
return string(common.ToHex(topic[:])) return string(common.ToHex(topic[:]))
} }
func (t *TopicType) MarshalJSON() ([]byte, error) { // MarshalText returns the hex representation of t.
return json.Marshal(hexutil.Bytes(t[:])) func (t TopicType) MarshalText() ([]byte, error) {
return hexutil.Bytes(t[:]).MarshalText()
} }
// UnmarshalJSON parses a hex representation to a topic. // UnmarshalText parses a hex representation to a topic.
func (t *TopicType) UnmarshalJSON(input []byte) error { func (t *TopicType) UnmarshalText(input []byte) error {
var data hexutil.Bytes return hexutil.UnmarshalFixedText("Topic", input, t[:])
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
} }

View File

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