@@ -3,13 +3,18 @@ package client
33import (
44 "context"
55 "crypto/rand"
6+ "errors"
67 "net/http"
78 "net/http/httptest"
89 "runtime"
910 "testing"
1011 "time"
1112
1213 "github.com/benbjohnson/clock"
14+ "github.com/gogo/protobuf/proto"
15+ "github.com/ipfs/boxo/coreiface/path"
16+ ipns "github.com/ipfs/boxo/ipns"
17+ ipns_pb "github.com/ipfs/boxo/ipns/pb"
1318 "github.com/ipfs/boxo/routing/http/server"
1419 "github.com/ipfs/boxo/routing/http/types"
1520 "github.com/ipfs/boxo/routing/http/types/iter"
@@ -31,6 +36,7 @@ func (m *mockContentRouter) FindProviders(ctx context.Context, key cid.Cid, limi
3136 args := m .Called (ctx , key , limit )
3237 return args .Get (0 ).(iter.ResultIter [types.ProviderResponse ]), args .Error (1 )
3338}
39+
3440func (m * mockContentRouter ) ProvideBitswap (ctx context.Context , req * server.BitswapWriteProvideRequest ) (time.Duration , error ) {
3541 args := m .Called (ctx , req )
3642 return args .Get (0 ).(time.Duration ), args .Error (1 )
@@ -41,6 +47,16 @@ func (m *mockContentRouter) Provide(ctx context.Context, req *server.WriteProvid
4147 return args .Get (0 ).(types.ProviderResponse ), args .Error (1 )
4248}
4349
50+ func (m * mockContentRouter ) GetIPNSRecord (ctx context.Context , pid peer.ID ) (* ipns_pb.IpnsEntry , error ) {
51+ args := m .Called (ctx , pid )
52+ return args .Get (0 ).(* ipns_pb.IpnsEntry ), args .Error (1 )
53+ }
54+
55+ func (m * mockContentRouter ) PutIPNSRecord (ctx context.Context , pid peer.ID , record * ipns_pb.IpnsEntry ) error {
56+ args := m .Called (ctx , pid , record )
57+ return args .Error (0 )
58+ }
59+
4460type testDeps struct {
4561 // recordingHandler records requests received on the server side
4662 recordingHandler * recordingHandler
@@ -441,3 +457,91 @@ func TestClient_Provide(t *testing.T) {
441457 })
442458 }
443459}
460+
461+ func makePeerID (t * testing.T ) (crypto.PrivKey , peer.ID ) {
462+ sk , _ , err := crypto .GenerateEd25519Key (rand .Reader )
463+ require .NoError (t , err )
464+
465+ pid , err := peer .IDFromPrivateKey (sk )
466+ require .NoError (t , err )
467+
468+ return sk , pid
469+ }
470+
471+ func makeIPNSRecord (t * testing.T , sk crypto.PrivKey ) (* ipns_pb.IpnsEntry , []byte ) {
472+ cid , err := cid .Decode ("bafkreifjjcie6lypi6ny7amxnfftagclbuxndqonfipmb64f2km2devei4" )
473+ require .NoError (t , err )
474+
475+ path := path .IpfsPath (cid )
476+ eol := time .Now ().Add (time .Hour * 48 )
477+ ttl := time .Second * 20
478+
479+ record , err := ipns .Create (sk , []byte (path .String ()), 1 , eol , ttl )
480+ require .NoError (t , err )
481+
482+ rawRecord , err := proto .Marshal (record )
483+ require .NoError (t , err )
484+
485+ return record , rawRecord
486+ }
487+
488+ func TestClient_IPNS (t * testing.T ) {
489+ t .Run ("Get IPNS Record" , func (t * testing.T ) {
490+ sk , pid := makePeerID (t )
491+ record , _ := makeIPNSRecord (t , sk )
492+
493+ deps := makeTestDeps (t , nil , nil )
494+ client := deps .client
495+ router := deps .router
496+
497+ router .On ("GetIPNSRecord" , mock .Anything , pid ).Return (record , nil )
498+
499+ receivedRecord , err := client .GetIPNSRecord (context .Background (), pid )
500+ require .NoError (t , err )
501+ require .Equal (t , record , receivedRecord )
502+ })
503+
504+ t .Run ("Get IPNS Record returns error if server sends bad data" , func (t * testing.T ) {
505+ sk , _ := makePeerID (t )
506+ record , _ := makeIPNSRecord (t , sk )
507+ _ , pid2 := makePeerID (t )
508+
509+ deps := makeTestDeps (t , nil , nil )
510+ client := deps .client
511+ router := deps .router
512+
513+ router .On ("GetIPNSRecord" , mock .Anything , pid2 ).Return (record , nil )
514+
515+ receivedRecord , err := client .GetIPNSRecord (context .Background (), pid2 )
516+ require .Error (t , err )
517+ require .Nil (t , receivedRecord )
518+ })
519+
520+ t .Run ("Get IPNS Record returns error if server errors" , func (t * testing.T ) {
521+ _ , pid := makePeerID (t )
522+
523+ deps := makeTestDeps (t , nil , nil )
524+ client := deps .client
525+ router := deps .router
526+
527+ router .On ("GetIPNSRecord" , mock .Anything , pid ).Return (nil , errors .New ("something wrong happened" ))
528+
529+ receivedRecord , err := client .GetIPNSRecord (context .Background (), pid )
530+ require .Error (t , err )
531+ require .Nil (t , receivedRecord )
532+ })
533+
534+ t .Run ("Put IPNS Record" , func (t * testing.T ) {
535+ sk , pid := makePeerID (t )
536+ record , _ := makeIPNSRecord (t , sk )
537+
538+ deps := makeTestDeps (t , nil , nil )
539+ client := deps .client
540+ router := deps .router
541+
542+ router .On ("PutIPNSRecord" , mock .Anything , pid , record ).Return (nil )
543+
544+ err := client .PutIPNSRecord (context .Background (), pid , record )
545+ require .NoError (t , err )
546+ })
547+ }
0 commit comments