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