// Copyright (C) 2018 Storj Labs, Inc. // See LICENSE for copying information. package overlay import ( "context" "net" "testing" "github.com/stretchr/testify/assert" "google.golang.org/grpc" "storj.io/storj/pkg/dht" "storj.io/storj/pkg/provider" proto "storj.io/storj/protos/overlay" ) type mockNodeID struct { } func (m mockNodeID) String() string { return "foobar" } func (m mockNodeID) Bytes() []byte { return []byte("foobar") } func TestNewOverlayClient(t *testing.T) { cases := []struct { address string }{ { address: "127.0.0.1:8080", }, } for _, v := range cases { ca, err := provider.NewCA(ctx, 12, 4) assert.NoError(t, err) identity, err := ca.NewIdentity() assert.NoError(t, err) oc, err := NewOverlayClient(identity, v.address) assert.NoError(t, err) assert.NotNil(t, oc) assert.NotEmpty(t, oc.client) } } func TestChoose(t *testing.T) { cases := []struct { limit int space int64 expectedCalls int }{ { limit: 50, space: 100, expectedCalls: 1, }, } for _, v := range cases { lis, err := net.Listen("tcp", "127.0.0.1:0") assert.NoError(t, err) srv, mock, err := newTestServer(ctx) assert.NoError(t, err) go srv.Serve(lis) defer srv.Stop() ca, err := provider.NewCA(ctx, 12, 4) assert.NoError(t, err) identity, err := ca.NewIdentity() assert.NoError(t, err) oc, err := NewOverlayClient(identity, lis.Addr().String()) assert.NoError(t, err) assert.NotNil(t, oc) assert.NotEmpty(t, oc.client) _, err = oc.Choose(ctx, v.limit, v.space) assert.NoError(t, err) assert.Equal(t, mock.FindStorageNodesCalled, v.expectedCalls) } } func TestLookup(t *testing.T) { cases := []struct { nodeID dht.NodeID expectedCalls int }{ { nodeID: mockNodeID{}, expectedCalls: 1, }, } for _, v := range cases { lis, err := net.Listen("tcp", "127.0.0.1:0") assert.NoError(t, err) srv, mock, err := newTestServer(ctx) assert.NoError(t, err) go srv.Serve(lis) defer srv.Stop() ca, err := provider.NewCA(ctx, 12, 4) assert.NoError(t, err) identity, err := ca.NewIdentity() assert.NoError(t, err) oc, err := NewOverlayClient(identity, lis.Addr().String()) assert.NoError(t, err) assert.NotNil(t, oc) assert.NotEmpty(t, oc.client) _, err = oc.Lookup(ctx, v.nodeID) assert.NoError(t, err) assert.Equal(t, mock.lookupCalled, v.expectedCalls) } } func newTestServer(ctx context.Context) (*grpc.Server, *mockOverlayServer, error) { ca, err := provider.NewCA(ctx, 12, 4) if err != nil { return nil, nil, err } identity, err := ca.NewIdentity() if err != nil { return nil, nil, err } identOpt, err := identity.ServerOption() if err != nil { return nil, nil, err } grpcServer := grpc.NewServer(identOpt) mo := &mockOverlayServer{lookupCalled: 0, FindStorageNodesCalled: 0} proto.RegisterOverlayServer(grpcServer, mo) return grpcServer, mo, nil } type mockOverlayServer struct { lookupCalled int FindStorageNodesCalled int } func (o *mockOverlayServer) Lookup(ctx context.Context, req *proto.LookupRequest) (*proto.LookupResponse, error) { o.lookupCalled++ return &proto.LookupResponse{}, nil } func (o *mockOverlayServer) FindStorageNodes(ctx context.Context, req *proto.FindStorageNodesRequest) (*proto.FindStorageNodesResponse, error) { o.FindStorageNodesCalled++ return &proto.FindStorageNodesResponse{}, nil }