github.com/panekj/cli@v0.0.0-20230304125325-467dd2f3797e/internal/test/environment/testenv.go (about) 1 package environment 2 3 import ( 4 "fmt" 5 "os" 6 "strings" 7 "testing" 8 "time" 9 10 "github.com/docker/docker/client" 11 "github.com/pkg/errors" 12 "gotest.tools/v3/icmd" 13 "gotest.tools/v3/poll" 14 "gotest.tools/v3/skip" 15 ) 16 17 // Setup a new environment 18 func Setup() error { 19 dockerHost := os.Getenv("TEST_DOCKER_HOST") 20 if dockerHost == "" { 21 return errors.New("$TEST_DOCKER_HOST must be set") 22 } 23 if err := os.Setenv(client.EnvOverrideHost, dockerHost); err != nil { 24 return err 25 } 26 27 if dockerCertPath := os.Getenv("TEST_DOCKER_CERT_PATH"); dockerCertPath != "" { 28 if err := os.Setenv(client.EnvOverrideCertPath, dockerCertPath); err != nil { 29 return err 30 } 31 if err := os.Setenv(client.EnvTLSVerify, "1"); err != nil { 32 return err 33 } 34 } 35 36 if val := boolFromString(os.Getenv("TEST_REMOTE_DAEMON")); val { 37 if err := os.Setenv("REMOTE_DAEMON", "1"); err != nil { 38 return err 39 } 40 } 41 42 if val := boolFromString(os.Getenv("TEST_SKIP_PLUGIN_TESTS")); val { 43 if err := os.Setenv("SKIP_PLUGIN_TESTS", "1"); err != nil { 44 return err 45 } 46 } 47 48 return nil 49 } 50 51 // RemoteDaemon returns true if running against a remote daemon 52 func RemoteDaemon() bool { 53 return os.Getenv("REMOTE_DAEMON") != "" 54 } 55 56 // SkipPluginTests returns if plugin tests should be skipped 57 func SkipPluginTests() bool { 58 return os.Getenv("SKIP_PLUGIN_TESTS") != "" 59 } 60 61 // boolFromString determines boolean value from string 62 func boolFromString(val string) bool { 63 switch strings.ToLower(val) { 64 case "true", "1": 65 return true 66 default: 67 return false 68 } 69 } 70 71 // DefaultPollSettings used with gotestyourself/poll 72 var DefaultPollSettings = poll.WithDelay(100 * time.Millisecond) 73 74 // SkipIfNotExperimentalDaemon returns whether the test docker daemon is in experimental mode 75 func SkipIfNotExperimentalDaemon(t *testing.T) { 76 t.Helper() 77 result := icmd.RunCmd(icmd.Command("docker", "info", "--format", "{{.ExperimentalBuild}}")) 78 result.Assert(t, icmd.Expected{Err: icmd.None}) 79 experimentalBuild := strings.TrimSpace(result.Stdout()) == "true" 80 skip.If(t, !experimentalBuild, "running against a non-experimental daemon") 81 } 82 83 // SkipIfDaemonNotLinux skips the test unless the running docker daemon is on Linux 84 func SkipIfDaemonNotLinux(t *testing.T) { 85 t.Helper() 86 result := icmd.RunCmd(icmd.Command("docker", "info", "--format", "{{.OSType}}")) 87 result.Assert(t, icmd.Expected{Err: icmd.None}) 88 isLinux := strings.TrimSpace(result.Stdout()) == "linux" 89 skip.If(t, !isLinux, "running against a Linux daemon") 90 } 91 92 // SkipIfCgroupNamespacesNotSupported skips the test if the running docker daemon doesn't support cgroup namespaces 93 func SkipIfCgroupNamespacesNotSupported(t *testing.T) { 94 t.Helper() 95 result := icmd.RunCmd(icmd.Command("docker", "info", "--format", "{{.SecurityOptions}}")) 96 result.Assert(t, icmd.Expected{Err: icmd.None}) 97 cgroupNsFound := strings.Contains(result.Stdout(), "name=cgroupns") 98 99 skip.If(t, !cgroupNsFound, fmt.Sprintf("running against a daemon that doesn't support cgroup namespaces (security options: %s)", result.Stdout())) 100 }