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/test"
12 "github.com/charmbracelet/ssh"
13 "github.com/matryer/is"
14 gossh "golang.org/x/crypto/ssh"
15)
16
17func setupServer(tb testing.TB) (*Server, string) {
18 tb.Helper()
19 tb.Log("creating keypair")
20 pub, pkPath := createKeyPair(tb)
21 dp := tb.TempDir()
22 sshPort := fmt.Sprintf(":%d", test.RandomPort())
23 tb.Setenv("SOFT_SERVE_DATA_PATH", dp)
24 tb.Setenv("SOFT_SERVE_INITIAL_ADMIN_KEY", authorizedKey(pub))
25 tb.Setenv("SOFT_SERVE_SSH_LISTEN_ADDR", sshPort)
26 tb.Setenv("SOFT_SERVE_GIT_LISTEN_ADDR", fmt.Sprintf(":%d", test.RandomPort()))
27 ctx := context.TODO()
28 tb.Log("configuring server")
29 s, err := NewServer(ctx)
30 if err != nil {
31 tb.Fatal(err)
32 }
33 go func() {
34 tb.Log("starting server")
35 s.Start()
36 }()
37 tb.Cleanup(func() {
38 s.Close()
39 })
40 return s, pkPath
41}
42
43func createKeyPair(tb testing.TB) (ssh.PublicKey, string) {
44 tb.Helper()
45 is := is.New(tb)
46 keyDir := tb.TempDir()
47 fp := filepath.Join(keyDir, "id_ed25519")
48 kp, err := keygen.New(fp, keygen.WithKeyType(keygen.Ed25519), keygen.WithWrite())
49 is.NoErr(err)
50 return kp.PublicKey(), fp
51}
52
53func authorizedKey(pk ssh.PublicKey) string {
54 return strings.TrimSpace(string(gossh.MarshalAuthorizedKey(pk)))
55}