Files
indra/pkg/engine/mockengine.go
2023-08-10 18:48:59 +01:00

108 lines
2.4 KiB
Go

package engine
import (
"context"
"crypto/rand"
"git.indra-labs.org/dev/ind/pkg/crypto"
"git.indra-labs.org/dev/ind/pkg/crypto/sha256"
"git.indra-labs.org/dev/ind/pkg/engine/node"
"git.indra-labs.org/dev/ind/pkg/engine/transport"
badger "github.com/indra-labs/go-ds-badger3"
"github.com/multiformats/go-multiaddr"
"os"
)
// CreateMockEngine creates an indra Engine with a random localhost listener.
func CreateMockEngine(seed []string, dataPath string, ctx context.Context, cancel context.CancelFunc) (ng *Engine, store *badger.Datastore, closer func()) {
var (
e error
keys []*crypto.Keys
k *crypto.Keys
)
defer func(f *error) {
if *f != nil {
fails(os.RemoveAll(dataPath))
}
}(&e)
if k, e = crypto.GenerateKeys(); fails(e) {
return
}
keys = append(keys, k)
secret := sha256.New()
rand.Read(secret[:])
store, closer = transport.BadgerStore(dataPath, secret[:])
if store == nil {
log.E.Ln("could not open database")
return nil, store, closer
}
var l *transport.Listener
if l, e = transport.NewListener(seed,
[]string{transport.LocalhostZeroIPv4TCP,
transport.LocalhostZeroIPv6TCP}, k, store, closer, ctx,
transport.DefaultMTU, cancel); fails(e) {
return
}
if l == nil {
panic("maybe you have no network device?")
}
sa := transport.GetHostFirstMultiaddr(l.Host)
var ma multiaddr.Multiaddr
if ma, e = multiaddr.NewMultiaddr(sa); fails(e) {
return
}
var nod *node.Node
if nod, _ = node.NewNode([]multiaddr.Multiaddr{ma}, k, nil, 50000); fails(e) {
return
}
if ng, e = New(Params{
Transport: transport.NewDuplexByteChan(transport.ConnBufs),
Listener: l,
Keys: k,
Node: nod,
}); fails(e) {
}
return
}
func CreateAndStartMockEngines(n int, ctx context.Context,
cancel context.CancelFunc) (engines []*Engine, closer func(), e error) {
closer = func() {}
var seed []string
dataPath := make([]string, n)
for i := 0; i < n; i++ {
dataPath[i], e = os.MkdirTemp(os.TempDir(), "badger")
if e != nil {
return
}
var eng *Engine
if eng, _, _ = CreateMockEngine(seed, dataPath[i], ctx, cancel); fails(e) {
return
}
engines = append(engines, eng)
if i == 0 {
seed = transport.GetHostMultiaddrs(eng.Listener.Host)
}
go eng.Start()
}
closer = func() {
for i := range engines {
if engines[i] != nil {
engines[i].Shutdown()
}
}
for i := range dataPath {
if dataPath[i] != "" {
fails(os.RemoveAll(dataPath[i]))
}
}
}
return
}