github.com/mika/distribution@v2.2.2-0.20160108133430-a75790e3d8e0+incompatible/manifest/schema1/reference_builder_test.go (about)

     1  package schema1
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/docker/distribution/context"
     7  	"github.com/docker/distribution/digest"
     8  	"github.com/docker/distribution/manifest"
     9  	"github.com/docker/libtrust"
    10  )
    11  
    12  func makeSignedManifest(t *testing.T, pk libtrust.PrivateKey, refs []Reference) *SignedManifest {
    13  	u := &Manifest{
    14  		Versioned: manifest.Versioned{
    15  			SchemaVersion: 1,
    16  		},
    17  		Name:         "foo/bar",
    18  		Tag:          "latest",
    19  		Architecture: "amd64",
    20  	}
    21  
    22  	for i := len(refs) - 1; i >= 0; i-- {
    23  		u.FSLayers = append(u.FSLayers, FSLayer{
    24  			BlobSum: refs[i].Digest,
    25  		})
    26  		u.History = append(u.History, History{
    27  			V1Compatibility: refs[i].History.V1Compatibility,
    28  		})
    29  	}
    30  
    31  	signedManifest, err := Sign(u, pk)
    32  	if err != nil {
    33  		t.Fatalf("unexpected error signing manifest: %v", err)
    34  	}
    35  	return signedManifest
    36  }
    37  
    38  func TestReferenceBuilder(t *testing.T) {
    39  	pk, err := libtrust.GenerateECP256PrivateKey()
    40  	if err != nil {
    41  		t.Fatalf("unexpected error generating private key: %v", err)
    42  	}
    43  
    44  	r1 := Reference{
    45  		Digest:  "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    46  		Size:    1,
    47  		History: History{V1Compatibility: "{\"a\" : 1 }"},
    48  	}
    49  	r2 := Reference{
    50  		Digest:  "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
    51  		Size:    2,
    52  		History: History{V1Compatibility: "{\"\a\" : 2 }"},
    53  	}
    54  
    55  	handCrafted := makeSignedManifest(t, pk, []Reference{r1, r2})
    56  
    57  	b := NewReferenceManifestBuilder(pk, handCrafted.Manifest.Name, handCrafted.Manifest.Tag, handCrafted.Manifest.Architecture)
    58  	_, err = b.Build(context.Background())
    59  	if err == nil {
    60  		t.Fatal("Expected error building zero length manifest")
    61  	}
    62  
    63  	err = b.AppendReference(r1)
    64  	if err != nil {
    65  		t.Fatal(err)
    66  	}
    67  
    68  	err = b.AppendReference(r2)
    69  	if err != nil {
    70  		t.Fatal(err)
    71  	}
    72  
    73  	refs := b.References()
    74  	if len(refs) != 2 {
    75  		t.Fatalf("Unexpected reference count : %d != %d", 2, len(refs))
    76  	}
    77  
    78  	// Ensure ordering
    79  	if refs[0].Digest != r2.Digest {
    80  		t.Fatalf("Unexpected reference : %v", refs[0])
    81  	}
    82  
    83  	m, err := b.Build(context.Background())
    84  	if err != nil {
    85  		t.Fatal(err)
    86  	}
    87  
    88  	built, ok := m.(*SignedManifest)
    89  	if !ok {
    90  		t.Fatalf("unexpected type from Build() : %T", built)
    91  	}
    92  
    93  	d1 := digest.FromBytes(built.Canonical)
    94  	d2 := digest.FromBytes(handCrafted.Canonical)
    95  	if d1 != d2 {
    96  		t.Errorf("mismatching canonical JSON")
    97  	}
    98  }