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