// Copyright (C) 2019 Storj Labs, Inc. // See LICENSE for copying information. package kademlia_test import ( "context" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" "storj.io/storj/internal/memory" "storj.io/storj/internal/testcontext" "storj.io/storj/internal/testplanet" "storj.io/storj/pkg/kademlia" "storj.io/storj/pkg/pb" "storj.io/storj/pkg/peertls/tlsopts" "storj.io/storj/pkg/transport" ) func TestFetchPeerIdentity(t *testing.T) { testplanet.Run(t, testplanet.Config{ SatelliteCount: 1, StorageNodeCount: 1, UplinkCount: 0, }, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) { sat := planet.Satellites[0] peerID, err := planet.StorageNodes[0].Kademlia.Service.FetchPeerIdentity(ctx, sat.ID()) require.NoError(t, err) require.Equal(t, sat.ID(), peerID.ID) require.True(t, sat.Identity.Leaf.Equal(peerID.Leaf)) require.True(t, sat.Identity.CA.Equal(peerID.CA)) }) } func TestRequestInfo(t *testing.T) { testplanet.Run(t, testplanet.Config{ SatelliteCount: 1, StorageNodeCount: 1, UplinkCount: 0, }, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) { node := planet.StorageNodes[0] info, err := planet.Satellites[0].Kademlia.Service.FetchInfo(ctx, node.Local().Node) require.NoError(t, err) require.Equal(t, node.Local().Type, info.GetType()) require.Empty(t, cmp.Diff(node.Local().Operator, *info.GetOperator(), cmp.Comparer(pb.Equal))) require.Empty(t, cmp.Diff(node.Local().Capacity, *info.GetCapacity(), cmp.Comparer(pb.Equal))) require.Empty(t, cmp.Diff(node.Local().Version, *info.GetVersion(), cmp.Comparer(pb.Equal))) }) } func TestPingTimeout(t *testing.T) { testplanet.Run(t, testplanet.Config{ SatelliteCount: 1, StorageNodeCount: 4, UplinkCount: 0, }, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) { self := planet.StorageNodes[0] routingTable := self.Kademlia.RoutingTable tlsOpts, err := tlsopts.NewOptions(self.Identity, tlsopts.Config{}) require.NoError(t, err) self.Transport = transport.NewClientWithTimeout(tlsOpts, 1*time.Millisecond) network := &transport.SimulatedNetwork{ DialLatency: 300 * time.Second, BytesPerSecond: 1 * memory.KB, } slowClient := network.NewClient(self.Transport) require.NotNil(t, slowClient) newService, err := kademlia.NewService(zaptest.NewLogger(t), slowClient, routingTable, kademlia.Config{}) require.NoError(t, err) target := pb.Node{ Id: planet.StorageNodes[2].ID(), Address: &pb.NodeAddress{ Transport: pb.NodeTransport_TCP_TLS_GRPC, Address: planet.StorageNodes[2].Addr(), }, } _, err = newService.Ping(ctx, target) require.Error(t, err, context.DeadlineExceeded) require.True(t, kademlia.NodeErr.Has(err) && transport.Error.Has(err)) }) }