github.com/containers/podman/v5@v5.1.0-rc1/test/e2e/diff_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "sort" 6 7 . "github.com/containers/podman/v5/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 })