1package server
 2
 3import (
 4	"context"
 5	"fmt"
 6	"path/filepath"
 7	"strings"
 8	"testing"
 9
10	"github.com/charmbracelet/keygen"
11	"github.com/charmbracelet/soft-serve/server/config"
12	"github.com/charmbracelet/soft-serve/server/test"
13	"github.com/charmbracelet/ssh"
14	"github.com/matryer/is"
15	gossh "golang.org/x/crypto/ssh"
16)
17
18func setupServer(tb testing.TB) (*Server, *config.Config, string) {
19	tb.Helper()
20	tb.Log("creating keypair")
21	pub, pkPath := createKeyPair(tb)
22	dp := tb.TempDir()
23	sshPort := fmt.Sprintf(":%d", test.RandomPort())
24	tb.Setenv("SOFT_SERVE_DATA_PATH", dp)
25	tb.Setenv("SOFT_SERVE_INITIAL_ADMIN_KEY", authorizedKey(pub))
26	tb.Setenv("SOFT_SERVE_SSH_LISTEN_ADDR", sshPort)
27	tb.Setenv("SOFT_SERVE_GIT_LISTEN_ADDR", fmt.Sprintf(":%d", test.RandomPort()))
28	cfg := config.DefaultConfig()
29	tb.Log("configuring server")
30	ctx := context.TODO()
31	s, err := NewServer(ctx, cfg)
32	if err != nil {
33		tb.Fatal(err)
34	}
35	go func() {
36		tb.Log("starting server")
37		s.Start()
38	}()
39	tb.Cleanup(func() {
40		s.Close()
41	})
42	return s, cfg, pkPath
43}
44
45func createKeyPair(tb testing.TB) (ssh.PublicKey, string) {
46	tb.Helper()
47	is := is.New(tb)
48	keyDir := tb.TempDir()
49	kp, err := keygen.NewWithWrite(filepath.Join(keyDir, "id"), nil, keygen.Ed25519)
50	is.NoErr(err)
51	pubkey, _, _, _, err := ssh.ParseAuthorizedKey(kp.PublicKey())
52	is.NoErr(err)
53	return pubkey, filepath.Join(keyDir, "id_ed25519")
54}
55
56func authorizedKey(pk ssh.PublicKey) string {
57	return strings.TrimSpace(string(gossh.MarshalAuthorizedKey(pk)))
58}