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