d609de989f
This PR fix the DockerSuite.TestBuildHistory test in #19425. It changes the base image from busybox into 'minimalBaseImage()' and changes the RUN in Dockerfile into LABEL, which greatly reduces the executation time. Since the test (DockerSuite.TestBuildHistory) is really about testing docker history, not about RUN in Dockerfile, the purpose of the test is not altered. Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
125 lines
3.8 KiB
Go
125 lines
3.8 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/docker/docker/pkg/integration/checker"
|
|
"github.com/go-check/check"
|
|
)
|
|
|
|
// This is a heisen-test. Because the created timestamp of images and the behavior of
|
|
// sort is not predictable it doesn't always fail.
|
|
func (s *DockerSuite) TestBuildHistory(c *check.C) {
|
|
testRequires(c, DaemonIsLinux) // TODO Windows: This test passes on Windows,
|
|
// but currently adds a disproportionate amount of time for the value it has.
|
|
// Removing it from Windows CI for now, but this will be revisited in the
|
|
// TP5 timeframe when perf is better.
|
|
name := "testbuildhistory"
|
|
_, err := buildImage(name, `FROM `+minimalBaseImage()+`
|
|
LABEL label.A="A"
|
|
LABEL label.B="B"
|
|
LABEL label.C="C"
|
|
LABEL label.D="D"
|
|
LABEL label.E="E"
|
|
LABEL label.F="F"
|
|
LABEL label.G="G"
|
|
LABEL label.H="H"
|
|
LABEL label.I="I"
|
|
LABEL label.J="J"
|
|
LABEL label.K="K"
|
|
LABEL label.L="L"
|
|
LABEL label.M="M"
|
|
LABEL label.N="N"
|
|
LABEL label.O="O"
|
|
LABEL label.P="P"
|
|
LABEL label.Q="Q"
|
|
LABEL label.R="R"
|
|
LABEL label.S="S"
|
|
LABEL label.T="T"
|
|
LABEL label.U="U"
|
|
LABEL label.V="V"
|
|
LABEL label.W="W"
|
|
LABEL label.X="X"
|
|
LABEL label.Y="Y"
|
|
LABEL label.Z="Z"`,
|
|
true)
|
|
|
|
c.Assert(err, checker.IsNil)
|
|
|
|
out, _ := dockerCmd(c, "history", "testbuildhistory")
|
|
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"}
|
|
|
|
for i := 0; i < 26; i++ {
|
|
echoValue := fmt.Sprintf("LABEL label.%s=%s", expectedValues[i], expectedValues[i])
|
|
actualValue := actualValues[i]
|
|
c.Assert(actualValue, checker.Contains, echoValue)
|
|
}
|
|
|
|
}
|
|
|
|
func (s *DockerSuite) TestHistoryExistentImage(c *check.C) {
|
|
dockerCmd(c, "history", "busybox")
|
|
}
|
|
|
|
func (s *DockerSuite) TestHistoryNonExistentImage(c *check.C) {
|
|
_, _, err := dockerCmdWithError("history", "testHistoryNonExistentImage")
|
|
c.Assert(err, checker.NotNil, check.Commentf("history on a non-existent image should fail."))
|
|
}
|
|
|
|
func (s *DockerSuite) TestHistoryImageWithComment(c *check.C) {
|
|
name := "testhistoryimagewithcomment"
|
|
|
|
// make a image through docker commit <container id> [ -m messages ]
|
|
|
|
dockerCmd(c, "run", "--name", name, "busybox", "true")
|
|
dockerCmd(c, "wait", name)
|
|
|
|
comment := "This_is_a_comment"
|
|
dockerCmd(c, "commit", "-m="+comment, name, name)
|
|
|
|
// test docker history <image id> to check comment messages
|
|
|
|
out, _ := dockerCmd(c, "history", name)
|
|
outputTabs := strings.Fields(strings.Split(out, "\n")[1])
|
|
actualValue := outputTabs[len(outputTabs)-1]
|
|
c.Assert(actualValue, checker.Contains, comment)
|
|
}
|
|
|
|
func (s *DockerSuite) TestHistoryHumanOptionFalse(c *check.C) {
|
|
out, _ := dockerCmd(c, "history", "--human=false", "busybox")
|
|
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]
|
|
|
|
_, err := strconv.Atoi(strings.TrimSpace(sizeString))
|
|
c.Assert(err, checker.IsNil, check.Commentf("The size '%s' was not an Integer", sizeString))
|
|
}
|
|
}
|
|
|
|
func (s *DockerSuite) TestHistoryHumanOptionTrue(c *check.C) {
|
|
out, _ := dockerCmd(c, "history", "--human=true", "busybox")
|
|
lines := strings.Split(out, "\n")
|
|
sizeColumnRegex, _ := regexp.Compile("SIZE +")
|
|
humanSizeRegexRaw := "\\d+.*B" // Matches human sizes like 10 MB, 3.2 KB, etc
|
|
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]
|
|
c.Assert(strings.TrimSpace(sizeString), checker.Matches, humanSizeRegexRaw, check.Commentf("The size '%s' was not in human format", sizeString))
|
|
}
|
|
}
|