@@ -3,13 +3,17 @@ 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/ipfs/boxo/coreiface/path"
15+ ipns "github.com/ipfs/boxo/ipns"
16+ ipfspath "github.com/ipfs/boxo/path"
1317 "github.com/ipfs/boxo/routing/http/server"
1418 "github.com/ipfs/boxo/routing/http/types"
1519 "github.com/ipfs/boxo/routing/http/types/iter"
@@ -31,6 +35,7 @@ func (m *mockContentRouter) FindProviders(ctx context.Context, key cid.Cid, limi
3135 args := m .Called (ctx , key , limit )
3236 return args .Get (0 ).(iter.ResultIter [types.ProviderResponse ]), args .Error (1 )
3337}
38+
3439func (m * mockContentRouter ) ProvideBitswap (ctx context.Context , req * server.BitswapWriteProvideRequest ) (time.Duration , error ) {
3540 args := m .Called (ctx , req )
3641 return args .Get (0 ).(time.Duration ), args .Error (1 )
@@ -41,6 +46,16 @@ func (m *mockContentRouter) Provide(ctx context.Context, req *server.WriteProvid
4146 return args .Get (0 ).(types.ProviderResponse ), args .Error (1 )
4247}
4348
49+ func (m * mockContentRouter ) FindIPNSRecord (ctx context.Context , name ipns.Name ) (* ipns.Record , error ) {
50+ args := m .Called (ctx , name )
51+ return args .Get (0 ).(* ipns.Record ), args .Error (1 )
52+ }
53+
54+ func (m * mockContentRouter ) ProvideIPNSRecord (ctx context.Context , name ipns.Name , record * ipns.Record ) error {
55+ args := m .Called (ctx , name , record )
56+ return args .Error (0 )
57+ }
58+
4459type testDeps struct {
4560 // recordingHandler records requests received on the server side
4661 recordingHandler * recordingHandler
@@ -441,3 +456,91 @@ func TestClient_Provide(t *testing.T) {
441456 })
442457 }
443458}
459+
460+ func makeName (t * testing.T ) (crypto.PrivKey , ipns.Name ) {
461+ sk , _ , err := crypto .GenerateEd25519Key (rand .Reader )
462+ require .NoError (t , err )
463+
464+ pid , err := peer .IDFromPrivateKey (sk )
465+ require .NoError (t , err )
466+
467+ return sk , ipns .NameFromPeer (pid )
468+ }
469+
470+ func makeIPNSRecord (t * testing.T , sk crypto.PrivKey ) (* ipns.Record , []byte ) {
471+ cid , err := cid .Decode ("bafkreifjjcie6lypi6ny7amxnfftagclbuxndqonfipmb64f2km2devei4" )
472+ require .NoError (t , err )
473+
474+ path := path .IpfsPath (cid )
475+ eol := time .Now ().Add (time .Hour * 48 )
476+ ttl := time .Second * 20
477+
478+ record , err := ipns .NewRecord (sk , ipfspath .FromString (path .String ()), 1 , eol , ttl )
479+ require .NoError (t , err )
480+
481+ rawRecord , err := ipns .MarshalRecord (record )
482+ require .NoError (t , err )
483+
484+ return record , rawRecord
485+ }
486+
487+ func TestClient_IPNS (t * testing.T ) {
488+ t .Run ("Find IPNS Record" , func (t * testing.T ) {
489+ sk , name := makeName (t )
490+ record , _ := makeIPNSRecord (t , sk )
491+
492+ deps := makeTestDeps (t , nil , nil )
493+ client := deps .client
494+ router := deps .router
495+
496+ router .On ("FindIPNSRecord" , mock .Anything , name ).Return (record , nil )
497+
498+ receivedRecord , err := client .FindIPNSRecord (context .Background (), name )
499+ require .NoError (t , err )
500+ require .Equal (t , record , receivedRecord )
501+ })
502+
503+ t .Run ("Find IPNS Record returns error if server sends bad data" , func (t * testing.T ) {
504+ sk , _ := makeName (t )
505+ record , _ := makeIPNSRecord (t , sk )
506+ _ , name2 := makeName (t )
507+
508+ deps := makeTestDeps (t , nil , nil )
509+ client := deps .client
510+ router := deps .router
511+
512+ router .On ("FindIPNSRecord" , mock .Anything , name2 ).Return (record , nil )
513+
514+ receivedRecord , err := client .FindIPNSRecord (context .Background (), name2 )
515+ require .Error (t , err )
516+ require .Nil (t , receivedRecord )
517+ })
518+
519+ t .Run ("Find IPNS Record returns error if server errors" , func (t * testing.T ) {
520+ _ , name := makeName (t )
521+
522+ deps := makeTestDeps (t , nil , nil )
523+ client := deps .client
524+ router := deps .router
525+
526+ router .On ("FindIPNSRecord" , mock .Anything , name ).Return (nil , errors .New ("something wrong happened" ))
527+
528+ receivedRecord , err := client .FindIPNSRecord (context .Background (), name )
529+ require .Error (t , err )
530+ require .Nil (t , receivedRecord )
531+ })
532+
533+ t .Run ("Provide IPNS Record" , func (t * testing.T ) {
534+ sk , name := makeName (t )
535+ record , _ := makeIPNSRecord (t , sk )
536+
537+ deps := makeTestDeps (t , nil , nil )
538+ client := deps .client
539+ router := deps .router
540+
541+ router .On ("ProvideIPNSRecord" , mock .Anything , name , record ).Return (nil )
542+
543+ err := client .ProvideIPNSRecord (context .Background (), name , record )
544+ require .NoError (t , err )
545+ })
546+ }
0 commit comments