File
Blob: packaging/launcher_test.go
| 1 | package packaging |
| 2 | |
| 3 | import ( |
| 4 | "os" |
| 5 | "os/exec" |
| 6 | "path/filepath" |
| 7 | "runtime" |
| 8 | "strings" |
| 9 | "testing" |
| 10 | ) |
| 11 | |
| 12 | func 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 | } |