2021-11-23 14:51:02 +01:00
|
|
|
package itest
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"io/ioutil"
|
|
|
|
|
"net"
|
2022-10-13 14:07:28 +02:00
|
|
|
"path/filepath"
|
2021-11-23 14:51:02 +01:00
|
|
|
"sync"
|
|
|
|
|
"time"
|
|
|
|
|
|
2022-03-29 20:33:17 +02:00
|
|
|
"github.com/lightninglabs/loop/swapserverrpc"
|
2021-11-23 14:51:02 +01:00
|
|
|
"github.com/lightninglabs/pool/auctioneerrpc"
|
|
|
|
|
"github.com/lightningnetwork/lnd/cert"
|
|
|
|
|
"google.golang.org/grpc"
|
|
|
|
|
"google.golang.org/grpc/credentials"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
// DefaultAutogenValidity is the default validity of a self-signed
|
|
|
|
|
// certificate. The value corresponds to 14 months
|
|
|
|
|
// (14 months * 30 days * 24 hours).
|
|
|
|
|
DefaultAutogenValidity = 14 * 30 * 24 * time.Hour
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type loopPoolServer struct {
|
|
|
|
|
auctioneerrpc.UnimplementedChannelAuctioneerServer
|
2022-03-29 20:33:17 +02:00
|
|
|
swapserverrpc.UnimplementedSwapServerServer
|
2021-11-23 14:51:02 +01:00
|
|
|
}
|
|
|
|
|
|
2023-04-14 00:42:14 +02:00
|
|
|
type ServerHarness struct {
|
|
|
|
|
ServerHost string
|
2021-11-23 14:51:02 +01:00
|
|
|
mockServer *grpc.Server
|
|
|
|
|
|
2023-04-14 00:42:14 +02:00
|
|
|
CertFile string
|
2021-11-23 14:51:02 +01:00
|
|
|
server *loopPoolServer
|
|
|
|
|
|
|
|
|
|
errChan chan error
|
|
|
|
|
|
|
|
|
|
wg sync.WaitGroup
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-14 00:42:14 +02:00
|
|
|
// NewServerHarness creates a new ServerHarness instance.
|
|
|
|
|
func NewServerHarness(serverHost string) *ServerHarness {
|
|
|
|
|
return &ServerHarness{
|
|
|
|
|
ServerHost: serverHost,
|
2021-11-23 14:51:02 +01:00
|
|
|
errChan: make(chan error, 1),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-14 00:42:14 +02:00
|
|
|
// Stop stops the mock Loop/Pool server.
|
|
|
|
|
func (s *ServerHarness) Stop() {
|
2021-11-23 14:51:02 +01:00
|
|
|
s.mockServer.Stop()
|
|
|
|
|
s.wg.Wait()
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-14 00:42:14 +02:00
|
|
|
// Start starts the mock Loop/Pool server.
|
|
|
|
|
func (s *ServerHarness) Start() error {
|
2021-11-23 14:51:02 +01:00
|
|
|
tempDirName, err := ioutil.TempDir("", "litditest")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-14 00:42:14 +02:00
|
|
|
s.CertFile = filepath.Join(tempDirName, "proxy.cert")
|
2022-10-13 14:07:28 +02:00
|
|
|
keyFile := filepath.Join(tempDirName, "proxy.key")
|
2023-04-14 00:42:14 +02:00
|
|
|
creds, err := genCertPair(s.CertFile, keyFile)
|
2021-11-23 14:51:02 +01:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-14 00:42:14 +02:00
|
|
|
httpListener, err := net.Listen("tcp", s.ServerHost)
|
2021-11-23 14:51:02 +01:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s.mockServer = grpc.NewServer(grpc.Creds(creds))
|
|
|
|
|
s.server = &loopPoolServer{}
|
|
|
|
|
|
|
|
|
|
auctioneerrpc.RegisterChannelAuctioneerServer(s.mockServer, s.server)
|
|
|
|
|
|
|
|
|
|
s.wg.Add(1)
|
|
|
|
|
go func() {
|
|
|
|
|
defer s.wg.Done()
|
|
|
|
|
s.errChan <- s.mockServer.Serve(httpListener)
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// genCertPair generates a pair of private key and certificate and returns them
|
|
|
|
|
// in different formats needed to spin up test servers and clients.
|
|
|
|
|
func genCertPair(certFile, keyFile string) (credentials.TransportCredentials,
|
|
|
|
|
error) {
|
|
|
|
|
|
2023-03-10 16:29:05 -08:00
|
|
|
certBytes, keyBytes, err := cert.GenCertPair(
|
|
|
|
|
"itest autogenerated cert", nil, nil, false,
|
|
|
|
|
DefaultAutogenValidity,
|
2021-11-23 14:51:02 +01:00
|
|
|
)
|
|
|
|
|
if err != nil {
|
2023-03-10 16:29:05 -08:00
|
|
|
return nil, fmt.Errorf("unable to generate cert pair: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Now that we have the certificate and key, we'll store them
|
|
|
|
|
// to the file system.
|
|
|
|
|
err = cert.WriteCertPair(certFile, keyFile, certBytes, keyBytes)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("unable to write cert pair: %v", err)
|
2021-11-23 14:51:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
creds, err := credentials.NewServerTLSFromFile(certFile, keyFile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("unable to load cert file: "+
|
|
|
|
|
"%v", err)
|
|
|
|
|
}
|
|
|
|
|
return creds, nil
|
|
|
|
|
}
|