From 5f0fdd31b7673729df81f646607734bd741e05d3 Mon Sep 17 00:00:00 2001 From: guillaumemichel Date: Tue, 4 Jul 2023 15:59:05 +0200 Subject: [PATCH] completed test coverage, expect for simplequery --- network/endpoint/fakeendpoint/fakeendpoint.go | 13 ++--- .../fakeendpoint/fakeendpoint_test.go | 8 +++ server/basicserver/basicserver.go | 16 +++--- server/basicserver/basicserver_test.go | 50 ++++++++++++++++++- 4 files changed, 67 insertions(+), 20 deletions(-) diff --git a/network/endpoint/fakeendpoint/fakeendpoint.go b/network/endpoint/fakeendpoint/fakeendpoint.go index ac8d08c..b93499e 100644 --- a/network/endpoint/fakeendpoint/fakeendpoint.go +++ b/network/endpoint/fakeendpoint/fakeendpoint.go @@ -113,15 +113,10 @@ func (e *FakeEndpoint) SendRequestHandleResponse(ctx context.Context, return nil } - // send request - addr, ok := e.peerstore[id.String()] - if !ok { - span.RecordError(endpoint.ErrUnknownPeer) - e.sched.EnqueueAction(ctx, ba.BasicAction(func(ctx context.Context) { - handleResp(ctx, nil, endpoint.ErrUnknownPeer) - })) - return nil - } + // send request. id.String() is guaranteed to be in peerstore, because + // DialPeer checks it, and an error is returned if it's not there. + addr := e.peerstore[id.String()] + sid, err := e.router.SendMessage(ctx, e.self, addr.NodeID(), protoID, 0, req) if err != nil { span.RecordError(err) diff --git a/network/endpoint/fakeendpoint/fakeendpoint_test.go b/network/endpoint/fakeendpoint/fakeendpoint_test.go index defc086..c4ba95c 100644 --- a/network/endpoint/fakeendpoint/fakeendpoint_test.go +++ b/network/endpoint/fakeendpoint/fakeendpoint_test.go @@ -7,10 +7,12 @@ import ( "github.com/benbjohnson/clock" "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" "github.com/plprobelab/go-kademlia/events/scheduler" "github.com/plprobelab/go-kademlia/events/scheduler/simplescheduler" "github.com/plprobelab/go-kademlia/network/address" "github.com/plprobelab/go-kademlia/network/address/kadid" + "github.com/plprobelab/go-kademlia/network/address/peerid" si "github.com/plprobelab/go-kademlia/network/address/stringid" "github.com/plprobelab/go-kademlia/network/endpoint" "github.com/plprobelab/go-kademlia/network/message" @@ -50,6 +52,12 @@ func TestFakeEndpoint(t *testing.T) { require.NoError(t, err) require.Equal(t, na, node0) + parsed, err := peer.Decode("1EooooPEER") + require.NoError(t, err) + pid := peerid.NewPeerID(parsed) + _, err = fakeEndpoint.NetworkAddress(pid) + require.Equal(t, endpoint.ErrUnknownPeer, err) + req := simmessage.NewSimRequest(selfID.Key()) resp := &simmessage.SimMessage{} diff --git a/server/basicserver/basicserver.go b/server/basicserver/basicserver.go index 9dd2efc..0bb0e63 100644 --- a/server/basicserver/basicserver.go +++ b/server/basicserver/basicserver.go @@ -92,13 +92,6 @@ func (s *BasicServer) HandleFindNodeRequest(ctx context.Context, attribute.Stringer("Target", target))) defer span.End() - rPeerAddr, err := s.endpoint.NetworkAddress(rpeer) - if err != nil { - span.RecordError(err) - return nil, err - } - s.endpoint.MaybeAddToPeerstore(ctx, rPeerAddr, s.peerstoreTTL) - peers, err := s.rt.NearestPeers(ctx, target, s.numberOfCloserPeersToSend) if err != nil { span.RecordError(err) @@ -114,14 +107,17 @@ func (s *BasicServer) HandleFindNodeRequest(ctx context.Context, switch msg.(type) { case *simmessage.SimMessage: peerAddrs := make([]address.NodeAddr, len(peers)) - for i, p := range peers { - peerAddrs[i], err = s.endpoint.NetworkAddress(p) + var index int + for _, p := range peers { + na, err := s.endpoint.NetworkAddress(p) if err != nil { span.RecordError(err) continue } + peerAddrs[index] = na + index++ } - resp = simmessage.NewSimResponse(peerAddrs) + resp = simmessage.NewSimResponse(peerAddrs[:index]) case *ipfsv1.Message: nEndpoint, ok := s.endpoint.(endpoint.NetworkedEndpoint) if !ok { diff --git a/server/basicserver/basicserver_test.go b/server/basicserver/basicserver_test.go index 9216538..d1b8a57 100644 --- a/server/basicserver/basicserver_test.go +++ b/server/basicserver/basicserver_test.go @@ -161,6 +161,54 @@ func TestInvalidSimRequests(t *testing.T) { s.HandleFindNodeRequest(ctx, requester, req2) } +func TestSimRequestNoNetworkAddress(t *testing.T) { + ctx := context.Background() + keylen := 32 + // invalid option + s := NewBasicServer(nil, nil, func(*Config) error { + return errors.New("invalid option") + }) + require.Nil(t, s) + + clk := clock.New() + router := fakeendpoint.NewFakeRouter() + + var self = kadid.KadID{KadKey: make([]byte, keylen)} // 0000 0000 + + // create a valid server + sched := simplescheduler.NewSimpleScheduler(clk) + fakeEndpoint := fakeendpoint.NewFakeEndpoint(self, sched, router) + rt := simplert.NewSimpleRT(self.Key(), 2) + + parsed, err := peer.Decode("1EooooPEER") + require.NoError(t, err) + addrInfo := addrinfo.NewAddrInfo(peer.AddrInfo{ + ID: parsed, + Addrs: nil, + }) + + // add peer to routing table, but NOT to peerstore + success, err := rt.AddPeer(ctx, addrInfo.NodeID()) + require.NoError(t, err) + require.True(t, success) + + s = NewBasicServer(rt, fakeEndpoint) + require.NotNil(t, s) + + require.NotNil(t, s) + + requester := kadid.KadID{KadKey: append([]byte{0x80}, make([]byte, keylen-1)...)} + + // sim request message (for any key) + req := simmessage.NewSimRequest(requester.Key()) + msg, err := s.HandleFindNodeRequest(ctx, requester, req) + require.NoError(t, err) + resp, ok := msg.(message.MinKadResponseMessage) + require.True(t, ok) + fmt.Println(resp.CloserNodes()) + require.Len(t, resp.CloserNodes(), 0) +} + func TestIPFSv1Handling(t *testing.T) { ctx := context.Background() clk := clock.NewMock() @@ -198,7 +246,7 @@ func TestIPFSv1Handling(t *testing.T) { // it is among the numberOfCloserPeersToSend closer peers addrInfo = addrinfo.NewAddrInfo(peer.AddrInfo{ ID: p, - Addrs: []multiaddr.Multiaddr{}, + Addrs: nil, }) } // add peers to routing table and peerstore