summaryrefslogtreecommitdiff
path: root/registry-scanner/pkg/image/image_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'registry-scanner/pkg/image/image_test.go')
-rw-r--r--registry-scanner/pkg/image/image_test.go226
1 files changed, 226 insertions, 0 deletions
diff --git a/registry-scanner/pkg/image/image_test.go b/registry-scanner/pkg/image/image_test.go
new file mode 100644
index 0000000..1709461
--- /dev/null
+++ b/registry-scanner/pkg/image/image_test.go
@@ -0,0 +1,226 @@
+package image
+
+import (
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+ "golang.org/x/exp/slices"
+
+ "github.com/argoproj-labs/argocd-image-updater/registry-scanner/pkg/tag"
+)
+
+func Test_ParseImageTags(t *testing.T) {
+ t.Run("Parse valid image name without registry info", func(t *testing.T) {
+ image := NewFromIdentifier("jannfis/test-image:0.1")
+ assert.Empty(t, image.RegistryURL)
+ assert.Empty(t, image.ImageAlias)
+ assert.Equal(t, "jannfis/test-image", image.ImageName)
+ require.NotNil(t, image.ImageTag)
+ assert.Equal(t, "0.1", image.ImageTag.TagName)
+ assert.Equal(t, "jannfis/test-image:0.1", image.GetFullNameWithTag())
+ assert.Equal(t, "jannfis/test-image", image.GetFullNameWithoutTag())
+ })
+
+ t.Run("Single element image name is unmodified", func(t *testing.T) {
+ image := NewFromIdentifier("test-image")
+ assert.Empty(t, image.RegistryURL)
+ assert.Empty(t, image.ImageAlias)
+ assert.Equal(t, "test-image", image.ImageName)
+ require.Nil(t, image.ImageTag)
+ assert.Equal(t, "test-image", image.GetFullNameWithTag())
+ assert.Equal(t, "test-image", image.GetFullNameWithoutTag())
+ })
+
+ t.Run("library image name is unmodified", func(t *testing.T) {
+ image := NewFromIdentifier("library/test-image")
+ assert.Empty(t, image.RegistryURL)
+ assert.Empty(t, image.ImageAlias)
+ assert.Equal(t, "library/test-image", image.ImageName)
+ require.Nil(t, image.ImageTag)
+ assert.Equal(t, "library/test-image", image.GetFullNameWithTag())
+ assert.Equal(t, "library/test-image", image.GetFullNameWithoutTag())
+ })
+
+ t.Run("Parse valid image name with registry info", func(t *testing.T) {
+ image := NewFromIdentifier("gcr.io/jannfis/test-image:0.1")
+ assert.Equal(t, "gcr.io", image.RegistryURL)
+ assert.Empty(t, image.ImageAlias)
+ assert.Equal(t, "jannfis/test-image", image.ImageName)
+ require.NotNil(t, image.ImageTag)
+ assert.Equal(t, "0.1", image.ImageTag.TagName)
+ assert.Equal(t, "gcr.io/jannfis/test-image:0.1", image.GetFullNameWithTag())
+ assert.Equal(t, "gcr.io/jannfis/test-image", image.GetFullNameWithoutTag())
+ })
+
+ t.Run("Parse valid image name with default registry info", func(t *testing.T) {
+ image := NewFromIdentifier("docker.io/jannfis/test-image:0.1")
+ assert.Equal(t, "docker.io", image.RegistryURL)
+ assert.Empty(t, image.ImageAlias)
+ assert.Equal(t, "jannfis/test-image", image.ImageName)
+ require.NotNil(t, image.ImageTag)
+ assert.Equal(t, "0.1", image.ImageTag.TagName)
+ assert.Equal(t, "docker.io/jannfis/test-image:0.1", image.GetFullNameWithTag())
+ assert.Equal(t, "docker.io/jannfis/test-image", image.GetFullNameWithoutTag())
+ })
+
+ t.Run("Parse valid image name with digest tag", func(t *testing.T) {
+ image := NewFromIdentifier("gcr.io/jannfis/test-image@sha256:abcde")
+ assert.Equal(t, "gcr.io", image.RegistryURL)
+ assert.Empty(t, image.ImageAlias)
+ assert.Equal(t, "jannfis/test-image", image.ImageName)
+ require.NotNil(t, image.ImageTag)
+ assert.Empty(t, image.ImageTag.TagName)
+ assert.Equal(t, "sha256:abcde", image.ImageTag.TagDigest)
+ assert.Equal(t, "latest@sha256:abcde", image.GetTagWithDigest())
+ assert.Equal(t, "gcr.io/jannfis/test-image@sha256:abcde", image.GetFullNameWithTag())
+ assert.Equal(t, "gcr.io/jannfis/test-image", image.GetFullNameWithoutTag())
+ })
+
+ t.Run("Parse valid image name with tag and digest", func(t *testing.T) {
+ image := NewFromIdentifier("gcr.io/jannfis/test-image:test-tag@sha256:abcde")
+ require.NotNil(t, image.ImageTag)
+ assert.Equal(t, "test-tag", image.ImageTag.TagName)
+ assert.Equal(t, "sha256:abcde", image.ImageTag.TagDigest)
+ assert.Equal(t, "test-tag@sha256:abcde", image.GetTagWithDigest())
+ assert.Equal(t, "gcr.io/jannfis/test-image", image.GetFullNameWithoutTag())
+ assert.Equal(t, "gcr.io/jannfis/test-image:test-tag@sha256:abcde", image.GetFullNameWithTag())
+ })
+
+ t.Run("Parse valid image name with source name and registry info", func(t *testing.T) {
+ image := NewFromIdentifier("jannfis/orig-image=gcr.io/jannfis/test-image:0.1")
+ assert.Equal(t, "gcr.io", image.RegistryURL)
+ assert.Equal(t, "jannfis/orig-image", image.ImageAlias)
+ assert.Equal(t, "jannfis/test-image", image.ImageName)
+ require.NotNil(t, image.ImageTag)
+ assert.Equal(t, "0.1", image.ImageTag.TagName)
+ })
+
+ t.Run("Parse valid image name with source name and registry info with port", func(t *testing.T) {
+ image := NewFromIdentifier("ghcr.io:4567/jannfis/orig-image=gcr.io:1234/jannfis/test-image:0.1")
+ assert.Equal(t, "gcr.io:1234", image.RegistryURL)
+ assert.Equal(t, "ghcr.io:4567/jannfis/orig-image", image.ImageAlias)
+ assert.Equal(t, "jannfis/test-image", image.ImageName)
+ require.NotNil(t, image.ImageTag)
+ assert.Equal(t, "0.1", image.ImageTag.TagName)
+ })
+
+ t.Run("Parse image without version source name and registry info", func(t *testing.T) {
+ image := NewFromIdentifier("jannfis/orig-image=gcr.io/jannfis/test-image")
+ assert.Equal(t, "gcr.io", image.RegistryURL)
+ assert.Equal(t, "jannfis/orig-image", image.ImageAlias)
+ assert.Equal(t, "jannfis/test-image", image.ImageName)
+ assert.Nil(t, image.ImageTag)
+ })
+ t.Run("#273 classic-web=registry:5000/classic-web", func(t *testing.T) {
+ image := NewFromIdentifier("classic-web=registry:5000/classic-web")
+ assert.Equal(t, "registry:5000", image.RegistryURL)
+ assert.Equal(t, "classic-web", image.ImageAlias)
+ assert.Equal(t, "classic-web", image.ImageName)
+ assert.Nil(t, image.ImageTag)
+ })
+}
+
+func Test_ImageToString(t *testing.T) {
+ t.Run("Get string representation of full-qualified image name", func(t *testing.T) {
+ imageName := "jannfis/argocd=jannfis/orig-image:0.1"
+ img := NewFromIdentifier(imageName)
+ assert.Equal(t, imageName, img.String())
+ })
+ t.Run("Get string representation of full-qualified image name with registry", func(t *testing.T) {
+ imageName := "jannfis/argocd=gcr.io/jannfis/orig-image:0.1"
+ img := NewFromIdentifier(imageName)
+ assert.Equal(t, imageName, img.String())
+ })
+ t.Run("Get string representation of full-qualified image name with registry", func(t *testing.T) {
+ imageName := "jannfis/argocd=gcr.io/jannfis/orig-image"
+ img := NewFromIdentifier(imageName)
+ assert.Equal(t, imageName, img.String())
+ })
+ t.Run("Get original value", func(t *testing.T) {
+ imageName := "invalid==foo"
+ img := NewFromIdentifier(imageName)
+ assert.Equal(t, imageName, img.Original())
+ })
+}
+
+func Test_WithTag(t *testing.T) {
+ t.Run("Get string representation of full-qualified image name", func(t *testing.T) {
+ imageName := "jannfis/argocd=jannfis/orig-image:0.1"
+ nimageName := "jannfis/argocd=jannfis/orig-image:0.2"
+ oImg := NewFromIdentifier(imageName)
+ nImg := oImg.WithTag(tag.NewImageTag("0.2", time.Unix(0, 0), ""))
+ assert.Equal(t, nimageName, nImg.String())
+ })
+}
+
+func Test_ContainerList(t *testing.T) {
+ t.Run("Test whether image is contained in list", func(t *testing.T) {
+ images := make(ContainerImageList, 0)
+ image_names := []string{"a/a:0.1", "a/b:1.2", "x/y=foo.bar/a/c:0.23"}
+ for _, n := range image_names {
+ images = append(images, NewFromIdentifier(n))
+ }
+ withKustomizeOverride := NewFromIdentifier("k1/k2:k3")
+ withKustomizeOverride.KustomizeImage = images[0]
+ images = append(images, withKustomizeOverride)
+
+ assert.NotNil(t, images.ContainsImage(NewFromIdentifier(image_names[0]), false))
+ assert.NotNil(t, images.ContainsImage(NewFromIdentifier(image_names[1]), false))
+ assert.NotNil(t, images.ContainsImage(NewFromIdentifier(image_names[2]), false))
+ assert.Nil(t, images.ContainsImage(NewFromIdentifier("foo/bar"), false))
+
+ imageMatch := images.ContainsImage(withKustomizeOverride, false)
+ assert.Equal(t, images[0], imageMatch)
+ })
+}
+
+func Test_getImageDigestFromTag(t *testing.T) {
+ tagAndDigest := "test-tag@sha256:abcde"
+ tagName, tagDigest := getImageDigestFromTag(tagAndDigest)
+ assert.Equal(t, "test-tag", tagName)
+ assert.Equal(t, "sha256:abcde", tagDigest)
+
+ tagAndDigest = "test-tag"
+ tagName, tagDigest = getImageDigestFromTag(tagAndDigest)
+ assert.Equal(t, "test-tag", tagName)
+ assert.Empty(t, tagDigest)
+}
+
+func Test_ContainerImageList_String_Originals(t *testing.T) {
+ images := make(ContainerImageList, 0)
+ originals := []string{}
+
+ assert.Equal(t, "", images.String())
+ assert.True(t, slices.Equal(originals, images.Originals()))
+
+ images = append(images, NewFromIdentifier("foo/bar:0.1"))
+ originals = append(originals, "foo/bar:0.1")
+ assert.Equal(t, "foo/bar:0.1", images.String())
+ assert.True(t, slices.Equal(originals, images.Originals()))
+
+ images = append(images, NewFromIdentifier("alias=foo/bar:0.2"))
+ originals = append(originals, "alias=foo/bar:0.2")
+ assert.Equal(t, "foo/bar:0.1,alias=foo/bar:0.2", images.String())
+ assert.True(t, slices.Equal(originals, images.Originals()))
+}
+
+func TestContainerImage_DiffersFrom(t *testing.T) {
+ foo1 := NewFromIdentifier("x/foo:1")
+ foo2 := NewFromIdentifier("x/foo:2")
+ bar1 := NewFromIdentifier("x/bar:1")
+ bar1WithRegistry := NewFromIdentifier("docker.io/x/bar:1")
+
+ assert.False(t, foo1.DiffersFrom(foo1, true))
+ assert.False(t, foo1.DiffersFrom(foo2, false))
+ assert.True(t, foo1.DiffersFrom(foo2, true))
+
+ assert.True(t, foo1.DiffersFrom(bar1, false))
+ assert.True(t, bar1.DiffersFrom(foo1, false))
+ assert.True(t, foo1.DiffersFrom(bar1, true))
+ assert.True(t, bar1.DiffersFrom(foo1, true))
+ assert.True(t, bar1.DiffersFrom(bar1WithRegistry, false))
+
+ assert.False(t, foo1.IsUpdatable("0.1", "^1.0"))
+}