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> Upstream-commit: d609de989f98760e9fca94438184b815fb905681 Component: engine
126 lines
3.8 KiB
Go
126 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))
|
|
}
|
|
}
|