...

Source file src/github.com/sigstore/cosign/v2/pkg/oci/remote/index_test.go

Documentation: github.com/sigstore/cosign/v2/pkg/oci/remote

     1  //
     2  // Copyright 2021 The Sigstore Authors.
     3  //
     4  // Licensed under the Apache License, Version 2.0 (the "License");
     5  // you may not use this file except in compliance with the License.
     6  // You may obtain a copy of the License at
     7  //
     8  //     http://www.apache.org/licenses/LICENSE-2.0
     9  //
    10  // Unless required by applicable law or agreed to in writing, software
    11  // distributed under the License is distributed on an "AS IS" BASIS,
    12  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  // See the License for the specific language governing permissions and
    14  // limitations under the License.
    15  
    16  package remote
    17  
    18  import (
    19  	"testing"
    20  
    21  	"github.com/google/go-containerregistry/pkg/name"
    22  	v1 "github.com/google/go-containerregistry/pkg/v1"
    23  	"github.com/google/go-containerregistry/pkg/v1/empty"
    24  	"github.com/google/go-containerregistry/pkg/v1/mutate"
    25  	"github.com/google/go-containerregistry/pkg/v1/random"
    26  	"github.com/google/go-containerregistry/pkg/v1/remote"
    27  	"github.com/google/go-containerregistry/pkg/v1/types"
    28  	"github.com/sigstore/cosign/v2/pkg/oci"
    29  )
    30  
    31  func TestSignedImageIndex(t *testing.T) {
    32  	ri := remote.Image
    33  	rix := remote.Index
    34  	t.Cleanup(func() {
    35  		remoteImage = ri
    36  		remoteIndex = rix
    37  	})
    38  	wantLayers := int64(7)
    39  	wantImages := int64(1)
    40  
    41  	l1, err := random.Image(300 /* byteSize */, wantLayers)
    42  	if err != nil {
    43  		t.Fatalf("random.Index() = %v", err)
    44  	}
    45  	l2, err := random.Index(300 /* byteSize */, wantLayers, wantImages)
    46  	if err != nil {
    47  		t.Fatalf("random.Index() = %v", err)
    48  	}
    49  	l3 := mutate.AppendManifests(
    50  		empty.Index,
    51  		mutate.IndexAddendum{
    52  			Add: l2,
    53  		},
    54  		mutate.IndexAddendum{
    55  			Add: l1,
    56  		},
    57  	)
    58  
    59  	remoteImage = func(_ name.Reference, _ ...remote.Option) (v1.Image, error) {
    60  		// Only called for signature images
    61  		return random.Image(300 /* byteSize */, wantLayers)
    62  	}
    63  	remoteIndex = func(_ name.Reference, _ ...remote.Option) (ii v1.ImageIndex, err error) {
    64  		return l3, nil
    65  	}
    66  
    67  	ref, err := name.ParseReference("gcr.io/distroless/static:nonroot")
    68  	if err != nil {
    69  		t.Fatalf("ParseRef() = %v", err)
    70  	}
    71  
    72  	sii, err := SignedImageIndex(ref)
    73  	if err != nil {
    74  		t.Fatalf("Signatures() = %v", err)
    75  	}
    76  
    77  	sigs, err := sii.Signatures()
    78  	if err != nil {
    79  		t.Fatalf("Signatures() = %v", err)
    80  	}
    81  
    82  	if sl, err := sigs.Get(); err != nil {
    83  		t.Errorf("Get() = %v", err)
    84  	} else if got := int64(len(sl)); got != wantLayers {
    85  		t.Errorf("len(Get()) = %d, wanted %d", got, wantLayers)
    86  	}
    87  
    88  	imf, err := sii.IndexManifest()
    89  	if err != nil {
    90  		t.Fatalf("IndexManifest() = %v", err)
    91  	}
    92  
    93  	for _, desc := range imf.Manifests {
    94  		var se oci.SignedEntity
    95  		switch desc.MediaType {
    96  		case types.OCIImageIndex, types.DockerManifestList:
    97  			se, err = sii.SignedImageIndex(desc.Digest)
    98  			if err != nil {
    99  				t.Fatalf("SignedImage() = %v", err)
   100  			}
   101  
   102  		case types.OCIManifestSchema1, types.DockerManifestSchema2:
   103  			se, err = sii.SignedImage(desc.Digest)
   104  			if err != nil {
   105  				t.Fatalf("SignedImage() = %v", err)
   106  			}
   107  		default:
   108  			t.Fatalf("unknown mime type: %v", desc.MediaType)
   109  		}
   110  
   111  		sigs, err := se.Signatures()
   112  		if err != nil {
   113  			t.Fatalf("Signatures() = %v", err)
   114  		}
   115  
   116  		if sl, err := sigs.Get(); err != nil {
   117  			t.Errorf("Get() = %v", err)
   118  		} else if got := int64(len(sl)); got != wantLayers {
   119  			t.Errorf("len(Get()) = %d, wanted %d", got, wantLayers)
   120  		}
   121  
   122  		atts, err := se.Attestations()
   123  		if err != nil {
   124  			t.Fatalf("Signatures() = %v", err)
   125  		}
   126  
   127  		if al, err := atts.Get(); err != nil {
   128  			t.Errorf("Get() = %v", err)
   129  		} else if got := int64(len(al)); got != wantLayers {
   130  			t.Errorf("len(Get()) = %d, wanted %d", got, wantLayers)
   131  		}
   132  	}
   133  }
   134  

View as plain text