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