From b371f82162cfd20912c6aa1cea6d1d485528563d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0t=C4=9Bp=C3=A1n=20Pila=C5=99?= Date: Sun, 15 Apr 2018 11:43:58 +0200 Subject: [PATCH] Mock env in tests to simplify run on Travis CI --- cmd/sup/main.go | 19 ++++++----- cmd/sup/main_test.go | 34 +++++++++++++++----- cmd/sup/mock_server_test.go | 1 + vendor/github.com/adammck/venv/README.md | 40 ++++++++++++++++++++++++ vendor/github.com/adammck/venv/venv.go | 21 +++++++++++++ vendor/vendor.json | 6 ++++ 6 files changed, 105 insertions(+), 16 deletions(-) create mode 100644 vendor/github.com/adammck/venv/README.md create mode 100644 vendor/github.com/adammck/venv/venv.go diff --git a/cmd/sup/main.go b/cmd/sup/main.go index 28a7113..08ac48a 100644 --- a/cmd/sup/main.go +++ b/cmd/sup/main.go @@ -3,6 +3,7 @@ package main import ( "flag" "fmt" + "io" "io/ioutil" "os" "os/user" @@ -12,10 +13,10 @@ import ( "text/tabwriter" "time" + "github.com/adammck/venv" "github.com/mikkeloscar/sshconfig" "github.com/pkg/errors" "github.com/pressly/sup" - "io" ) var ( @@ -52,6 +53,7 @@ type options struct { exceptHosts string debug bool disablePrefix bool + env venv.Env } func init() { @@ -85,6 +87,7 @@ func main() { return } + flags.env = venv.OS() if err := runSupfile(os.Stderr, flags, flag.Args()); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) @@ -99,7 +102,7 @@ func runSupfile(errStream io.Writer, options options, args []string) error { return err } // Parse network and commands to be run from flags. - network, commands, err := parseArgs(errStream, args, conf) + network, commands, err := parseArgs(errStream, options, args, conf) if err != nil { return err } @@ -247,7 +250,7 @@ func resolvePath(path string) string { // parseArgs parses args and returns network and commands to be run. // On error, it prints usage and exits. -func parseArgs(errStream io.Writer, args []string, conf *sup.Supfile) (*sup.Network, []*sup.Command, error) { +func parseArgs(errStream io.Writer, options options, args []string, conf *sup.Supfile) (*sup.Network, []*sup.Command, error) { var commands []*sup.Command if len(args) < 1 { @@ -290,15 +293,15 @@ func parseArgs(errStream io.Writer, args []string, conf *sup.Supfile) (*sup.Netw // Add default nonce network.Env.Set("SUP_TIME", time.Now().UTC().Format(time.RFC3339)) - if os.Getenv("SUP_TIME") != "" { - network.Env.Set("SUP_TIME", os.Getenv("SUP_TIME")) + if options.env.Getenv("SUP_TIME") != "" { + network.Env.Set("SUP_TIME", options.env.Getenv("SUP_TIME")) } // Add user - if os.Getenv("SUP_USER") != "" { - network.Env.Set("SUP_USER", os.Getenv("SUP_USER")) + if options.env.Getenv("SUP_USER") != "" { + network.Env.Set("SUP_USER", options.env.Getenv("SUP_USER")) } else { - network.Env.Set("SUP_USER", os.Getenv("USER")) + network.Env.Set("SUP_USER", options.env.Getenv("USER")) } for _, cmd := range args[1:] { diff --git a/cmd/sup/main_test.go b/cmd/sup/main_test.go index a966a37..80d354c 100644 --- a/cmd/sup/main_test.go +++ b/cmd/sup/main_test.go @@ -4,11 +4,16 @@ import ( "fmt" "io/ioutil" "os" - "os/user" "path/filepath" "strings" "testing" "time" + + "github.com/adammck/venv" +) + +const ( + envTestUser = "sup_test_user" ) var ( @@ -28,6 +33,7 @@ we kp re withTmpDir(t, input, func(dirname string) { options := options{ dirname: dirname, + env: testEnv(), } if err := runSupfile(testErrStream, options, []string{}); err == nil { t.Fatal("Expected an error") @@ -55,6 +61,7 @@ commands: withTmpDir(t, input, func(dirname string) { options := options{ dirname: dirname, + env: testEnv(), } if err := runSupfile(testErrStream, options, []string{}); err != ErrUsage { t.Fatal(err) @@ -107,6 +114,7 @@ commands: withTmpDir(t, input, func(dirname string) { options := options{ dirname: dirname, + env: testEnv(), } if err := runSupfile(testErrStream, options, []string{"staging"}); err != ErrNetworkNoHosts { t.Fatal(err) @@ -134,6 +142,7 @@ commands: withTmpDir(t, input, func(dirname string) { options := options{ dirname: dirname, + env: testEnv(), } if err := runSupfile(testErrStream, options, []string{"staging"}); err != ErrUsage { t.Fatal(err) @@ -168,6 +177,7 @@ targets: withTmpDir(t, input, func(dirname string) { options := options{ dirname: dirname, + env: testEnv(), } if err := runSupfile(testErrStream, options, []string{"staging", "step5"}); err == nil { t.Fatal("Expected an error") @@ -205,6 +215,7 @@ targets: withTmpDir(t, input, func(dirname string) { options := options{ dirname: dirname, + env: testEnv(), } if err := runSupfile(testErrStream, options, []string{"staging", "walk"}); err == nil { t.Fatal("Expected an error") @@ -389,6 +400,7 @@ commands: options := options{ dirname: dirname, onlyHosts: "server42", + env: venv.Mock(), } if err := runSupfile(testErrStream, options, []string{"staging", "step1"}); err == nil { t.Fatal("Expected an error") @@ -420,6 +432,7 @@ commands: options := options{ dirname: dirname, onlyHosts: "server(", + env: venv.Mock(), } if err := runSupfile(testErrStream, options, []string{"staging", "step1"}); err == nil { t.Fatal("Expected an error") @@ -487,6 +500,7 @@ commands: options := options{ dirname: dirname, exceptHosts: "server", + env: venv.Mock(), } if err := runSupfile(testErrStream, options, []string{"staging", "step1"}); err == nil { t.Fatal("Expected an error") @@ -518,6 +532,7 @@ commands: options := options{ dirname: dirname, exceptHosts: "server(", + env: venv.Mock(), } if err := runSupfile(testErrStream, options, []string{"staging", "step1"}); err == nil { t.Fatal("Expected an error") @@ -578,6 +593,7 @@ commands: withTmpDir(t, input, func(dirname string) { options := options{ dirname: dirname, + env: testEnv(), } args := []string{"staging", "step1"} if err := runSupfile(testErrStream, options, args); err == nil { @@ -618,15 +634,11 @@ commands: if err := runSupfile(testErrStream, options, []string{"staging", "step1"}); err != nil { t.Fatal(err) } - currentUser, err := user.Current() - if err != nil { - t.Fatal(err) - } m := newMatcher(outputs, t) m.expectActivityOnServers(0, 1) m.expectExportOnActiveServers(`SUP_NETWORK="staging"`) m.expectExportOnActiveServers(`SUP_ENV=""`) - m.expectExportOnActiveServers(fmt.Sprintf(`SUP_USER="%s"`, currentUser.Name)) + m.expectExportOnActiveServers(fmt.Sprintf(`SUP_USER="%s"`, envTestUser)) m.expectExportRegexpOnActiveServers(`SUP_HOST="localhost:\d+"`) }) }) @@ -694,7 +706,7 @@ commands: if err != nil { t.Fatal(err) } - os.Setenv("SUP_TIME", "now") + options.env.Setenv("SUP_TIME", "now") if err := runSupfile(testErrStream, options, []string{"staging", "step1"}); err != nil { t.Fatal(err) @@ -726,7 +738,7 @@ commands: if err != nil { t.Fatal(err) } - os.Setenv("SUP_USER", "sup_rules") + options.env.Setenv("SUP_USER", "sup_rules") if err := runSupfile(testErrStream, options, []string{"staging", "step1"}); err != nil { t.Fatal(err) @@ -1109,3 +1121,9 @@ func writeSupfileAs(dirname, filename, input string) error { 0666, ) } + +func testEnv() venv.Env { + env := venv.Mock() + env.Setenv("USER", envTestUser) + return env +} diff --git a/cmd/sup/mock_server_test.go b/cmd/sup/mock_server_test.go index 9fe30a8..4443e0f 100644 --- a/cmd/sup/mock_server_test.go +++ b/cmd/sup/mock_server_test.go @@ -53,6 +53,7 @@ func setupMockEnv(dirname string, count int) ([]bytes.Buffer, options, error) { options := options{ sshConfig: sshConfigPath, dirname: dirname, + env: testEnv(), } return outputs, options, nil } diff --git a/vendor/github.com/adammck/venv/README.md b/vendor/github.com/adammck/venv/README.md new file mode 100644 index 0000000..09a10ba --- /dev/null +++ b/vendor/github.com/adammck/venv/README.md @@ -0,0 +1,40 @@ +# venv + +[![GoDoc](https://godoc.org/github.com/adammck/venv?status.svg)](https://godoc.org/github.com/adammck/venv) +[![Build Status](https://travis-ci.org/adammck/venv.svg?branch=master)](https://travis-ci.org/adammck/venv) + +This is a Go library to abstract access to environment variables. +Like [spf13/afero][afero] or [blang/vfs][vfs], but for the env. + +## Usage + +```go +package main + +import ( + "fmt" + "github.com/adammck/venv" +) + +func main() { + var e venv.Env + + // Use the real environment + + e = venv.OS() + fmt.Printf("Hello, %s!\n", e.Getenv("USER")) + + // Or use a mock + + e = venv.Mock() + e.Setenv("USER", "fred") + fmt.Printf("Hello, %s!\n", e.Getenv("USER")) +} +``` + +## License + +MIT. + +[afero]: https://github.com/spf13/afero +[vfs]: https://github.com/blang/vfs diff --git a/vendor/github.com/adammck/venv/venv.go b/vendor/github.com/adammck/venv/venv.go new file mode 100644 index 0000000..a873cc9 --- /dev/null +++ b/vendor/github.com/adammck/venv/venv.go @@ -0,0 +1,21 @@ +package venv + +import ( + "github.com/adammck/venv/mock" + "github.com/adammck/venv/os" +) + +type Env interface { + Environ() []string + Getenv(key string) string + Setenv(key, value string) error + Clearenv() +} + +func OS() Env { + return os.New() +} + +func Mock() Env { + return mock.New() +} diff --git a/vendor/vendor.json b/vendor/vendor.json index 30fae56..5656cc6 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -2,6 +2,12 @@ "comment": "", "ignore": "test appengine", "package": [ + { + "checksumSHA1": "JpbTntZjOHcUo5P9VrdcTFEGZ9Y=", + "path": "github.com/adammck/venv", + "revision": "8a9c907a37d36a8f34fa1c5b81aaf80c2554a306", + "revisionTime": "2016-08-19T02:56:05Z" + }, { "path": "github.com/goware/prefixer", "revision": "395022866408d928fc2439f7eac73dd8d370ec1d",