Skip to content
File

Blob: packaging/launcher_test.go

go101 lines
1package packaging
2 
3import (
4 "os"
5 "os/exec"
6 "path/filepath"
7 "runtime"
8 "strings"
9 "testing"
10)
11 
12func TestLauncherEnvironment(t *testing.T) {
13 if runtime.GOOS == "windows" {
14 t.Skip("packaged launchers require a POSIX shell")
15 }
16 
17 for _, service := range []string{"server", "dns", "client"} {
18 t.Run(service, func(t *testing.T) {
19 template, err := os.ReadFile(filepath.Join("templates", service+"-launch.sh"))
20 if err != nil {
21 t.Fatal(err)
22 }
23 for _, test := range []struct {
24 name string
25 contents string
26 inherited string
27 override bool
28 want string
29 }{
30 {name: "bare assignment", contents: "KV_PROVIDER=sqlite\n", want: "sqlite"},
31 {name: "exported assignment", contents: "export KV_PROVIDER=sqlite\n", override: true, want: "sqlite"},
32 {name: "sourced shell syntax", contents: "SYNTHETIC_KV='sql'\nKV_PROVIDER=\"${SYNTHETIC_KV}ite\" # shell expansion\n", override: true, want: "sqlite"},
33 {name: "override inherited value", contents: "KV_PROVIDER=sqlite\n", inherited: "aof", want: "sqlite"},
34 {name: "no environment file", inherited: "sqlite", override: true, want: "sqlite"},
35 {name: "unset provider", want: "unset"},
36 } {
37 t.Run(test.name, func(t *testing.T) {
38 root := t.TempDir()
39 configDir := filepath.Join(root, "specter")
40 if err := os.Mkdir(configDir, 0700); err != nil {
41 t.Fatal(err)
42 }
43 write := func(path, contents string, mode os.FileMode) {
44 t.Helper()
45 if err := os.WriteFile(path, []byte(contents), mode); err != nil {
46 t.Fatal(err)
47 }
48 }
49 binDir := filepath.Join(root, "bin")
50 if err := os.Mkdir(binDir, 0700); err != nil {
51 t.Fatal(err)
52 }
53 // The stub prints only synthetic values and argv, never the process environment.
54 write(filepath.Join(binDir, "specter"), "#!/bin/sh\nprintf '%s\\n' \"${KV_PROVIDER-unset}\" \"$@\"\n", 0700)
55 launcher := filepath.Join(root, "launch")
56 write(launcher, strings.NewReplacer("__BINDIR__", binDir, "__SYSCONFDIR__", root).Replace(string(template)), 0700)
57 config := filepath.Join(root, "client config.yaml")
58 write(config, "# synthetic client config\n", 0600)
59 
60 command := exec.Command("/bin/sh", launcher)
61 command.Env = []string{
62 "SPECTER_GLOBAL_ARGS=--verbose --sentry synthetic",
63 "SPECTER_SERVER_ARGS=--data-dir /synthetic/data --apex example.test",
64 "SPECTER_DNS_ARGS=--rpc unix:///synthetic/rpc.sock",
65 "SPECTER_CLIENT_CONFIG=" + config,
66 "SPECTER_CLIENT_ARGS=--listen 127.0.0.1:9999",
67 }
68 if test.inherited != "" {
69 command.Env = append(command.Env, "KV_PROVIDER="+test.inherited)
70 }
71 envFile := filepath.Join(configDir, service+".env")
72 if test.override {
73 envFile = filepath.Join(root, "override environment.env")
74 command.Env = append(command.Env, "SPECTER_"+strings.ToUpper(service)+"_ENV_FILE="+envFile)
75 }
76 if test.contents != "" {
77 write(envFile, test.contents, 0600)
78 }
79 
80 args := []string{test.want, "--verbose", "--sentry", "synthetic", service}
81 switch service {
82 case "server":
83 args = append(args, "--data-dir", "/synthetic/data", "--apex", "example.test")
84 case "dns":
85 args = append(args, "--rpc", "unix:///synthetic/rpc.sock")
86 case "client":
87 args = append(args, "tunnel", "--config", config, "--listen", "127.0.0.1:9999")
88 }
89 output, err := command.CombinedOutput()
90 if err != nil {
91 t.Fatalf("launcher: %v\n%s", err, output)
92 }
93 if want := strings.Join(args, "\n") + "\n"; string(output) != want {
94 t.Fatalf("launcher output = %q, want %q", output, want)
95 }
96 })
97 }
98 })
99 }
100}