| // Copyright 2022 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package sandbox |
| |
| import ( |
| "errors" |
| "os" |
| "os/exec" |
| "strings" |
| "testing" |
| |
| "golang.org/x/pkgsite-metrics/internal/derrors" |
| test "golang.org/x/pkgsite-metrics/internal/testing" |
| ) |
| |
| func TestIntegration(t *testing.T) { |
| test.NeedsIntegrationEnv(t) |
| |
| cmd := exec.Command("make") |
| cmd.Stdout = os.Stdout |
| cmd.Stderr = os.Stderr |
| if err := cmd.Run(); err != nil { |
| t.Fatal(err) |
| } |
| } |
| |
| // TestSandbox tests require a minimal bundle, in testdata/bundle. |
| // The Makefile in this directory will build and install the binaries |
| // needed for the test. See TestIntegration above. |
| func TestSandbox(t *testing.T) { |
| if os.Getenv("RUN_FROM_MAKE") != "1" { |
| t.Skip("skipping; must run with 'make'.") |
| } |
| sb := New("testdata/bundle") |
| sb.Runsc = "/usr/local/bin/runsc" // must match path in Makefile |
| if err := sb.Validate(); err != nil { |
| t.Fatal(err) |
| } |
| |
| check := func(t *testing.T, cmd *Cmd, want string) { |
| t.Helper() |
| out, err := cmd.Output() |
| if err != nil { |
| t.Fatal(derrors.IncludeStderr(err)) |
| } |
| got := string(out) |
| if got != want { |
| t.Fatalf("got\n%q\nwant\n%q", got, want) |
| } |
| } |
| |
| t.Run("printargs", func(t *testing.T) { |
| check(t, sb.Command("printargs", "a", "b"), `args: |
| 0: "a" |
| 1: "b"`) |
| }) |
| |
| t.Run("space in arg", func(t *testing.T) { |
| check(t, sb.Command("printargs", "a", "b c\td"), `args: |
| 0: "a" |
| 1: "b c\td"`) |
| }) |
| |
| t.Run("replace env", func(t *testing.T) { |
| cmd := sb.Command("printargs", "$HOME", "$FOO") |
| cmd.Env = []string{"FOO=17"} |
| check(t, cmd, `args: |
| 0: "" |
| 1: "17"`) |
| }) |
| t.Run("append to env", func(t *testing.T) { |
| cmd := sb.Command("printargs", "$HOME", "$FOO") |
| cmd.Env = []string{"FOO=17"} |
| cmd.AppendToEnv = true |
| check(t, cmd, `args: |
| 0: "/" |
| 1: "17"`) |
| }) |
| t.Run("no program", func(t *testing.T) { |
| _, err := sb.Command("foo").Output() |
| var eerr *exec.ExitError |
| if !errors.As(err, &eerr) { |
| t.Fatalf("got %T, wanted *exec.ExitError", err) |
| } |
| if g, w := eerr.ExitCode(), 1; g != w { |
| t.Fatalf("got exit code %d, wanted %d", g, w) |
| } |
| if g, w := string(eerr.Stderr), "no such file"; !strings.Contains(g, w) { |
| t.Fatalf("got\n%q\nwhich does not contain %q", g, w) |
| } |
| }) |
| } |
| |
| func TestValidate(t *testing.T) { |
| // Validate doesn't actually run the sandbox, so we can test it. |
| t.Skip("fails in gcloud build") |
| sb := New("testdata/bundle") |
| sb.Runsc = "/usr/local/bin/runsc" |
| if err := sb.Validate(); err != nil { |
| t.Fatal(err) |
| } |
| } |