github.com/tonistiigi/docker@v0.10.1-0.20240229224939-974013b0dc6a/integration-cli/docker_cli_info_test.go (about) 1 package main 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 "strings" 8 "testing" 9 10 "github.com/docker/docker/integration-cli/cli" 11 "gotest.tools/v3/assert" 12 ) 13 14 type DockerCLIInfoSuite struct { 15 ds *DockerSuite 16 } 17 18 func (s *DockerCLIInfoSuite) TearDownTest(ctx context.Context, c *testing.T) { 19 s.ds.TearDownTest(ctx, c) 20 } 21 22 func (s *DockerCLIInfoSuite) OnTimeout(c *testing.T) { 23 s.ds.OnTimeout(c) 24 } 25 26 // ensure docker info succeeds 27 func (s *DockerCLIInfoSuite) TestInfoEnsureSucceeds(c *testing.T) { 28 out := cli.DockerCmd(c, "info").Stdout() 29 30 // always shown fields 31 stringsToCheck := []string{ 32 "ID:", 33 "Containers:", 34 " Running:", 35 " Paused:", 36 " Stopped:", 37 "Images:", 38 "OSType:", 39 "Architecture:", 40 "Logging Driver:", 41 "Operating System:", 42 "CPUs:", 43 "Total Memory:", 44 "Kernel Version:", 45 "Storage Driver:", 46 "Volume:", 47 "Network:", 48 "Live Restore Enabled:", 49 } 50 51 if testEnv.DaemonInfo.OSType == "linux" { 52 stringsToCheck = append(stringsToCheck, "Init Binary:", "Security Options:", "containerd version:", "runc version:", "init version:") 53 } 54 55 if DaemonIsLinux() { 56 stringsToCheck = append(stringsToCheck, "Runtimes:", "Default Runtime: runc") 57 } 58 59 if testEnv.DaemonInfo.ExperimentalBuild { 60 stringsToCheck = append(stringsToCheck, "Experimental: true") 61 } else { 62 stringsToCheck = append(stringsToCheck, "Experimental: false") 63 } 64 65 for _, linePrefix := range stringsToCheck { 66 assert.Assert(c, strings.Contains(out, linePrefix), "couldn't find string %v in output", linePrefix) 67 } 68 } 69 70 func (s *DockerCLIInfoSuite) TestInfoDisplaysRunningContainers(c *testing.T) { 71 testRequires(c, DaemonIsLinux) 72 73 existing := existingContainerStates(c) 74 75 cli.DockerCmd(c, "run", "-d", "busybox", "top") 76 out := cli.DockerCmd(c, "info").Stdout() 77 assert.Assert(c, strings.Contains(out, fmt.Sprintf("Containers: %d\n", existing["Containers"]+1))) 78 assert.Assert(c, strings.Contains(out, fmt.Sprintf(" Running: %d\n", existing["ContainersRunning"]+1))) 79 assert.Assert(c, strings.Contains(out, fmt.Sprintf(" Paused: %d\n", existing["ContainersPaused"]))) 80 assert.Assert(c, strings.Contains(out, fmt.Sprintf(" Stopped: %d\n", existing["ContainersStopped"]))) 81 } 82 83 func (s *DockerCLIInfoSuite) TestInfoDisplaysPausedContainers(c *testing.T) { 84 testRequires(c, IsPausable) 85 86 existing := existingContainerStates(c) 87 88 id := runSleepingContainer(c, "-d") 89 90 cli.DockerCmd(c, "pause", id) 91 92 out := cli.DockerCmd(c, "info").Stdout() 93 assert.Assert(c, strings.Contains(out, fmt.Sprintf("Containers: %d\n", existing["Containers"]+1))) 94 assert.Assert(c, strings.Contains(out, fmt.Sprintf(" Running: %d\n", existing["ContainersRunning"]))) 95 assert.Assert(c, strings.Contains(out, fmt.Sprintf(" Paused: %d\n", existing["ContainersPaused"]+1))) 96 assert.Assert(c, strings.Contains(out, fmt.Sprintf(" Stopped: %d\n", existing["ContainersStopped"]))) 97 } 98 99 func (s *DockerCLIInfoSuite) TestInfoDisplaysStoppedContainers(c *testing.T) { 100 testRequires(c, DaemonIsLinux) 101 102 existing := existingContainerStates(c) 103 104 out := cli.DockerCmd(c, "run", "-d", "busybox", "top").Stdout() 105 cleanedContainerID := strings.TrimSpace(out) 106 107 cli.DockerCmd(c, "stop", cleanedContainerID) 108 109 out = cli.DockerCmd(c, "info").Stdout() 110 assert.Assert(c, strings.Contains(out, fmt.Sprintf("Containers: %d\n", existing["Containers"]+1))) 111 assert.Assert(c, strings.Contains(out, fmt.Sprintf(" Running: %d\n", existing["ContainersRunning"]))) 112 assert.Assert(c, strings.Contains(out, fmt.Sprintf(" Paused: %d\n", existing["ContainersPaused"]))) 113 assert.Assert(c, strings.Contains(out, fmt.Sprintf(" Stopped: %d\n", existing["ContainersStopped"]+1))) 114 } 115 116 func existingContainerStates(c *testing.T) map[string]int { 117 out := cli.DockerCmd(c, "info", "--format", "{{json .}}").Stdout() 118 var m map[string]interface{} 119 err := json.Unmarshal([]byte(out), &m) 120 assert.NilError(c, err) 121 res := map[string]int{} 122 res["Containers"] = int(m["Containers"].(float64)) 123 res["ContainersRunning"] = int(m["ContainersRunning"].(float64)) 124 res["ContainersPaused"] = int(m["ContainersPaused"].(float64)) 125 res["ContainersStopped"] = int(m["ContainersStopped"].(float64)) 126 return res 127 }