mirror of
				https://github.com/distribution/distribution.git
				synced 2025-10-31 01:12:48 +00:00 
			
		
		
		
	This will be used to support downloading Windows base layers from Microsoft URLs. Signed-off-by: John Starks <jostarks@microsoft.com>
		
			
				
	
	
		
			118 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package storage
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/docker/distribution"
 | |
| 	"github.com/docker/distribution/context"
 | |
| 	"github.com/docker/distribution/manifest"
 | |
| 	"github.com/docker/distribution/manifest/schema2"
 | |
| 	"github.com/docker/distribution/registry/storage/driver/inmemory"
 | |
| )
 | |
| 
 | |
| func TestVerifyManifestForeignLayer(t *testing.T) {
 | |
| 	ctx := context.Background()
 | |
| 	inmemoryDriver := inmemory.New()
 | |
| 	registry := createRegistry(t, inmemoryDriver)
 | |
| 	repo := makeRepository(t, registry, "test")
 | |
| 	manifestService := makeManifestService(t, repo)
 | |
| 
 | |
| 	config, err := repo.Blobs(ctx).Put(ctx, schema2.MediaTypeConfig, nil)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	layer, err := repo.Blobs(ctx).Put(ctx, schema2.MediaTypeLayer, nil)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	foreignLayer := distribution.Descriptor{
 | |
| 		Digest:    "sha256:463435349086340864309863409683460843608348608934092322395278926a",
 | |
| 		Size:      6323,
 | |
| 		MediaType: schema2.MediaTypeForeignLayer,
 | |
| 	}
 | |
| 
 | |
| 	template := schema2.Manifest{
 | |
| 		Versioned: manifest.Versioned{
 | |
| 			SchemaVersion: 2,
 | |
| 			MediaType:     schema2.MediaTypeManifest,
 | |
| 		},
 | |
| 		Config: config,
 | |
| 	}
 | |
| 
 | |
| 	type testcase struct {
 | |
| 		BaseLayer distribution.Descriptor
 | |
| 		URLs      []string
 | |
| 		Err       error
 | |
| 	}
 | |
| 
 | |
| 	cases := []testcase{
 | |
| 		{
 | |
| 			foreignLayer,
 | |
| 			nil,
 | |
| 			errMissingURL,
 | |
| 		},
 | |
| 		{
 | |
| 			layer,
 | |
| 			[]string{"http://foo/bar"},
 | |
| 			errUnexpectedURL,
 | |
| 		},
 | |
| 		{
 | |
| 			foreignLayer,
 | |
| 			[]string{"file:///local/file"},
 | |
| 			errInvalidURL,
 | |
| 		},
 | |
| 		{
 | |
| 			foreignLayer,
 | |
| 			[]string{"http://foo/bar#baz"},
 | |
| 			errInvalidURL,
 | |
| 		},
 | |
| 		{
 | |
| 			foreignLayer,
 | |
| 			[]string{""},
 | |
| 			errInvalidURL,
 | |
| 		},
 | |
| 		{
 | |
| 			foreignLayer,
 | |
| 			[]string{"https://foo/bar", ""},
 | |
| 			errInvalidURL,
 | |
| 		},
 | |
| 		{
 | |
| 			foreignLayer,
 | |
| 			[]string{"http://foo/bar"},
 | |
| 			nil,
 | |
| 		},
 | |
| 		{
 | |
| 			foreignLayer,
 | |
| 			[]string{"https://foo/bar"},
 | |
| 			nil,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for _, c := range cases {
 | |
| 		m := template
 | |
| 		l := c.BaseLayer
 | |
| 		l.URLs = c.URLs
 | |
| 		m.Layers = []distribution.Descriptor{l}
 | |
| 		dm, err := schema2.FromStruct(m)
 | |
| 		if err != nil {
 | |
| 			t.Error(err)
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		_, err = manifestService.Put(ctx, dm)
 | |
| 		if verr, ok := err.(distribution.ErrManifestVerification); ok {
 | |
| 			// Extract the first error
 | |
| 			if len(verr) == 2 {
 | |
| 				if _, ok = verr[1].(distribution.ErrManifestBlobUnknown); ok {
 | |
| 					err = verr[0]
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		if err != c.Err {
 | |
| 			t.Errorf("%#v: expected %v, got %v", l, c.Err, err)
 | |
| 		}
 | |
| 	}
 | |
| }
 |