Skip to content

Commit

Permalink
refactor: simplify provide and providepeer handlers
Browse files Browse the repository at this point in the history
  • Loading branch information
hacdias committed Feb 15, 2024
1 parent 342b01d commit e1aa41c
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 117 deletions.
57 changes: 35 additions & 22 deletions routing/http/client/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,16 @@ func (m *mockContentRouter) FindProviders(ctx context.Context, key cid.Cid, limi
return args.Get(0).(iter.ResultIter[types.Record]), args.Error(1)
}

func (m *mockContentRouter) Provide(ctx context.Context, req *server.ProvideRequest) (time.Duration, error) {
func (m *mockContentRouter) Provide(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) {
// Ensure timestamps within tests are within the millisecond.
req.Timestamp = req.Timestamp.Truncate(time.Millisecond)
req.Payload.Timestamp = req.Payload.Timestamp.Truncate(time.Millisecond)

// Signature must be always present, but not possible to test with the mock.
// We test it here and then empty it so that it matches what the mock expects.
if req.Signature == "" {
return 0, errors.New("signature not present")
}
req.Signature = ""

args := m.Called(ctx, req)
return args.Get(0).(time.Duration), args.Error(1)
Expand All @@ -49,9 +56,16 @@ func (m *mockContentRouter) FindPeers(ctx context.Context, pid peer.ID, limit in
return args.Get(0).(iter.ResultIter[*types.PeerRecord]), args.Error(1)
}

func (m *mockContentRouter) ProvidePeer(ctx context.Context, req *server.ProvidePeerRequest) (time.Duration, error) {
func (m *mockContentRouter) ProvidePeer(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) {
// Ensure timestamps within tests are within the millisecond.
req.Timestamp = req.Timestamp.Truncate(time.Second)
req.Payload.Timestamp = req.Payload.Timestamp.Truncate(time.Second)

// Signature must be always present, but not possible to test with the mock.
// We test it here and then empty it so that it matches what the mock expects.
if req.Signature == "" {
return 0, errors.New("signature not present")
}
req.Signature = ""

args := m.Called(ctx, req)
return args.Get(0).(time.Duration), args.Error(1)
Expand Down Expand Up @@ -155,13 +169,6 @@ func makeCID() cid.Cid {
return c
}

func drAddrsToAddrs(drmas []types.Multiaddr) (addrs []multiaddr.Multiaddr) {
for _, a := range drmas {
addrs = append(addrs, a.Multiaddr)
}
return
}

func addrsToDRAddrs(addrs []multiaddr.Multiaddr) (drmas []types.Multiaddr) {
for _, a := range addrs {
drmas = append(drmas, types.Multiaddr{Multiaddr: a})
Expand Down Expand Up @@ -440,12 +447,15 @@ func TestClient_Provide(t *testing.T) {
}

for _, cid := range c.cids {
router.On("Provide", mock.Anything, &server.ProvideRequest{
CID: cid,
Timestamp: clock.Now().UTC().Truncate(time.Millisecond),
TTL: c.ttl,
Addrs: drAddrsToAddrs(client.addrs),
ID: client.peerID,
router.On("Provide", mock.Anything, &types.AnnouncementRecord{
Schema: types.SchemaAnnouncement,
Payload: types.AnnouncementPayload{
CID: cid,
Timestamp: clock.Now().UTC().Truncate(time.Millisecond),
TTL: c.ttl,
Addrs: client.addrs,
ID: &client.peerID,
},
}).Return(c.routerAdvisoryTTL, c.routerErr)
}

Expand Down Expand Up @@ -708,11 +718,14 @@ func TestClient_ProvidePeer(t *testing.T) {
}
}

router.On("ProvidePeer", mock.Anything, &server.ProvidePeerRequest{
Timestamp: clock.Now().UTC().Truncate(time.Second),
TTL: c.ttl,
Addrs: drAddrsToAddrs(client.addrs),
ID: client.peerID,
router.On("ProvidePeer", mock.Anything, &types.AnnouncementRecord{
Schema: types.SchemaAnnouncement,
Payload: types.AnnouncementPayload{
Timestamp: clock.Now().UTC().Truncate(time.Second),
TTL: c.ttl,
Addrs: client.addrs,
ID: &client.peerID,
},
}).Return(c.routerAdvisoryTTL, c.routerErr)

recs, err := client.ProvidePeer(ctx, c.ttl, nil)
Expand Down
69 changes: 9 additions & 60 deletions routing/http/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import (
jsontypes "github.com/ipfs/boxo/routing/http/types/json"
"github.com/ipfs/go-cid"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/multiformats/go-multiaddr"

logging "github.com/ipfs/go-log/v2"
)
Expand Down Expand Up @@ -57,17 +56,17 @@ type ContentRouter interface {
// Limit indicates the maximum amount of results to return; 0 means unbounded.
FindProviders(ctx context.Context, cid cid.Cid, limit int) (iter.ResultIter[types.Record], error)

// Provide stores the provided [ProvideRequest] record for CIDs. Can return
// Provide stores the provided [types.AnnouncementRecord] record for CIDs. Can return
// a different TTL than the provided.
Provide(ctx context.Context, req *ProvideRequest) (time.Duration, error)
Provide(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error)

// FindPeers searches for peers who have the provided [peer.ID].
// Limit indicates the maximum amount of results to return; 0 means unbounded.
FindPeers(ctx context.Context, pid peer.ID, limit int) (iter.ResultIter[*types.PeerRecord], error)

// ProvidePeer stores the provided [ProvidePeerRequest] record for peers. Can
// ProvidePeer stores the provided [types.AnnouncementRecord] record for peers. Can
// return a different TTL than the provided.
ProvidePeer(ctx context.Context, req *ProvidePeerRequest) (time.Duration, error)
ProvidePeer(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error)

// GetIPNS searches for an [ipns.Record] for the given [ipns.Name].
GetIPNS(ctx context.Context, name ipns.Name) (*ipns.Record, error)
Expand All @@ -77,28 +76,6 @@ type ContentRouter interface {
PutIPNS(ctx context.Context, name ipns.Name, record *ipns.Record) error
}

// ProvideRequest is a content provide request.
type ProvideRequest struct {
CID cid.Cid
Scope types.AnnouncementScope
Timestamp time.Time
TTL time.Duration
ID peer.ID
Addrs []multiaddr.Multiaddr
Protocols []string
Metadata string
}

// ProvidePeerRequest is a peer provide request.
type ProvidePeerRequest struct {
Timestamp time.Time
TTL time.Duration
ID peer.ID
Addrs []multiaddr.Multiaddr
Protocols []string
Metadata string
}

type Option func(s *server)

// WithStreamingResultsDisabled disables ndjson responses, so that the server only supports JSON responses.
Expand Down Expand Up @@ -315,27 +292,14 @@ func (s *server) providePeers(w http.ResponseWriter, r *http.Request) {
return resRecord
}

req := &ProvidePeerRequest{
Timestamp: reqRecord.Payload.Timestamp,
TTL: reqRecord.Payload.TTL,
ID: *reqRecord.Payload.ID,
Addrs: make([]multiaddr.Multiaddr, len(reqRecord.Payload.Addrs)),
Protocols: reqRecord.Payload.Protocols,
Metadata: reqRecord.Payload.Metadata,
}

for i, addr := range reqRecord.Payload.Addrs {
req.Addrs[i] = addr.Multiaddr
}

ttl, err := s.svc.ProvidePeer(r.Context(), req)
ttl, err := s.svc.ProvidePeer(r.Context(), reqRecord)
if err != nil {
resRecord.Error = err.Error()
return resRecord
}

resRecord.Payload.TTL = ttl
resRecord.Payload.ID = &req.ID
resRecord.Payload.ID = reqRecord.Payload.ID
return resRecord
})

Expand Down Expand Up @@ -374,30 +338,15 @@ func (s *server) provide(w http.ResponseWriter, r *http.Request) {
return resRecord
}

req := &ProvideRequest{
CID: reqRecord.Payload.CID,
Scope: reqRecord.Payload.Scope,
Timestamp: reqRecord.Payload.Timestamp,
TTL: reqRecord.Payload.TTL,
ID: *reqRecord.Payload.ID,
Addrs: make([]multiaddr.Multiaddr, len(reqRecord.Payload.Addrs)),
Protocols: reqRecord.Payload.Protocols,
Metadata: reqRecord.Payload.Metadata,
}

for i, addr := range reqRecord.Payload.Addrs {
req.Addrs[i] = addr.Multiaddr
}

ttl, err := s.svc.Provide(r.Context(), req)
ttl, err := s.svc.Provide(r.Context(), reqRecord)
if err != nil {
resRecord.Error = err.Error()
return resRecord
}

resRecord.Payload.TTL = ttl
resRecord.Payload.CID = req.CID
resRecord.Payload.ID = &req.ID
resRecord.Payload.CID = reqRecord.Payload.CID
resRecord.Payload.ID = reqRecord.Payload.ID
return resRecord
})

Expand Down
43 changes: 8 additions & 35 deletions routing/http/server/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import (
"github.com/libp2p/go-libp2p/core/crypto"
"github.com/libp2p/go-libp2p/core/peer"
b58 "github.com/mr-tron/base58/base58"
"github.com/multiformats/go-multiaddr"
"github.com/multiformats/go-multihash"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -184,23 +183,9 @@ func TestProviders(t *testing.T) {

serverAddr := "http://" + server.Listener.Addr().String()

router.On("Provide", mock.Anything, &ProvideRequest{
CID: cid1,
Timestamp: rec1.Payload.Timestamp,
TTL: rec1.Payload.TTL,
ID: pid1,
Addrs: []multiaddr.Multiaddr{},
Protocols: rec1.Payload.Protocols,
}).Return(time.Hour, nil)

router.On("Provide", mock.Anything, &ProvideRequest{
CID: cid1,
Timestamp: rec2.Payload.Timestamp,
TTL: rec2.Payload.TTL,
ID: pid2,
Addrs: []multiaddr.Multiaddr{},
Protocols: rec2.Payload.Protocols,
}).Return(time.Minute, nil)
router.On("Provide", mock.Anything, rec1).Return(time.Hour, nil)

router.On("Provide", mock.Anything, rec2).Return(time.Minute, nil)

urlStr := serverAddr + "/routing/v1/providers"

Expand Down Expand Up @@ -368,21 +353,9 @@ func TestPeers(t *testing.T) {

serverAddr := "http://" + server.Listener.Addr().String()

router.On("ProvidePeer", mock.Anything, &ProvidePeerRequest{
Timestamp: rec1.Payload.Timestamp,
TTL: rec1.Payload.TTL,
ID: pid1,
Addrs: []multiaddr.Multiaddr{},
Protocols: rec1.Payload.Protocols,
}).Return(time.Hour, nil)

router.On("ProvidePeer", mock.Anything, &ProvidePeerRequest{
Timestamp: rec2.Payload.Timestamp,
TTL: rec2.Payload.TTL,
ID: pid2,
Addrs: []multiaddr.Multiaddr{},
Protocols: rec2.Payload.Protocols,
}).Return(time.Minute, nil)
router.On("ProvidePeer", mock.Anything, rec1).Return(time.Hour, nil)

router.On("ProvidePeer", mock.Anything, rec2).Return(time.Minute, nil)

urlStr := serverAddr + "/routing/v1/peers"

Expand Down Expand Up @@ -545,7 +518,7 @@ func (m *mockContentRouter) FindProviders(ctx context.Context, key cid.Cid, limi
return args.Get(0).(iter.ResultIter[types.Record]), args.Error(1)
}

func (m *mockContentRouter) Provide(ctx context.Context, req *ProvideRequest) (time.Duration, error) {
func (m *mockContentRouter) Provide(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) {
args := m.Called(ctx, req)
return args.Get(0).(time.Duration), args.Error(1)
}
Expand All @@ -555,7 +528,7 @@ func (m *mockContentRouter) FindPeers(ctx context.Context, pid peer.ID, limit in
return args.Get(0).(iter.ResultIter[*types.PeerRecord]), args.Error(1)
}

func (m *mockContentRouter) ProvidePeer(ctx context.Context, req *ProvidePeerRequest) (time.Duration, error) {
func (m *mockContentRouter) ProvidePeer(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) {
args := m.Called(ctx, req)
return args.Get(0).(time.Duration), args.Error(1)
}
Expand Down

0 comments on commit e1aa41c

Please sign in to comment.