master
go 174 lines 5 KB
Raw
1 package tests
2
3 import (
4 "context"
5 "io"
6 "math/rand"
7 "testing"
8 "time"
9
10 "github.com/ipfs/boxo/files"
11 "github.com/ipfs/boxo/ipns"
12 "github.com/ipfs/boxo/path"
13 coreiface "github.com/ipfs/kubo/core/coreiface"
14 opt "github.com/ipfs/kubo/core/coreiface/options"
15 "github.com/stretchr/testify/require"
16 )
17
18 func (tp *TestSuite) TestName(t *testing.T) {
19 tp.hasApi(t, func(api coreiface.CoreAPI) error {
20 if api.Name() == nil {
21 return errAPINotImplemented
22 }
23 return nil
24 })
25
26 t.Run("TestPublishResolve", tp.TestPublishResolve)
27 t.Run("TestBasicPublishResolveKey", tp.TestBasicPublishResolveKey)
28 t.Run("TestBasicPublishResolveTimeout", tp.TestBasicPublishResolveTimeout)
29 }
30
31 var rnd = rand.New(rand.NewSource(0x62796532303137))
32
33 func addTestObject(ctx context.Context, api coreiface.CoreAPI) (path.Path, error) {
34 return api.Unixfs().Add(ctx, files.NewReaderFile(&io.LimitedReader{R: rnd, N: 4092}))
35 }
36
37 func (tp *TestSuite) TestPublishResolve(t *testing.T) {
38 ctx := t.Context()
39 init := func() (coreiface.CoreAPI, path.Path) {
40 apis, err := tp.MakeAPISwarm(t, ctx, 5)
41 require.NoError(t, err)
42 api := apis[0]
43
44 p, err := addTestObject(ctx, api)
45 require.NoError(t, err)
46 return api, p
47 }
48 run := func(t *testing.T, ropts []opt.NameResolveOption) {
49 t.Run("basic", func(t *testing.T) {
50 api, p := init()
51 name, err := api.Name().Publish(ctx, p)
52 require.NoError(t, err)
53
54 self, err := api.Key().Self(ctx)
55 require.NoError(t, err)
56 require.Equal(t, name.String(), ipns.NameFromPeer(self.ID()).String())
57
58 resPath, err := api.Name().Resolve(ctx, name.String(), ropts...)
59 require.NoError(t, err)
60 require.Equal(t, p.String(), resPath.String())
61 })
62
63 t.Run("publishPath", func(t *testing.T) {
64 api, p := init()
65 p, err := path.Join(p, "/test")
66 require.NoError(t, err)
67
68 name, err := api.Name().Publish(ctx, p)
69 require.NoError(t, err)
70
71 self, err := api.Key().Self(ctx)
72 require.NoError(t, err)
73 require.Equal(t, name.String(), ipns.NameFromPeer(self.ID()).String())
74
75 resPath, err := api.Name().Resolve(ctx, name.String(), ropts...)
76 require.NoError(t, err)
77 require.Equal(t, p.String(), resPath.String())
78 })
79
80 t.Run("revolvePath", func(t *testing.T) {
81 api, p := init()
82 name, err := api.Name().Publish(ctx, p)
83 require.NoError(t, err)
84
85 self, err := api.Key().Self(ctx)
86 require.NoError(t, err)
87 require.Equal(t, name.String(), ipns.NameFromPeer(self.ID()).String())
88
89 resPath, err := api.Name().Resolve(ctx, name.String()+"/test", ropts...)
90 require.NoError(t, err)
91 require.Equal(t, p.String()+"/test", resPath.String())
92 })
93
94 t.Run("publishRevolvePath", func(t *testing.T) {
95 api, p := init()
96 p, err := path.Join(p, "/a")
97 require.NoError(t, err)
98
99 name, err := api.Name().Publish(ctx, p)
100 require.NoError(t, err)
101
102 self, err := api.Key().Self(ctx)
103 require.NoError(t, err)
104 require.Equal(t, name.String(), ipns.NameFromPeer(self.ID()).String())
105
106 resPath, err := api.Name().Resolve(ctx, name.String()+"/b", ropts...)
107 require.NoError(t, err)
108 require.Equal(t, p.String()+"/b", resPath.String())
109 })
110 }
111
112 t.Run("default", func(t *testing.T) {
113 run(t, []opt.NameResolveOption{})
114 })
115
116 t.Run("nocache", func(t *testing.T) {
117 run(t, []opt.NameResolveOption{opt.Name.Cache(false)})
118 })
119 }
120
121 func (tp *TestSuite) TestBasicPublishResolveKey(t *testing.T) {
122 ctx := t.Context()
123 apis, err := tp.MakeAPISwarm(t, ctx, 5)
124 require.NoError(t, err)
125 api := apis[0]
126
127 k, err := api.Key().Generate(ctx, "foo")
128 require.NoError(t, err)
129
130 p, err := addTestObject(ctx, api)
131 require.NoError(t, err)
132
133 name, err := api.Name().Publish(ctx, p, opt.Name.Key(k.Name()))
134 require.NoError(t, err)
135 require.Equal(t, name.String(), ipns.NameFromPeer(k.ID()).String())
136
137 resPath, err := api.Name().Resolve(ctx, name.String())
138 require.NoError(t, err)
139 require.Equal(t, p.String(), resPath.String())
140 }
141
142 func (tp *TestSuite) TestBasicPublishResolveTimeout(t *testing.T) {
143 ctx := t.Context()
144 apis, err := tp.MakeAPISwarm(t, ctx, 5)
145 require.NoError(t, err)
146 api := apis[0]
147 p, err := addTestObject(ctx, api)
148 require.NoError(t, err)
149
150 self, err := api.Key().Self(ctx)
151 require.NoError(t, err)
152
153 name, err := api.Name().Publish(ctx, p, opt.Name.ValidTime(time.Second*1))
154 require.NoError(t, err)
155 require.Equal(t, name.String(), ipns.NameFromPeer(self.ID()).String())
156
157 // First resolve should succeed (before expiration)
158 resPath, err := api.Name().Resolve(ctx, name.String())
159 require.NoError(t, err)
160 require.Equal(t, p.String(), resPath.String())
161
162 // Wait for record to expire (1 second ValidTime + buffer)
163 time.Sleep(time.Second * 2)
164
165 // Second resolve should now fail after ValidTime expiration (cached)
166 _, err = api.Name().Resolve(ctx, name.String())
167 require.Error(t, err, "IPNS resolution should fail after ValidTime expires (cached)")
168
169 // Third resolve should also fail after ValidTime expiration (non-cached)
170 _, err = api.Name().Resolve(ctx, name.String(), opt.Name.Cache(false))
171 require.Error(t, err, "IPNS resolution should fail after ValidTime expires (non-cached)")
172 }
173
174 // TODO: When swarm api is created, add multinode tests