github.com/containers/podman/v4@v4.9.4/test/e2e/diff_test.go (about)

     1  package integration
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  
     7  	. "github.com/containers/podman/v4/test/utils"
     8  	"github.com/containers/storage/pkg/stringid"
     9  	. "github.com/onsi/ginkgo/v2"
    10  	. "github.com/onsi/gomega"
    11  	. "github.com/onsi/gomega/gexec"
    12  )
    13  
    14  var _ = Describe("Podman diff", func() {
    15  
    16  	It("podman diff of image", func() {
    17  		session := podmanTest.Podman([]string{"diff", ALPINE})
    18  		session.WaitWithDefaultTimeout()
    19  		Expect(session).Should(ExitCleanly())
    20  		Expect(session.OutputToStringArray()).ToNot(BeEmpty())
    21  	})
    22  
    23  	It("podman diff bogus image", func() {
    24  		session := podmanTest.Podman([]string{"diff", "1234"})
    25  		session.WaitWithDefaultTimeout()
    26  		Expect(session).Should(Exit(125))
    27  	})
    28  
    29  	It("podman diff image with json output", func() {
    30  		session := podmanTest.Podman([]string{"diff", "--format=json", ALPINE})
    31  		session.WaitWithDefaultTimeout()
    32  		Expect(session).Should(ExitCleanly())
    33  		Expect(session.OutputToString()).To(BeValidJSON())
    34  	})
    35  
    36  	It("podman diff container and committed image", func() {
    37  		session := podmanTest.Podman([]string{"run", "--name=diff-test", ALPINE, "touch", "/tmp/diff-test"})
    38  		session.WaitWithDefaultTimeout()
    39  		Expect(session).Should(ExitCleanly())
    40  		session = podmanTest.Podman([]string{"diff", "diff-test"})
    41  		session.WaitWithDefaultTimeout()
    42  		containerDiff := session.OutputToStringArray()
    43  		sort.Strings(containerDiff)
    44  		Expect(session.OutputToString()).To(ContainSubstring("C /tmp"))
    45  		Expect(session.OutputToString()).To(ContainSubstring("A /tmp/diff-test"))
    46  		session = podmanTest.Podman([]string{"commit", "-q", "diff-test", "diff-test-img"})
    47  		session.WaitWithDefaultTimeout()
    48  		Expect(session).Should(ExitCleanly())
    49  		session = podmanTest.Podman([]string{"diff", "diff-test-img"})
    50  		session.WaitWithDefaultTimeout()
    51  		imageDiff := session.OutputToStringArray()
    52  		sort.Strings(imageDiff)
    53  		Expect(imageDiff).To(Equal(containerDiff))
    54  	})
    55  
    56  	It("podman diff latest container", func() {
    57  		session := podmanTest.Podman([]string{"run", "--name", "diff-test", ALPINE, "touch", "/tmp/diff-test"})
    58  		session.WaitWithDefaultTimeout()
    59  		Expect(session).Should(ExitCleanly())
    60  		if !IsRemote() {
    61  			session = podmanTest.Podman([]string{"diff", "-l"})
    62  		} else {
    63  			session = podmanTest.Podman([]string{"diff", "diff-test"})
    64  		}
    65  		session.WaitWithDefaultTimeout()
    66  		containerDiff := session.OutputToStringArray()
    67  		sort.Strings(containerDiff)
    68  		Expect(session.OutputToString()).To(ContainSubstring("C /tmp"))
    69  		Expect(session.OutputToString()).To(ContainSubstring("A /tmp/diff-test"))
    70  		Expect(session).Should(ExitCleanly())
    71  	})
    72  
    73  	It("podman image diff", func() {
    74  		file1 := "/" + stringid.GenerateRandomID()
    75  		file2 := "/" + stringid.GenerateRandomID()
    76  		file3 := "/" + stringid.GenerateRandomID()
    77  
    78  		// Create container image with the files
    79  		containerfile := fmt.Sprintf(`
    80  FROM  %s
    81  RUN touch %s
    82  RUN touch %s
    83  RUN touch %s`, ALPINE, file1, file2, file3)
    84  
    85  		image := "podman-diff-test"
    86  		podmanTest.BuildImage(containerfile, image, "true")
    87  
    88  		// build a second image which used as base to compare against
    89  		// using ALPINE does not work in CI, most likely due the extra vfs.imagestore
    90  		containerfile = fmt.Sprintf(`
    91  FROM  %s
    92  RUN echo test
    93  `, ALPINE)
    94  		baseImage := "base-image"
    95  		podmanTest.BuildImage(containerfile, baseImage, "true")
    96  
    97  		session := podmanTest.Podman([]string{"image", "diff", image})
    98  		session.WaitWithDefaultTimeout()
    99  		Expect(session).Should(ExitCleanly())
   100  		Expect(session.OutputToStringArray()).To(HaveLen(1))
   101  		Expect(session.OutputToString()).To(Equal("A " + file3))
   102  
   103  		session = podmanTest.Podman([]string{"image", "diff", image, baseImage})
   104  		session.WaitWithDefaultTimeout()
   105  		Expect(session).Should(ExitCleanly())
   106  		Expect(session.OutputToStringArray()).To(HaveLen(4))
   107  		Expect(session.OutputToString()).To(ContainSubstring("A " + file1))
   108  		Expect(session.OutputToString()).To(ContainSubstring("A " + file2))
   109  		Expect(session.OutputToString()).To(ContainSubstring("A " + file3))
   110  	})
   111  
   112  	It("podman image diff of single image", func() {
   113  		session := podmanTest.Podman([]string{"image", "diff", BB})
   114  		session.WaitWithDefaultTimeout()
   115  		Expect(session).Should(ExitCleanly())
   116  		Expect(session.OutputToStringArray()).ToNot(BeEmpty())
   117  	})
   118  
   119  	It("podman image diff bogus image", func() {
   120  		session := podmanTest.Podman([]string{"image", "diff", "1234", ALPINE})
   121  		session.WaitWithDefaultTimeout()
   122  		Expect(session).Should(Exit(125))
   123  	})
   124  
   125  	It("podman image diff of the same image", func() {
   126  		session := podmanTest.Podman([]string{"image", "diff", ALPINE, ALPINE})
   127  		session.WaitWithDefaultTimeout()
   128  		Expect(session).Should(ExitCleanly())
   129  		Expect(session.OutputToStringArray()).To(BeEmpty())
   130  	})
   131  
   132  	It("podman diff container and image with same name", func() {
   133  		imagefile := "/" + stringid.GenerateRandomID()
   134  		confile := "/" + stringid.GenerateRandomID()
   135  
   136  		// Create container image with the files
   137  		containerfile := fmt.Sprintf(`
   138  FROM  %s
   139  RUN touch %s`, ALPINE, imagefile)
   140  
   141  		name := "podman-diff-test"
   142  		podmanTest.BuildImage(containerfile, name, "false")
   143  
   144  		session := podmanTest.Podman([]string{"run", "--name", name, ALPINE, "touch", confile})
   145  		session.WaitWithDefaultTimeout()
   146  		Expect(session).Should(ExitCleanly())
   147  
   148  		// podman diff prefers image over container when they have the same name
   149  		session = podmanTest.Podman([]string{"diff", name})
   150  		session.WaitWithDefaultTimeout()
   151  		Expect(session).Should(ExitCleanly())
   152  		Expect(session.OutputToStringArray()).To(HaveLen(2))
   153  		Expect(session.OutputToString()).To(ContainSubstring(imagefile))
   154  
   155  		session = podmanTest.Podman([]string{"image", "diff", name})
   156  		session.WaitWithDefaultTimeout()
   157  		Expect(session).Should(ExitCleanly())
   158  		Expect(session.OutputToStringArray()).To(HaveLen(2))
   159  		Expect(session.OutputToString()).To(ContainSubstring(imagefile))
   160  
   161  		// container diff has to show the container
   162  		session = podmanTest.Podman([]string{"container", "diff", name})
   163  		session.WaitWithDefaultTimeout()
   164  		Expect(session).Should(ExitCleanly())
   165  		Expect(session.OutputToStringArray()).To(HaveLen(2))
   166  		Expect(session.OutputToString()).To(ContainSubstring(confile))
   167  	})
   168  
   169  })