...
1 package schema1
2
3 import (
4 "testing"
5
6 "github.com/distribution/reference"
7 "github.com/docker/distribution/context"
8 "github.com/docker/distribution/manifest"
9 "github.com/docker/libtrust"
10 "github.com/opencontainers/go-digest"
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.WithName(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
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 }
109
View as plain text