1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package layout
16
17 import (
18 "path/filepath"
19 "testing"
20
21 v1 "github.com/google/go-containerregistry/pkg/v1"
22 "github.com/google/go-containerregistry/pkg/v1/partial"
23 "github.com/google/go-containerregistry/pkg/v1/types"
24 "github.com/google/go-containerregistry/pkg/v1/validate"
25 )
26
27 var (
28 indexDigest = v1.Hash{
29 Algorithm: "sha256",
30 Hex: "05f95b26ed10668b7183c1e2da98610e91372fa9f510046d4ce5812addad86b5",
31 }
32 manifestDigest = v1.Hash{
33 Algorithm: "sha256",
34 Hex: "eebff607b1628d67459b0596643fc07de70d702eccf030f0bc7bb6fc2b278650",
35 }
36 configDigest = v1.Hash{
37 Algorithm: "sha256",
38 Hex: "6e0b05049ed9c17d02e1a55e80d6599dbfcce7f4f4b022e3c673e685789c470e",
39 }
40 bogusDigest = v1.Hash{
41 Algorithm: "sha256",
42 Hex: "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
43 }
44 customManifestDigest = v1.Hash{
45 Algorithm: "sha256",
46 Hex: "b544f71ecd82372bc9a3c0dbef378abfd2734fe437df81ff6e242a0d720d8e3e",
47 }
48 bogusPath = filepath.Join("testdata", "does_not_exist")
49 testPath = filepath.Join("testdata", "test_index")
50 testPathOneImage = filepath.Join("testdata", "test_index_one_image")
51 testPathMediaType = filepath.Join("testdata", "test_index_media_type")
52 customMediaType types.MediaType = "application/tar+gzip"
53 )
54
55 func TestImage(t *testing.T) {
56 lp, err := FromPath(testPath)
57 if err != nil {
58 t.Fatalf("FromPath() = %v", err)
59 }
60 img, err := lp.Image(manifestDigest)
61 if err != nil {
62 t.Fatalf("Image() = %v", err)
63 }
64
65 if err := validate.Image(img); err != nil {
66 t.Errorf("validate.Image() = %v", err)
67 }
68
69 mt, err := img.MediaType()
70 if err != nil {
71 t.Errorf("MediaType() = %v", err)
72 } else if got, want := mt, types.OCIManifestSchema1; got != want {
73 t.Errorf("MediaType(); want: %v got: %v", want, got)
74 }
75
76 cfg, err := img.LayerByDigest(configDigest)
77 if err != nil {
78 t.Fatalf("LayerByDigest(%s) = %v", configDigest, err)
79 }
80
81 cfgName, err := img.ConfigName()
82 if err != nil {
83 t.Fatalf("ConfigName() = %v", err)
84 }
85
86 cfgDigest, err := cfg.Digest()
87 if err != nil {
88 t.Fatalf("cfg.Digest() = %v", err)
89 }
90
91 if got, want := cfgDigest, cfgName; got != want {
92 t.Errorf("ConfigName(); want: %v got: %v", want, got)
93 }
94
95 layers, err := img.Layers()
96 if err != nil {
97 t.Fatalf("img.Layers() = %v", err)
98 }
99
100 mediaType, err := layers[0].MediaType()
101 if err != nil {
102 t.Fatalf("img.Layers() = %v", err)
103 }
104
105
106 if got, want := mediaType, types.DockerLayer; got != want {
107 t.Fatalf("MediaType(); want: %q got: %q", want, got)
108 }
109
110 if ok, err := partial.Exists(layers[0]); err != nil {
111 t.Fatal(err)
112 } else if got, want := ok, true; got != want {
113 t.Errorf("Exists() = %t != %t", got, want)
114 }
115 }
116
117 func TestImageWithEmptyHash(t *testing.T) {
118 lp, err := FromPath(testPathOneImage)
119 if err != nil {
120 t.Fatalf("FromPath() = %v", err)
121 }
122 img, err := lp.Image(v1.Hash{})
123 if err != nil {
124 t.Fatalf("Image() = %v", err)
125 }
126
127 if err := validate.Image(img); err != nil {
128 t.Errorf("validate.Image() = %v", err)
129 }
130 }
131
132 func TestImageErrors(t *testing.T) {
133 lp, err := FromPath(testPath)
134 if err != nil {
135 t.Fatalf("FromPath() = %v", err)
136 }
137 img, err := lp.Image(manifestDigest)
138 if err != nil {
139 t.Fatalf("Image() = %v", err)
140 }
141
142 if _, err := img.LayerByDigest(bogusDigest); err == nil {
143 t.Errorf("LayerByDigest(%s) = nil, expected err", bogusDigest)
144 }
145
146 if _, err := lp.Image(bogusDigest); err == nil {
147 t.Errorf("Image(%s) = nil, expected err", bogusDigest)
148 }
149
150 if _, err := lp.Image(bogusDigest); err == nil {
151 t.Errorf("Image(%s, %s) = nil, expected err", bogusPath, bogusDigest)
152 }
153 }
154
155 func TestImageCustomMediaType(t *testing.T) {
156 lp, err := FromPath(testPathMediaType)
157 if err != nil {
158 t.Fatalf("FromPath() = %v", err)
159 }
160 img, err := lp.Image(customManifestDigest)
161 if err != nil {
162 t.Fatalf("Image() = %v", err)
163 }
164 mt, err := img.MediaType()
165 if err != nil {
166 t.Errorf("MediaType() = %v", err)
167 } else if got, want := mt, types.OCIManifestSchema1; got != want {
168 t.Errorf("MediaType(); want: %v got: %v", want, got)
169 }
170 layers, err := img.Layers()
171 if err != nil {
172 t.Fatalf("img.Layers() = %v", err)
173 }
174 mediaType, err := layers[0].MediaType()
175 if err != nil {
176 t.Fatalf("img.Layers() = %v", err)
177 }
178 if got, want := mediaType, customMediaType; got != want {
179 t.Fatalf("MediaType(); want: %q got: %q", want, got)
180 }
181 }
182
View as plain text