mirror of
https://github.com/ipfs/kubo.git
synced 2025-05-17 06:57:40 +08:00
227 lines
4.8 KiB
Go
227 lines
4.8 KiB
Go
package routing
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/base64"
|
|
"testing"
|
|
|
|
"github.com/ipfs/kubo/config"
|
|
"github.com/libp2p/go-libp2p/core/crypto"
|
|
"github.com/libp2p/go-libp2p/core/peer"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestParser(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
pid, sk, err := generatePeerID()
|
|
require.NoError(err)
|
|
|
|
router, err := Parse(config.Routers{
|
|
"r1": config.RouterParser{
|
|
Router: config.Router{
|
|
Type: config.RouterTypeHTTP,
|
|
Parameters: &config.HTTPRouterParams{
|
|
Endpoint: "testEndpoint",
|
|
},
|
|
},
|
|
},
|
|
"r2": config.RouterParser{
|
|
Router: config.Router{
|
|
Type: config.RouterTypeSequential,
|
|
Parameters: &config.ComposableRouterParams{
|
|
Routers: []config.ConfigRouter{
|
|
{
|
|
RouterName: "r1",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}, config.Methods{
|
|
config.MethodNameFindPeers: config.Method{
|
|
RouterName: "r1",
|
|
},
|
|
config.MethodNameFindProviders: config.Method{
|
|
RouterName: "r1",
|
|
},
|
|
config.MethodNameGetIPNS: config.Method{
|
|
RouterName: "r1",
|
|
},
|
|
config.MethodNamePutIPNS: config.Method{
|
|
RouterName: "r2",
|
|
},
|
|
config.MethodNameProvide: config.Method{
|
|
RouterName: "r2",
|
|
},
|
|
}, &ExtraDHTParams{}, &ExtraHTTPParams{
|
|
PeerID: string(pid),
|
|
PrivKeyB64: sk,
|
|
})
|
|
|
|
require.NoError(err)
|
|
|
|
comp, ok := router.(*Composer)
|
|
require.True(ok)
|
|
|
|
require.Equal(comp.FindPeersRouter, comp.FindProvidersRouter)
|
|
require.Equal(comp.ProvideRouter, comp.PutValueRouter)
|
|
}
|
|
|
|
func TestParserRecursive(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
pid, sk, err := generatePeerID()
|
|
require.NoError(err)
|
|
|
|
router, err := Parse(config.Routers{
|
|
"http1": config.RouterParser{
|
|
Router: config.Router{
|
|
Type: config.RouterTypeHTTP,
|
|
Parameters: &config.HTTPRouterParams{
|
|
Endpoint: "testEndpoint1",
|
|
},
|
|
},
|
|
},
|
|
"http2": config.RouterParser{
|
|
Router: config.Router{
|
|
Type: config.RouterTypeHTTP,
|
|
Parameters: &config.HTTPRouterParams{
|
|
Endpoint: "testEndpoint2",
|
|
},
|
|
},
|
|
},
|
|
"http3": config.RouterParser{
|
|
Router: config.Router{
|
|
Type: config.RouterTypeHTTP,
|
|
Parameters: &config.HTTPRouterParams{
|
|
Endpoint: "testEndpoint3",
|
|
},
|
|
},
|
|
},
|
|
"composable1": config.RouterParser{
|
|
Router: config.Router{
|
|
Type: config.RouterTypeSequential,
|
|
Parameters: &config.ComposableRouterParams{
|
|
Routers: []config.ConfigRouter{
|
|
{
|
|
RouterName: "http1",
|
|
},
|
|
{
|
|
RouterName: "http2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"composable2": config.RouterParser{
|
|
Router: config.Router{
|
|
Type: config.RouterTypeParallel,
|
|
Parameters: &config.ComposableRouterParams{
|
|
Routers: []config.ConfigRouter{
|
|
{
|
|
RouterName: "composable1",
|
|
},
|
|
{
|
|
RouterName: "http3",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}, config.Methods{
|
|
config.MethodNameFindPeers: config.Method{
|
|
RouterName: "composable2",
|
|
},
|
|
config.MethodNameFindProviders: config.Method{
|
|
RouterName: "composable2",
|
|
},
|
|
config.MethodNameGetIPNS: config.Method{
|
|
RouterName: "composable2",
|
|
},
|
|
config.MethodNamePutIPNS: config.Method{
|
|
RouterName: "composable2",
|
|
},
|
|
config.MethodNameProvide: config.Method{
|
|
RouterName: "composable2",
|
|
},
|
|
}, &ExtraDHTParams{}, &ExtraHTTPParams{
|
|
PeerID: string(pid),
|
|
PrivKeyB64: sk,
|
|
})
|
|
|
|
require.NoError(err)
|
|
|
|
_, ok := router.(*Composer)
|
|
require.True(ok)
|
|
}
|
|
|
|
func TestParserRecursiveLoop(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
_, err := Parse(config.Routers{
|
|
"composable1": config.RouterParser{
|
|
Router: config.Router{
|
|
Type: config.RouterTypeSequential,
|
|
Parameters: &config.ComposableRouterParams{
|
|
Routers: []config.ConfigRouter{
|
|
{
|
|
RouterName: "composable2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"composable2": config.RouterParser{
|
|
Router: config.Router{
|
|
Type: config.RouterTypeParallel,
|
|
Parameters: &config.ComposableRouterParams{
|
|
Routers: []config.ConfigRouter{
|
|
{
|
|
RouterName: "composable1",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}, config.Methods{
|
|
config.MethodNameFindPeers: config.Method{
|
|
RouterName: "composable2",
|
|
},
|
|
config.MethodNameFindProviders: config.Method{
|
|
RouterName: "composable2",
|
|
},
|
|
config.MethodNameGetIPNS: config.Method{
|
|
RouterName: "composable2",
|
|
},
|
|
config.MethodNamePutIPNS: config.Method{
|
|
RouterName: "composable2",
|
|
},
|
|
config.MethodNameProvide: config.Method{
|
|
RouterName: "composable2",
|
|
},
|
|
}, &ExtraDHTParams{}, nil)
|
|
|
|
require.ErrorContains(err, "dependency loop creating router with name \"composable2\"")
|
|
}
|
|
|
|
func generatePeerID() (string, string, error) {
|
|
sk, pk, err := crypto.GenerateEd25519Key(rand.Reader)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
bytes, err := crypto.MarshalPrivateKey(sk)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
enc := base64.StdEncoding.EncodeToString(bytes)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
pid, err := peer.IDFromPublicKey(pk)
|
|
return pid.String(), enc, err
|
|
}
|