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 {