master
go 226 lines 4.85 KB
Raw
1 package routing
2
3 import (
4 "crypto/rand"
5 "encoding/base64"
6 "testing"
7
8 "github.com/ipfs/kubo/config"
9 "github.com/libp2p/go-libp2p/core/crypto"
10 "github.com/libp2p/go-libp2p/core/peer"
11 "github.com/stretchr/testify/require"
12 )
13
14 func TestParser(t *testing.T) {
15 require := require.New(t)
16
17 pid, sk, err := generatePeerID()
18 require.NoError(err)
19
20 router, err := Parse(config.Routers{
21 "r1": config.RouterParser{
22 Router: config.Router{
23 Type: config.RouterTypeHTTP,
24 Parameters: &config.HTTPRouterParams{
25 Endpoint: "http://testEndpoint",
26 },
27 },
28 },
29 "r2": config.RouterParser{
30 Router: config.Router{
31 Type: config.RouterTypeSequential,
32 Parameters: &config.ComposableRouterParams{
33 Routers: []config.ConfigRouter{
34 {
35 RouterName: "r1",
36 },
37 },
38 },
39 },
40 },
41 }, config.Methods{
42 config.MethodNameFindPeers: config.Method{
43 RouterName: "r1",
44 },
45 config.MethodNameFindProviders: config.Method{
46 RouterName: "r1",
47 },
48 config.MethodNameGetIPNS: config.Method{
49 RouterName: "r1",
50 },
51 config.MethodNamePutIPNS: config.Method{
52 RouterName: "r2",
53 },
54 config.MethodNameProvide: config.Method{
55 RouterName: "r2",
56 },
57 }, &ExtraDHTParams{}, &ExtraHTTPParams{
58 PeerID: string(pid),
59 PrivKeyB64: sk,
60 })
61
62 require.NoError(err)
63
64 comp, ok := router.(*Composer)
65 require.True(ok)
66
67 require.Equal(comp.FindPeersRouter, comp.FindProvidersRouter)
68 require.Equal(comp.ProvideRouter, comp.PutValueRouter)
69 }
70
71 func TestParserRecursive(t *testing.T) {
72 require := require.New(t)
73
74 pid, sk, err := generatePeerID()
75 require.NoError(err)
76
77 router, err := Parse(config.Routers{
78 "http1": config.RouterParser{
79 Router: config.Router{
80 Type: config.RouterTypeHTTP,
81 Parameters: &config.HTTPRouterParams{
82 Endpoint: "http://testEndpoint1",
83 },
84 },
85 },
86 "http2": config.RouterParser{
87 Router: config.Router{
88 Type: config.RouterTypeHTTP,
89 Parameters: &config.HTTPRouterParams{
90 Endpoint: "http://testEndpoint2",
91 },
92 },
93 },
94 "http3": config.RouterParser{
95 Router: config.Router{
96 Type: config.RouterTypeHTTP,
97 Parameters: &config.HTTPRouterParams{
98 Endpoint: "http://testEndpoint3",
99 },
100 },
101 },
102 "composable1": config.RouterParser{
103 Router: config.Router{
104 Type: config.RouterTypeSequential,
105 Parameters: &config.ComposableRouterParams{
106 Routers: []config.ConfigRouter{
107 {
108 RouterName: "http1",
109 },
110 {
111 RouterName: "http2",
112 },
113 },
114 },
115 },
116 },
117 "composable2": config.RouterParser{
118 Router: config.Router{
119 Type: config.RouterTypeParallel,
120 Parameters: &config.ComposableRouterParams{
121 Routers: []config.ConfigRouter{
122 {
123 RouterName: "composable1",
124 },
125 {
126 RouterName: "http3",
127 },
128 },
129 },
130 },
131 },
132 }, config.Methods{
133 config.MethodNameFindPeers: config.Method{
134 RouterName: "composable2",
135 },
136 config.MethodNameFindProviders: config.Method{
137 RouterName: "composable2",
138 },
139 config.MethodNameGetIPNS: config.Method{
140 RouterName: "composable2",
141 },
142 config.MethodNamePutIPNS: config.Method{
143 RouterName: "composable2",
144 },
145 config.MethodNameProvide: config.Method{
146 RouterName: "composable2",
147 },
148 }, &ExtraDHTParams{}, &ExtraHTTPParams{
149 PeerID: string(pid),
150 PrivKeyB64: sk,
151 })
152
153 require.NoError(err)
154
155 _, ok := router.(*Composer)
156 require.True(ok)
157 }
158
159 func TestParserRecursiveLoop(t *testing.T) {
160 require := require.New(t)
161
162 _, err := Parse(config.Routers{
163 "composable1": config.RouterParser{
164 Router: config.Router{
165 Type: config.RouterTypeSequential,
166 Parameters: &config.ComposableRouterParams{
167 Routers: []config.ConfigRouter{
168 {
169 RouterName: "composable2",
170 },
171 },
172 },
173 },
174 },
175 "composable2": config.RouterParser{
176 Router: config.Router{
177 Type: config.RouterTypeParallel,
178 Parameters: &config.ComposableRouterParams{
179 Routers: []config.ConfigRouter{
180 {
181 RouterName: "composable1",
182 },
183 },
184 },
185 },
186 },
187 }, config.Methods{
188 config.MethodNameFindPeers: config.Method{
189 RouterName: "composable2",
190 },
191 config.MethodNameFindProviders: config.Method{
192 RouterName: "composable2",
193 },
194 config.MethodNameGetIPNS: config.Method{
195 RouterName: "composable2",
196 },
197 config.MethodNamePutIPNS: config.Method{
198 RouterName: "composable2",
199 },
200 config.MethodNameProvide: config.Method{
201 RouterName: "composable2",
202 },
203 }, &ExtraDHTParams{}, nil)
204
205 require.ErrorContains(err, "dependency loop creating router with name \"composable2\"")
206 }
207
208 func generatePeerID() (string, string, error) {
209 sk, pk, err := crypto.GenerateEd25519Key(rand.Reader)
210 if err != nil {
211 return "", "", err
212 }
213
214 bytes, err := crypto.MarshalPrivateKey(sk)
215 if err != nil {
216 return "", "", err
217 }
218
219 enc := base64.StdEncoding.EncodeToString(bytes)
220 if err != nil {
221 return "", "", err
222 }
223
224 pid, err := peer.IDFromPublicKey(pk)
225 return pid.String(), enc, err
226 }