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  })