diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go new file mode 100644 index 00000000000..629206b4e2c --- /dev/null +++ b/routing/offline/offline_test.go @@ -0,0 +1,79 @@ +package offline + +import ( + "bytes" + "context" + "github.com/ipfs/go-ipfs/thirdparty/testutil" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + "testing" +) + +func TestOfflineRouterStorage(t *testing.T) { + ctx := context.Background() + + nds := ds.NewMapDatastore() + privkey, _, _ := testutil.RandTestKeyPair(128) + offline := NewOfflineRouter(nds, privkey) + + err := offline.PutValue(ctx, "key", []byte("testing 1 2 3")) + if err != nil { + t.Fatal(err) + } + + val, err := offline.GetValue(ctx, "key") + if !bytes.Equal([]byte("testing 1 2 3"), val) { + t.Fatal("OfflineRouter does not properly store") + } + + val, err = offline.GetValue(ctx, "notHere") + if err == nil { + t.Fatal("Router should throw errors for unfound records") + } + + recVal, err := offline.GetValues(ctx, "key", 0) + if err != nil { + t.Fatal(err) + } + + _, err = offline.GetValues(ctx, "notHere", 0) + if err == nil { + t.Fatal("Router should throw errors for unfound records") + } + + local := recVal[0].Val + if !bytes.Equal([]byte("testing 1 2 3"), local) { + t.Fatal("OfflineRouter does not properly store") + } +} + +func TestOfflineRouterLocal(t *testing.T) { + ctx := context.Background() + + nds := ds.NewMapDatastore() + privkey, _, _ := testutil.RandTestKeyPair(128) + offline := NewOfflineRouter(nds, privkey) + + id, _ := testutil.RandPeerID() + _, err := offline.FindPeer(ctx, id) + if err != ErrOffline { + t.Fatal("OfflineRouting should alert that its offline") + } + + cid, _ := testutil.RandCidV0() + pChan := offline.FindProvidersAsync(ctx, cid, 1) + p, ok := <-pChan + if ok { + t.Fatalf("FindProvidersAsync did not return a closed channel. Instead we got %+v !", p) + } + + cid, _ = testutil.RandCidV0() + err = offline.Provide(ctx, cid) + if err != ErrOffline { + t.Fatal("OfflineRouting should alert that its offline") + } + + err = offline.Bootstrap(ctx) + if err != nil { + t.Fatal("You shouldn't be able to bootstrap offline routing.") + } +} diff --git a/thirdparty/testutil/gen.go b/thirdparty/testutil/gen.go index 9212b4d0887..fc9e0ef45bf 100644 --- a/thirdparty/testutil/gen.go +++ b/thirdparty/testutil/gen.go @@ -9,6 +9,7 @@ import ( "testing" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" @@ -50,6 +51,14 @@ func RandPeerID() (peer.ID, error) { return peer.ID(h), nil } +func RandCidV0() (*cid.Cid, error) { + buf := make([]byte, 16) + if _, err := io.ReadFull(u.NewTimeSeededRand(), buf); err != nil { + return &cid.Cid{}, err + } + return cid.NewCidV0(buf), nil +} + func RandPeerIDFatal(t testing.TB) peer.ID { p, err := RandPeerID() if err != nil {