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	ctx := context.TODO()
29	cfg := config.DefaultConfig()
30	ctx = config.WithContext(ctx, cfg)
31	tb.Log("configuring server")
32	s, err := NewServer(ctx)
33	if err != nil {
34		tb.Fatal(err)
35	}
36	go func() {
37		tb.Log("starting server")
38		s.Start()
39	}()
40	tb.Cleanup(func() {
41		s.Close()
42	})
43	return s, cfg, pkPath
44}
45
46func createKeyPair(tb testing.TB) (ssh.PublicKey, string) {
47	tb.Helper()
48	is := is.New(tb)
49	keyDir := tb.TempDir()
50	fp := filepath.Join(keyDir, "id_ed25519")
51	kp, err := keygen.New(fp, keygen.WithKeyType(keygen.Ed25519), keygen.WithWrite())
52	is.NoErr(err)
53	return kp.PublicKey(), fp
54}
55
56func authorizedKey(pk ssh.PublicKey) string {
57	return strings.TrimSpace(string(gossh.MarshalAuthorizedKey(pk)))
58}