Skip to content

Commit

Permalink
Merge pull request #3507 from ipfs/fix/pbnode-json
Browse files Browse the repository at this point in the history
merkledag: fix json marshalling of pbnode
  • Loading branch information
whyrusleeping authored Dec 16, 2016
2 parents f6948bb + 7c8a8a8 commit 56bc19b
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 1 deletion.
4 changes: 3 additions & 1 deletion merkledag/coding.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ func (n *ProtoNode) getPBNode() *pb.PBNode {
pbn.Links[i] = &pb.PBLink{}
pbn.Links[i].Name = &l.Name
pbn.Links[i].Tsize = &l.Size
pbn.Links[i].Hash = l.Cid.Bytes()
if l.Cid != nil {
pbn.Links[i].Hash = l.Cid.Bytes()
}
}

if len(n.data) > 0 {
Expand Down
26 changes: 26 additions & 0 deletions merkledag/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package merkledag

import (
"context"
"encoding/json"
"fmt"

node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node"
Expand Down Expand Up @@ -228,6 +229,31 @@ func (n *ProtoNode) Loggable() map[string]interface{} {
}
}

func (n *ProtoNode) UnmarshalJSON(b []byte) error {
s := struct {
Data []byte `json:"data"`
Links []*node.Link `json:"links"`
}{}

err := json.Unmarshal(b, &s)
if err != nil {
return err
}

n.data = s.Data
n.links = s.Links
return nil
}

func (n *ProtoNode) MarshalJSON() ([]byte, error) {
out := map[string]interface{}{
"data": n.data,
"links": n.links,
}

return json.Marshal(out)
}

func (n *ProtoNode) Cid() *cid.Cid {
if n.encoded != nil && n.cached != nil {
return n.cached
Expand Down
30 changes: 30 additions & 0 deletions merkledag/node_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package merkledag_test

import (
"bytes"
"context"
"testing"

Expand Down Expand Up @@ -128,3 +129,32 @@ func TestNodeCopy(t *testing.T) {
t.Fatal("should be different objects")
}
}

func TestJsonRoundtrip(t *testing.T) {
nd := new(ProtoNode)
nd.SetLinks([]*node.Link{
{Name: "a"},
{Name: "c"},
{Name: "b"},
})
nd.SetData([]byte("testing"))

jb, err := nd.MarshalJSON()
if err != nil {
t.Fatal(err)
}

nn := new(ProtoNode)
err = nn.UnmarshalJSON(jb)
if err != nil {
t.Fatal(err)
}

if !bytes.Equal(nn.Data(), nd.Data()) {
t.Fatal("data wasnt the same")
}

if !nn.Cid().Equals(nd.Cid()) {
t.Fatal("objects differed after marshaling")
}
}
13 changes: 13 additions & 0 deletions test/sharness/t0053-dag.sh
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,19 @@ test_dag_cmd() {
test_cmp file2 out2 &&
test_cmp file3 out3
'

test_expect_success "add a normal file" '
HASH=$(echo "foobar" | ipfs add -q)
'

test_expect_success "can view protobuf object with dag get" '
ipfs dag get $HASH > dag_get_pb_out
'

test_expect_success "output looks correct" '
echo "{\"data\":\"CAISB2Zvb2JhcgoYBw==\",\"links\":[]}" > dag_get_pb_exp &&
test_cmp dag_get_pb_exp dag_get_pb_out
'
}

# should work offline
Expand Down

0 comments on commit 56bc19b

Please sign in to comment.