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}