diff --git a/peer/addrinfo_serde.go b/peer/addrinfo_serde.go index 1df24e2b..1afeddfb 100644 --- a/peer/addrinfo_serde.go +++ b/peer/addrinfo_serde.go @@ -2,6 +2,7 @@ package peer import ( "encoding/json" + "errors" ma "github.com/multiformats/go-multiaddr" ) @@ -19,19 +20,25 @@ func (pi AddrInfo) MarshalJSON() ([]byte, error) { func (pi *AddrInfo) UnmarshalJSON(b []byte) error { var data map[string]interface{} - err := json.Unmarshal(b, &data) - if err != nil { + if err := json.Unmarshal(b, &data); err != nil { return err } - pid, err := IDB58Decode(data["ID"].(string)) - if err != nil { - return err + id, ok := data["ID"] + if !ok { + return errors.New("no peer ID") + } + if idString, ok := id.(string); ok { + pid, err := IDB58Decode(idString) + if err != nil { + return err + } + pi.ID = pid } - pi.ID = pid - addrs, ok := data["Addrs"].([]interface{}) - if ok { - for _, a := range addrs { - pi.Addrs = append(pi.Addrs, ma.StringCast(a.(string))) + if addrsEntry, ok := data["Addrs"]; ok { + if addrs, ok := addrsEntry.([]interface{}); ok { + for _, a := range addrs { + pi.Addrs = append(pi.Addrs, ma.StringCast(a.(string))) + } } } return nil diff --git a/peer/addrinfo_test.go b/peer/addrinfo_test.go index b902fdf3..ef2cf50c 100644 --- a/peer/addrinfo_test.go +++ b/peer/addrinfo_test.go @@ -133,3 +133,30 @@ func TestAddrInfosFromP2pAddrs(t *testing.T) { delete(expected, info.ID.Pretty()) } } + +func TestAddrInfoJSON(t *testing.T) { + t.Run("valid AddrInfo", func(t *testing.T) { + ai := AddrInfo{ID: testID, Addrs: []ma.Multiaddr{maddrFull}} + out, err := ai.MarshalJSON() + if err != nil { + t.Fatal(err) + } + var addrInfo AddrInfo + if err := addrInfo.UnmarshalJSON(out); err != nil { + t.Fatal(err) + } + if addrInfo.ID != testID { + t.Fatalf("expected ID to equal %s, got %s", testID.Pretty(), addrInfo.ID.Pretty()) + } + if len(addrInfo.Addrs) != 1 || !addrInfo.Addrs[0].Equal(maddrFull) { + t.Fatalf("expected addrs to match %v, got %v", maddrFull, addrInfo.Addrs) + } + }) + t.Run("missing ID", func(t *testing.T) { + s := []byte(`{"Addrs":["/ip4/127.0.0.1/tcp/1234/p2p/QmS3zcG7LhYZYSJMhyRZvTddvbNUqtt8BJpaSs6mi1K5Va"]}`) + var addrInfo AddrInfo + if err := addrInfo.UnmarshalJSON(s); err == nil || err.Error() != "no peer ID" { + t.Fatalf("expected no peer ID error, got %v", err) + } + }) +}