github.com/docker/cnab-to-oci@v0.3.0-beta4/converter/convert_test.go (about)

     1  package converter
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/docker/cnab-to-oci/tests"
     7  	"github.com/docker/distribution/manifest/schema2"
     8  	"github.com/docker/distribution/reference"
     9  	ocischemav1 "github.com/opencontainers/image-spec/specs-go/v1"
    10  	"gotest.tools/assert"
    11  )
    12  
    13  func TestConvertFromFixedUpBundleToOCI(t *testing.T) {
    14  	bundleConfigDescriptor := ocischemav1.Descriptor{
    15  		Digest:    "sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341",
    16  		MediaType: schema2.MediaTypeManifest,
    17  		Size:      315,
    18  	}
    19  	targetRef := "my.registry/namespace/my-app:0.1.0"
    20  	src := tests.MakeTestBundle()
    21  
    22  	relocationMap := tests.MakeRelocationMap()
    23  
    24  	expected := tests.MakeTestOCIIndex()
    25  
    26  	// Convert from bundle to OCI index
    27  	named, err := reference.ParseNormalizedNamed(targetRef)
    28  	assert.NilError(t, err)
    29  	actual, err := ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap)
    30  	assert.NilError(t, err)
    31  	assert.DeepEqual(t, expected, actual)
    32  
    33  	// Nil maintainers does not add annotation
    34  	src = tests.MakeTestBundle()
    35  	src.Maintainers = nil
    36  	actual, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap)
    37  	assert.NilError(t, err)
    38  	_, hasMaintainers := actual.Annotations[ocischemav1.AnnotationAuthors]
    39  	assert.Assert(t, !hasMaintainers)
    40  
    41  	// Nil keywords does not add annotation
    42  	src = tests.MakeTestBundle()
    43  	src.Keywords = nil
    44  	actual, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap)
    45  	assert.NilError(t, err)
    46  	_, hasKeywords := actual.Annotations[CNABKeywordsAnnotation]
    47  	assert.Assert(t, !hasKeywords)
    48  
    49  	// Multiple invocation images is not supported
    50  	src = tests.MakeTestBundle()
    51  	src.InvocationImages = append(src.InvocationImages, src.InvocationImages[0])
    52  	_, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap)
    53  	assert.ErrorContains(t, err, "only one invocation image supported")
    54  
    55  	// Invalid media type
    56  	src = tests.MakeTestBundle()
    57  	src.InvocationImages[0].MediaType = "some-invalid-mediatype"
    58  	_, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap)
    59  	assert.ErrorContains(t, err, `unsupported media type "some-invalid-mediatype" for image "my.registry/namespace/my-app@sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0343"`)
    60  
    61  	// All images must be in the same repository
    62  	src = tests.MakeTestBundle()
    63  	badRelocationMap := tests.MakeRelocationMap()
    64  	badRelocationMap["my.registry/namespace/my-app-invoc"] = "my.registry/namespace/other-repo@sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0343"
    65  	_, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, badRelocationMap)
    66  	assert.ErrorContains(t, err, `invalid invocation image: image `+
    67  		`"my.registry/namespace/other-repo@sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0343" is not in the same repository as "my.registry/namespace/my-app:0.1.0"`)
    68  
    69  	// Image reference must be digested
    70  	src = tests.MakeTestBundle()
    71  	badRelocationMap = tests.MakeRelocationMap()
    72  	badRelocationMap["my.registry/namespace/my-app-invoc"] = "my.registry/namespace/my-app:not-digested"
    73  	_, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, badRelocationMap)
    74  	assert.ErrorContains(t, err, "invalid invocation image: image \"my.registry/namespace/"+
    75  		"my-app:not-digested\" is not a digested reference")
    76  
    77  	// Invalid reference
    78  	src = tests.MakeTestBundle()
    79  	badRelocationMap = tests.MakeRelocationMap()
    80  	badRelocationMap["my.registry/namespace/my-app-invoc"] = "Some/iNvalid/Ref"
    81  	_, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, badRelocationMap)
    82  	assert.ErrorContains(t, err, "invalid invocation image: "+
    83  		"image \"Some/iNvalid/Ref\" is not a valid image reference: invalid reference format: repository name must be lowercase")
    84  
    85  	// Invalid size
    86  	src = tests.MakeTestBundle()
    87  	src.InvocationImages[0].Size = 0
    88  	_, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap)
    89  	assert.ErrorContains(t, err, "size is not set")
    90  
    91  	// mediatype ociindex
    92  	src = tests.MakeTestBundle()
    93  	src.InvocationImages[0].MediaType = ocischemav1.MediaTypeImageIndex
    94  	_, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap)
    95  	assert.NilError(t, err)
    96  
    97  	// mediatype docker manifestlist
    98  	src = tests.MakeTestBundle()
    99  	src.InvocationImages[0].MediaType = "application/vnd.docker.distribution.manifest.list.v2+json"
   100  	_, err = ConvertBundleToOCIIndex(src, named, bundleConfigDescriptor, relocationMap)
   101  	assert.NilError(t, err)
   102  }
   103  
   104  func TestGetConfigDescriptor(t *testing.T) {
   105  	ix := &ocischemav1.Index{
   106  		Manifests: []ocischemav1.Descriptor{
   107  			{
   108  				Digest:    "sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341",
   109  				MediaType: schema2.MediaTypeManifest,
   110  				Size:      315,
   111  				Annotations: map[string]string{
   112  					CNABDescriptorTypeAnnotation: CNABDescriptorTypeConfig,
   113  				},
   114  			},
   115  			{
   116  				Digest:    "sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341",
   117  				MediaType: "application/vnd.docker.distribution.manifest.v2+json",
   118  				Size:      315,
   119  				Annotations: map[string]string{
   120  					"io.cnab.type": "invocation",
   121  				},
   122  			},
   123  			{
   124  				Digest:    "sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341",
   125  				MediaType: "application/vnd.oci.image.manifest.v1+json",
   126  				Size:      1385,
   127  				Annotations: map[string]string{
   128  					"io.cnab.type":           "component",
   129  					"io.cnab.component_name": "image-1",
   130  					"io.cnab.original_name":  "nginx:2.12",
   131  				},
   132  			},
   133  		},
   134  	}
   135  	expected := ocischemav1.Descriptor{
   136  		Digest:    "sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341",
   137  		MediaType: schema2.MediaTypeManifest,
   138  		Size:      315,
   139  		Annotations: map[string]string{
   140  			CNABDescriptorTypeAnnotation: CNABDescriptorTypeConfig,
   141  		},
   142  	}
   143  	d, err := GetBundleConfigManifestDescriptor(ix)
   144  	assert.NilError(t, err)
   145  	assert.DeepEqual(t, expected, d)
   146  	ix.Manifests = ix.Manifests[1:]
   147  	_, err = GetBundleConfigManifestDescriptor(ix)
   148  	assert.ErrorContains(t, err, "bundle config not found")
   149  }
   150  
   151  func TestGenerateRelocationMap(t *testing.T) {
   152  	targetRef := "my.registry/namespace/my-app:0.1.0"
   153  	named, err := reference.ParseNormalizedNamed(targetRef)
   154  	assert.NilError(t, err)
   155  
   156  	ix := tests.MakeTestOCIIndex()
   157  	b := tests.MakeTestBundle()
   158  
   159  	expected := tests.MakeRelocationMap()
   160  
   161  	relocationMap, err := GenerateRelocationMap(ix, b, named)
   162  	assert.NilError(t, err)
   163  	assert.DeepEqual(t, relocationMap, expected)
   164  }