github.com/moby/docker@v26.1.3+incompatible/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  }