integration-cli/docker_cli_history_test.go
e827c8ff
 package main
 
 import (
 	"fmt"
08150150
 	"regexp"
 	"strconv"
e827c8ff
 	"strings"
dc944ea7
 
04b6b0b4
 	"github.com/docker/docker/pkg/integration/checker"
dc944ea7
 	"github.com/go-check/check"
e827c8ff
 )
 
 // This is a heisen-test.  Because the created timestamp of images and the behavior of
 // sort is not predictable it doesn't always fail.
dc944ea7
 func (s *DockerSuite) TestBuildHistory(c *check.C) {
f9a3558a
 	testRequires(c, DaemonIsLinux)
ab4738b4
 	name := "testbuildhistory"
 	_, err := buildImage(name, `FROM busybox
 RUN echo "A"
 RUN echo "B"
 RUN echo "C"
 RUN echo "D"
 RUN echo "E"
 RUN echo "F"
 RUN echo "G"
 RUN echo "H"
 RUN echo "I"
 RUN echo "J"
 RUN echo "K"
 RUN echo "L"
 RUN echo "M"
 RUN echo "N"
 RUN echo "O"
 RUN echo "P"
 RUN echo "Q"
 RUN echo "R"
 RUN echo "S"
 RUN echo "T"
 RUN echo "U"
 RUN echo "V"
 RUN echo "W"
 RUN echo "X"
 RUN echo "Y"
 RUN echo "Z"`,
 		true)
e827c8ff
 
04b6b0b4
 	c.Assert(err, checker.IsNil)
e827c8ff
 
668e2369
 	out, _ := dockerCmd(c, "history", "testbuildhistory")
c0e63224
 	actualValues := strings.Split(out, "\n")[1:27]
 	expectedValues := [26]string{"Z", "Y", "X", "W", "V", "U", "T", "S", "R", "Q", "P", "O", "N", "M", "L", "K", "J", "I", "H", "G", "F", "E", "D", "C", "B", "A"}
e827c8ff
 
 	for i := 0; i < 26; i++ {
c0e63224
 		echoValue := fmt.Sprintf("echo \"%s\"", expectedValues[i])
 		actualValue := actualValues[i]
04b6b0b4
 		c.Assert(actualValue, checker.Contains, echoValue)
e827c8ff
 	}
 
 }
9a2771ea
 
dc944ea7
 func (s *DockerSuite) TestHistoryExistentImage(c *check.C) {
f9a3558a
 	testRequires(c, DaemonIsLinux)
668e2369
 	dockerCmd(c, "history", "busybox")
9a2771ea
 }
 
dc944ea7
 func (s *DockerSuite) TestHistoryNonExistentImage(c *check.C) {
693ba98c
 	_, _, err := dockerCmdWithError("history", "testHistoryNonExistentImage")
04b6b0b4
 	c.Assert(err, checker.NotNil, check.Commentf("history on a non-existent image should fail."))
9a2771ea
 }
bf573395
 
dc944ea7
 func (s *DockerSuite) TestHistoryImageWithComment(c *check.C) {
f9a3558a
 	testRequires(c, DaemonIsLinux)
fa2ace00
 	name := "testhistoryimagewithcomment"
bf573395
 
 	// make a image through docker commit <container id> [ -m messages ]
 
668e2369
 	dockerCmd(c, "run", "--name", name, "busybox", "true")
 	dockerCmd(c, "wait", name)
bf573395
 
fa2ace00
 	comment := "This_is_a_comment"
668e2369
 	dockerCmd(c, "commit", "-m="+comment, name, name)
bf573395
 
 	// test docker history <image id> to check comment messages
 
668e2369
 	out, _ := dockerCmd(c, "history", name)
fa2ace00
 	outputTabs := strings.Fields(strings.Split(out, "\n")[1])
bf573395
 	actualValue := outputTabs[len(outputTabs)-1]
04b6b0b4
 	c.Assert(actualValue, checker.Contains, comment)
bf573395
 }
08150150
 
 func (s *DockerSuite) TestHistoryHumanOptionFalse(c *check.C) {
f9a3558a
 	testRequires(c, DaemonIsLinux)
668e2369
 	out, _ := dockerCmd(c, "history", "--human=false", "busybox")
08150150
 	lines := strings.Split(out, "\n")
 	sizeColumnRegex, _ := regexp.Compile("SIZE +")
 	indices := sizeColumnRegex.FindStringIndex(lines[0])
 	startIndex := indices[0]
 	endIndex := indices[1]
 	for i := 1; i < len(lines)-1; i++ {
 		if endIndex > len(lines[i]) {
 			endIndex = len(lines[i])
 		}
 		sizeString := lines[i][startIndex:endIndex]
04b6b0b4
 
 		_, err := strconv.Atoi(strings.TrimSpace(sizeString))
 		c.Assert(err, checker.IsNil, check.Commentf("The size '%s' was not an Integer", sizeString))
08150150
 	}
 }
 
 func (s *DockerSuite) TestHistoryHumanOptionTrue(c *check.C) {
f9a3558a
 	testRequires(c, DaemonIsLinux)
668e2369
 	out, _ := dockerCmd(c, "history", "--human=true", "busybox")
08150150
 	lines := strings.Split(out, "\n")
 	sizeColumnRegex, _ := regexp.Compile("SIZE +")
04b6b0b4
 	humanSizeRegexRaw := "\\d+.*B" // Matches human sizes like 10 MB, 3.2 KB, etc
08150150
 	indices := sizeColumnRegex.FindStringIndex(lines[0])
 	startIndex := indices[0]
 	endIndex := indices[1]
 	for i := 1; i < len(lines)-1; i++ {
 		if endIndex > len(lines[i]) {
 			endIndex = len(lines[i])
 		}
 		sizeString := lines[i][startIndex:endIndex]
04b6b0b4
 		c.Assert(strings.TrimSpace(sizeString), checker.Matches, humanSizeRegexRaw, check.Commentf("The size '%s' was not in human format", sizeString))
08150150
 	}
 }