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