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 }