@cryptotaxi247 / kubo / commits / 315e121ef

feat(bitswap:message) implement FromNet

Brian Tiger Chow committed Sep 19, 2014 at 19:21 UTC 315e121ef966acb51463e667e275c88bda4539c7
2 files changed +85 -5
exchange/bitswap/message/message.go
+11 -5
@@ -1,11 +1,9 @@
1 package message
2
3 import (
4 - "errors"
5 -
6 - netmsg "github.com/jbenet/go-ipfs/net/message"
7 -
4 + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto"
5 blocks "github.com/jbenet/go-ipfs/blocks"
6 + netmsg "github.com/jbenet/go-ipfs/net/message"
7 nm "github.com/jbenet/go-ipfs/net/message"
8 peer "github.com/jbenet/go-ipfs/peer"
9 u "github.com/jbenet/go-ipfs/util"
@@ -68,7 +66,15 @@ func (m *message) AppendBlock(b blocks.Block) {
66 }
67
68 func FromNet(nmsg netmsg.NetMessage) (BitSwapMessage, error) {
71 - return nil, errors.New("TODO implement")
69 + pb := new(PBMessage)
70 + if err := proto.Unmarshal(nmsg.Data(), pb); err != nil {
71 + return nil, err
72 + }
73 + m, err := newMessageFromProto(*pb)
74 + if err != nil {
75 + return nil, err
76 + }
77 + return m, nil
78 }
79
80 func (m *message) ToProto() *PBMessage {
exchange/bitswap/message/message_test.go
+74
@@ -4,6 +4,7 @@ import (
4 "bytes"
5 "testing"
6
7 + peer "github.com/jbenet/go-ipfs/peer"
8 u "github.com/jbenet/go-ipfs/util"
9 testutil "github.com/jbenet/go-ipfs/util/testutil"
10 )
@@ -88,6 +89,79 @@ func TestCopyProtoByValue(t *testing.T) {
89 }
90 }
91
92 +func TestToNetMethodSetsPeer(t *testing.T) {
93 + m := New()
94 + p := &peer.Peer{ID: []byte("X")}
95 + netmsg, err := m.ToNet(p)
96 + if err != nil {
97 + t.Fatal(err)
98 + }
99 + if !(netmsg.Peer().Key() == p.Key()) {
100 + t.Fatal("Peer key is different")
101 + }
102 +}
103 +
104 +func TestToNetFromNetPreservesWantList(t *testing.T) {
105 + original := New()
106 + original.AppendWanted(u.Key("M"))
107 + original.AppendWanted(u.Key("B"))
108 + original.AppendWanted(u.Key("D"))
109 + original.AppendWanted(u.Key("T"))
110 + original.AppendWanted(u.Key("F"))
111 +
112 + netmsg, err := original.ToNet(&peer.Peer{ID: []byte("X")})
113 + if err != nil {
114 + t.Fatal(err)
115 + }
116 +
117 + copied, err := FromNet(netmsg)
118 + if err != nil {
119 + t.Fatal(err)
120 + }
121 +
122 + keys := make(map[u.Key]bool)
123 + for _, k := range copied.Wantlist() {
124 + keys[k] = true
125 + }
126 +
127 + for _, k := range original.Wantlist() {
128 + if _, ok := keys[k]; !ok {
129 + t.Fatalf("Key Missing: \"%v\"", k)
130 + }
131 + }
132 +}
133 +
134 +func TestToAndFromNetMessage(t *testing.T) {
135 +
136 + original := New()
137 + original.AppendBlock(testutil.NewBlockOrFail(t, "W"))
138 + original.AppendBlock(testutil.NewBlockOrFail(t, "E"))
139 + original.AppendBlock(testutil.NewBlockOrFail(t, "F"))
140 + original.AppendBlock(testutil.NewBlockOrFail(t, "M"))
141 +
142 + p := &peer.Peer{ID: []byte("X")}
143 + netmsg, err := original.ToNet(p)
144 + if err != nil {
145 + t.Fatal(err)
146 + }
147 +
148 + m2, err := FromNet(netmsg)
149 + if err != nil {
150 + t.Fatal(err)
151 + }
152 +
153 + keys := make(map[u.Key]bool)
154 + for _, b := range m2.Blocks() {
155 + keys[b.Key()] = true
156 + }
157 +
158 + for _, b := range original.Blocks() {
159 + if _, ok := keys[b.Key()]; !ok {
160 + t.Fail()
161 + }
162 + }
163 +}
164 +
165 func contains(s []string, x string) bool {
166 for _, a := range s {
167 if a == x {