1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package random
16
17 import (
18 "archive/tar"
19 "bytes"
20 "errors"
21 "io"
22 "math/rand"
23 "testing"
24
25 v1 "github.com/google/go-containerregistry/pkg/v1"
26 "github.com/google/go-containerregistry/pkg/v1/types"
27 "github.com/google/go-containerregistry/pkg/v1/validate"
28 )
29
30 func TestManifestAndConfig(t *testing.T) {
31 want := int64(12)
32 img, err := Image(1024, want)
33 if err != nil {
34 t.Fatalf("Error loading image: %v", err)
35 }
36 manifest, err := img.Manifest()
37 if err != nil {
38 t.Fatalf("Error loading manifest: %v", err)
39 }
40 if got := int64(len(manifest.Layers)); got != want {
41 t.Fatalf("num layers; got %v, want %v", got, want)
42 }
43
44 config, err := img.ConfigFile()
45 if err != nil {
46 t.Fatalf("Error loading config file: %v", err)
47 }
48 if got := int64(len(config.RootFS.DiffIDs)); got != want {
49 t.Fatalf("num diff ids; got %v, want %v", got, want)
50 }
51
52 if err := validate.Image(img); err != nil {
53 t.Errorf("failed to validate: %v", err)
54 }
55 }
56
57 func TestTarLayer(t *testing.T) {
58 img, err := Image(1024, 5)
59 if err != nil {
60 t.Fatalf("Image: %v", err)
61 }
62 layers, err := img.Layers()
63 if err != nil {
64 t.Fatalf("Layers: %v", err)
65 }
66 if len(layers) != 5 {
67 t.Errorf("Got %d layers, want 5", len(layers))
68 }
69 for i, l := range layers {
70 mediaType, err := l.MediaType()
71 if err != nil {
72 t.Fatalf("MediaType: %v", err)
73 }
74 if got, want := mediaType, types.DockerLayer; got != want {
75 t.Fatalf("MediaType(); got %q, want %q", got, want)
76 }
77
78 rc, err := l.Uncompressed()
79 if err != nil {
80 t.Errorf("Uncompressed(%d): %v", i, err)
81 }
82 defer rc.Close()
83 tr := tar.NewReader(rc)
84 if _, err := tr.Next(); err != nil {
85 t.Errorf("tar.Next: %v", err)
86 }
87
88 if n, err := io.Copy(io.Discard, tr); err != nil {
89 t.Errorf("Reading tar layer: %v", err)
90 } else if n != 1024 {
91 t.Errorf("Layer %d was %d bytes, want 1024", i, n)
92 }
93
94 if _, err := tr.Next(); !errors.Is(err, io.EOF) {
95 t.Errorf("Layer contained more files; got %v, want EOF", err)
96 }
97 }
98 }
99
100 func TestRandomLayer(t *testing.T) {
101 l, err := Layer(1024, types.DockerLayer)
102 if err != nil {
103 t.Fatalf("Layer: %v", err)
104 }
105 mediaType, err := l.MediaType()
106 if err != nil {
107 t.Fatalf("MediaType: %v", err)
108 }
109 if got, want := mediaType, types.DockerLayer; got != want {
110 t.Errorf("MediaType(); got %q, want %q", got, want)
111 }
112
113 rc, err := l.Uncompressed()
114 if err != nil {
115 t.Fatalf("Uncompressed(): %v", err)
116 }
117 defer rc.Close()
118 tr := tar.NewReader(rc)
119 if _, err := tr.Next(); err != nil {
120 t.Fatalf("tar.Next: %v", err)
121 }
122
123 if n, err := io.Copy(io.Discard, tr); err != nil {
124 t.Errorf("Reading tar layer: %v", err)
125 } else if n != 1024 {
126 t.Errorf("Layer was %d bytes, want 1024", n)
127 }
128
129 if _, err := tr.Next(); !errors.Is(err, io.EOF) {
130 t.Errorf("Layer contained more files; got %v, want EOF", err)
131 }
132 }
133
134 func TestRandomLayerSource(t *testing.T) {
135 layerData := func(o ...Option) []byte {
136 l, err := Layer(1024, types.DockerLayer, o...)
137 if err != nil {
138 t.Fatalf("Layer: %v", err)
139 }
140
141 rc, err := l.Compressed()
142 if err != nil {
143 t.Fatalf("Compressed(): %v", err)
144 }
145 defer rc.Close()
146
147 data, err := io.ReadAll(rc)
148 if err != nil {
149 t.Fatalf("Read: %v", err)
150 }
151 return data
152 }
153
154 data0a := layerData(WithSource(rand.NewSource(0)))
155 data0b := layerData(WithSource(rand.NewSource(0)))
156 data1 := layerData(WithSource(rand.NewSource(1)))
157
158 if !bytes.Equal(data0a, data0b) {
159 t.Error("Expected the layer data to be the same with the same seed")
160 }
161
162 if bytes.Equal(data0a, data1) {
163 t.Error("Expected the layer data to be different with different seeds")
164 }
165
166 dataA := layerData()
167 dataB := layerData()
168
169 if bytes.Equal(dataA, dataB) {
170 t.Error("Expected the layer data to be different with different random seeds")
171 }
172 }
173
174 func TestRandomImageSource(t *testing.T) {
175 imageDigest := func(o ...Option) v1.Hash {
176 img, err := Image(1024, 2, o...)
177 if err != nil {
178 t.Fatalf("Image: %v", err)
179 }
180
181 h, err := img.Digest()
182 if err != nil {
183 t.Fatalf("Digest(): %v", err)
184 }
185 return h
186 }
187
188 digest0a := imageDigest(WithSource(rand.NewSource(0)))
189 digest0b := imageDigest(WithSource(rand.NewSource(0)))
190 digest1 := imageDigest(WithSource(rand.NewSource(1)))
191
192 if digest0a != digest0b {
193 t.Error("Expected the image digest to be the same with the same seed")
194 }
195
196 if digest0a == digest1 {
197 t.Error("Expected the image digest to be different with different seeds")
198 }
199
200 digestA := imageDigest()
201 digestB := imageDigest()
202
203 if digestA == digestB {
204 t.Error("Expected the image digest to be different with different random seeds")
205 }
206 }
207
View as plain text