test GetPutRecord
validate doesn't work. the peer's public key is not present in the peerstore.
Brian Tiger Chow committed
Feb 4, 2015 at 15:17 UTC
2298cf66cf30eb29e528b1a0242e91a90a8c0ab3
2 files changed
+71
-1
routing/supernode/server.go
+21
-1
@@ -8,6 +8,7 @@ import (
8
datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
9
peer "github.com/jbenet/go-ipfs/p2p/peer"
10
dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb"
11
+ record "github.com/jbenet/go-ipfs/routing/record"
12
proxy "github.com/jbenet/go-ipfs/routing/supernode/proxy"
13
util "github.com/jbenet/go-ipfs/util"
14
errors "github.com/jbenet/go-ipfs/util/debugerror"
@@ -55,7 +56,12 @@ func (s *Server) handleMessage(
56
return p, response
57
58
case dhtpb.Message_PUT_VALUE:
58
- // TODO before merging: verifyRecord(req.GetRecord())
59
+ // FIXME: verify complains that the peer's ID is not present in the
60
+ // peerstore. Mocknet problem?
61
+ // if err := verify(s.peerstore, req.GetRecord()); err != nil {
62
+ // log.Event(ctx, "validationFailed", req, p)
63
+ // return "", nil
64
+ // }
65
putRoutingRecord(s.routingBackend, util.Key(req.GetKey()), req.GetRecord())
66
return p, req
67
@@ -191,3 +197,17 @@ func getRoutingProviders(ds datastore.Datastore, k util.Key) ([]*dhtpb.Message_P
197
func providerKey(k util.Key) datastore.Key {
198
return datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()})
199
}
200
+
201
+func verify(ps peer.Peerstore, r *dhtpb.Record) error {
202
+ v := make(record.Validator)
203
+ v["pk"] = record.ValidatePublicKeyRecord
204
+ p := peer.ID(r.GetAuthor())
205
+ pk := ps.PubKey(p)
206
+ if pk == nil {
207
+ return fmt.Errorf("do not have public key for %s", p)
208
+ }
209
+ if err := v.VerifyRecord(r, pk); err != nil {
210
+ return err
211
+ }
212
+ return nil
213
+}
test/integration/grandcentral_test.go
+50
@@ -2,6 +2,7 @@ package integrationtest
2
3
import (
4
"bytes"
5
+ "fmt"
6
"io"
7
"math"
8
"testing"
@@ -16,6 +17,7 @@ import (
17
"github.com/jbenet/go-ipfs/p2p/peer"
18
"github.com/jbenet/go-ipfs/thirdparty/iter"
19
"github.com/jbenet/go-ipfs/thirdparty/unit"
20
+ "github.com/jbenet/go-ipfs/util"
21
ds2 "github.com/jbenet/go-ipfs/util/datastore2"
22
errors "github.com/jbenet/go-ipfs/util/debugerror"
23
testutil "github.com/jbenet/go-ipfs/util/testutil"
@@ -132,3 +134,51 @@ func InitializeSupernodeNetwork(
134
}
135
return servers, clients, nil
136
}
137
+
138
+func TestSupernodePutRecordGetRecord(t *testing.T) {
139
+ // create 8 supernode-routing bootstrap nodes
140
+ // create 2 supernode-routing clients both bootstrapped to the bootstrap nodes
141
+ // let the bootstrap nodes share a single datastore
142
+ // add a large file on one node then cat the file from the other
143
+ conf := testutil.LatencyConfig{
144
+ NetworkLatency: 0,
145
+ RoutingLatency: 0,
146
+ BlockstoreLatency: 0,
147
+ }
148
+ if err := RunSupernodePutRecordGetRecord(conf); err != nil {
149
+ t.Fatal(err)
150
+ }
151
+}
152
+
153
+func RunSupernodePutRecordGetRecord(conf testutil.LatencyConfig) error {
154
+ ctx, cancel := context.WithCancel(context.Background())
155
+ defer cancel()
156
+
157
+ servers, clients, err := InitializeSupernodeNetwork(ctx, 2, 2, conf)
158
+ if err != nil {
159
+ return err
160
+ }
161
+ for _, n := range append(servers, clients...) {
162
+ defer n.Close()
163
+ }
164
+
165
+ putter := clients[0]
166
+ getter := clients[1]
167
+
168
+ k := util.Key("key")
169
+ note := []byte("a note from putter")
170
+
171
+ if err := putter.Routing.PutValue(ctx, k, note); err != nil {
172
+ return fmt.Errorf("failed to put value: %s", err)
173
+ }
174
+
175
+ received, err := getter.Routing.GetValue(ctx, k)
176
+ if err != nil {
177
+ return fmt.Errorf("failed to get value: %s", err)
178
+ }
179
+
180
+ if 0 != bytes.Compare(note, received) {
181
+ return errors.New("record doesn't match")
182
+ }
183
+ return nil
184
+}