Skip to content

Commit ef657f7

Browse files
committed
Testing images: enforce digest and move to standalone list
Signed-off-by: apostasie <spam_blackhole@farcloser.world>
1 parent f860057 commit ef657f7

9 files changed

+197
-67
lines changed

cmd/nerdctl/builder/builder_builder_test.go

+10-4
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"github.com/containerd/nerdctl/mod/tigron/test"
3131

3232
"github.com/containerd/nerdctl/v2/pkg/buildkitutil"
33+
"github.com/containerd/nerdctl/v2/pkg/referenceutil"
3334
"github.com/containerd/nerdctl/v2/pkg/testutil"
3435
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest"
3536
)
@@ -152,14 +153,19 @@ CMD ["echo", "nerdctl-builder-debug-test-string"]`, testutil.CommonImage)
152153
// FIXME: this test should be rewritten to dynamically retrieve the ids, and use images
153154
// available on all platforms
154155
oldImage := testutil.BusyboxImage
155-
oldImageSha := "7b3ccabffc97de872a30dfd234fd972a66d247c8cfc69b0550f276481852627c"
156+
parsedOldImage, err := referenceutil.Parse(oldImage)
157+
assert.NilError(helpers.T(), err)
158+
oldImageSha := parsedOldImage.Digest.String()
159+
156160
newImage := testutil.AlpineImage
157-
newImageSha := "ec14c7992a97fc11425907e908340c6c3d6ff602f5f13d899e6b7027c9b4133a"
161+
parsedNewImage, err := referenceutil.Parse(newImage)
162+
assert.NilError(helpers.T(), err)
163+
newImageSha := parsedNewImage.Digest.String()
158164

159165
helpers.Ensure("pull", "--quiet", oldImage)
160-
helpers.Ensure("tag", oldImage, newImage)
166+
helpers.Ensure("tag", oldImage, parsedNewImage.Domain+"/"+parsedNewImage.Path+":"+parsedNewImage.Tag)
161167

162-
dockerfile := fmt.Sprintf(`FROM %s`, newImage)
168+
dockerfile := fmt.Sprintf(`FROM %s`, parsedNewImage.Domain+"/"+parsedNewImage.Path+":"+parsedNewImage.Tag)
163169
data.Temp().Save(dockerfile, "Dockerfile")
164170
data.Labels().Set("oldImageSha", oldImageSha)
165171
data.Labels().Set("newImageSha", newImageSha)

cmd/nerdctl/image/image_history_test.go

+61-25
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,42 @@ type historyObj struct {
4343
Comment string
4444
}
4545

46+
const createdAt = "2025-02-13T19:28:36-08:00"
47+
48+
// Expected content of the common image on arm64
49+
var (
50+
createdAtTime, _ = time.Parse(time.RFC3339, createdAt)
51+
expectedHistory = []historyObj{
52+
{
53+
CreatedBy: "CMD [\"/bin/sh\"]",
54+
Size: "0B",
55+
CreatedAt: createdAt,
56+
Snapshot: "<missing>",
57+
Comment: "buildkit.dockerfile.v0",
58+
CreatedSince: formatter.TimeSinceInHuman(createdAtTime),
59+
},
60+
{
61+
CreatedBy: "ADD alpine-minirootfs-3.21.3-aarch64.tar.gz …",
62+
Size: "8.843MB",
63+
CreatedAt: createdAt,
64+
Snapshot: "sha256:a16e98724c05975ee8c40d8fe389c3481373d…",
65+
Comment: "buildkit.dockerfile.v0",
66+
CreatedSince: formatter.TimeSinceInHuman(createdAtTime),
67+
},
68+
}
69+
expectedHistoryNoTrunc = []historyObj{
70+
{
71+
Snapshot: "<missing>",
72+
Size: "0",
73+
},
74+
{
75+
Snapshot: "sha256:a16e98724c05975ee8c40d8fe389c3481373d34ab20a1cf52ea2accc43f71f4c",
76+
CreatedBy: "ADD alpine-minirootfs-3.21.3-aarch64.tar.gz / # buildkit",
77+
Size: "8843264",
78+
},
79+
}
80+
)
81+
4682
func decode(stdout string) ([]historyObj, error) {
4783
dec := json.NewDecoder(strings.NewReader(stdout))
4884
object := []historyObj{}
@@ -95,35 +131,35 @@ func TestImageHistory(t *testing.T) {
95131
assert.NilError(t, err, info)
96132
assert.Equal(t, len(history), 2, info)
97133

98-
localTimeL1, _ := time.Parse(time.RFC3339, "2021-03-31T10:21:23-07:00")
99-
localTimeL2, _ := time.Parse(time.RFC3339, "2021-03-31T10:21:21-07:00")
100-
compTime1, _ := time.Parse(time.RFC3339, history[0].CreatedAt)
101-
compTime2, _ := time.Parse(time.RFC3339, history[1].CreatedAt)
102-
assert.Equal(t, compTime1.UTC().String(), localTimeL1.UTC().String(), info)
103-
assert.Equal(t, history[0].CreatedBy, "/bin/sh -c #(nop) CMD [\"/bin/sh\"]", info)
104-
assert.Equal(t, compTime2.UTC().String(), localTimeL2.UTC().String(), info)
105-
assert.Equal(t, history[1].CreatedBy, "/bin/sh -c #(nop) ADD file:3b16ffee2b26d8af5…", info)
106-
107-
assert.Equal(t, history[0].Size, "0B", info)
108-
assert.Equal(t, history[0].CreatedSince, formatter.TimeSinceInHuman(compTime1), info)
109-
assert.Equal(t, history[0].Snapshot, "<missing>", info)
110-
assert.Equal(t, history[0].Comment, "", info)
111-
112-
assert.Equal(t, history[1].Size, "5.947MB", info)
113-
assert.Equal(t, history[1].CreatedSince, formatter.TimeSinceInHuman(compTime2), info)
114-
assert.Equal(t, history[1].Snapshot, "sha256:56bf55b8eed1f0b4794a30386e4d1d3da949c…", info)
115-
assert.Equal(t, history[1].Comment, "", info)
134+
h0Time, _ := time.Parse(time.RFC3339, history[0].CreatedAt)
135+
h1Time, _ := time.Parse(time.RFC3339, history[1].CreatedAt)
136+
comp0Time, _ := time.Parse(time.RFC3339, expectedHistory[0].CreatedAt)
137+
comp1Time, _ := time.Parse(time.RFC3339, expectedHistory[1].CreatedAt)
138+
139+
assert.Equal(t, h0Time.UTC().String(), comp0Time.UTC().String(), info)
140+
assert.Equal(t, history[0].CreatedBy, expectedHistory[0].CreatedBy, info)
141+
assert.Equal(t, history[0].Size, expectedHistory[0].Size, info)
142+
assert.Equal(t, history[0].CreatedSince, expectedHistory[0].CreatedSince, info)
143+
assert.Equal(t, history[0].Snapshot, expectedHistory[0].Snapshot, info)
144+
assert.Equal(t, history[0].Comment, expectedHistory[0].Comment, info)
145+
146+
assert.Equal(t, h1Time.UTC().String(), comp1Time.UTC().String(), info)
147+
assert.Equal(t, history[1].CreatedBy, expectedHistory[1].CreatedBy, info)
148+
assert.Equal(t, history[1].Size, expectedHistory[1].Size, info)
149+
assert.Equal(t, history[1].CreatedSince, expectedHistory[1].CreatedSince, info)
150+
assert.Equal(t, history[1].Snapshot, expectedHistory[1].Snapshot, info)
151+
assert.Equal(t, history[1].Comment, expectedHistory[1].Comment, info)
116152
}),
117153
},
118154
{
119-
Description: "no human - dates and sizes and not prettyfied",
155+
Description: "no human - dates and sizes are not prettyfied",
120156
Command: test.Command("image", "history", "--human=false", "--format=json", testutil.CommonImage),
121157
Expected: test.Expects(0, nil, func(stdout string, info string, t *testing.T) {
122158
history, err := decode(stdout)
123159
assert.NilError(t, err, info)
124-
assert.Equal(t, history[0].Size, "0", info)
160+
assert.Equal(t, history[0].Size, expectedHistoryNoTrunc[0].Size, info)
125161
assert.Equal(t, history[0].CreatedSince, history[0].CreatedAt, info)
126-
assert.Equal(t, history[1].Size, "5947392", info)
162+
assert.Equal(t, history[1].Size, expectedHistoryNoTrunc[1].Size, info)
127163
assert.Equal(t, history[1].CreatedSince, history[1].CreatedAt, info)
128164
}),
129165
},
@@ -133,22 +169,22 @@ func TestImageHistory(t *testing.T) {
133169
Expected: test.Expects(0, nil, func(stdout string, info string, t *testing.T) {
134170
history, err := decode(stdout)
135171
assert.NilError(t, err, info)
136-
assert.Equal(t, history[1].Snapshot, "sha256:56bf55b8eed1f0b4794a30386e4d1d3da949c25bcb5155e898097cd75dc77c2a")
137-
assert.Equal(t, history[1].CreatedBy, "/bin/sh -c #(nop) ADD file:3b16ffee2b26d8af5db152fcc582aaccd9e1ec9e3343874e9969a205550fe07d in / ")
172+
assert.Equal(t, history[1].Snapshot, expectedHistoryNoTrunc[1].Snapshot)
173+
assert.Equal(t, history[1].CreatedBy, expectedHistoryNoTrunc[1].CreatedBy)
138174
}),
139175
},
140176
{
141177
Description: "Quiet has no effect with format, so, go no-json, no-trunc",
142178
Command: test.Command("image", "history", "--human=false", "--no-trunc", "--quiet", testutil.CommonImage),
143179
Expected: test.Expects(0, nil, func(stdout string, info string, t *testing.T) {
144-
assert.Equal(t, stdout, "<missing>\nsha256:56bf55b8eed1f0b4794a30386e4d1d3da949c25bcb5155e898097cd75dc77c2a\n")
180+
assert.Equal(t, stdout, expectedHistoryNoTrunc[0].Snapshot+"\n"+expectedHistoryNoTrunc[1].Snapshot+"\n")
145181
}),
146182
},
147183
{
148184
Description: "With quiet, trunc has no effect",
149185
Command: test.Command("image", "history", "--human=false", "--no-trunc", "--quiet", testutil.CommonImage),
150186
Expected: test.Expects(0, nil, func(stdout string, info string, t *testing.T) {
151-
assert.Equal(t, stdout, "<missing>\nsha256:56bf55b8eed1f0b4794a30386e4d1d3da949c25bcb5155e898097cd75dc77c2a\n")
187+
assert.Equal(t, stdout, expectedHistoryNoTrunc[0].Snapshot+"\n"+expectedHistoryNoTrunc[1].Snapshot+"\n")
152188
}),
153189
},
154190
},

cmd/nerdctl/image/image_list_test.go

+21-16
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package image
1919
import (
2020
"errors"
2121
"fmt"
22+
"github.com/containerd/nerdctl/v2/pkg/referenceutil"
2223
"os"
2324
"path/filepath"
2425
"runtime"
@@ -40,10 +41,12 @@ import (
4041
func TestImages(t *testing.T) {
4142
nerdtest.Setup()
4243

44+
commonImage, _ := referenceutil.Parse(testutil.CommonImage)
45+
4346
testCase := &test.Case{
4447
Require: require.Not(nerdtest.Docker),
4548
Setup: func(data test.Data, helpers test.Helpers) {
46-
helpers.Ensure("pull", "--quiet", testutil.CommonImage)
49+
helpers.Ensure("pull", "--quiet", commonImage.String())
4750
helpers.Ensure("pull", "--quiet", testutil.NginxAlpineImage)
4851
},
4952
SubTests: []*test.Case{
@@ -66,7 +69,7 @@ func TestImages(t *testing.T) {
6669
for _, line := range lines[1:] {
6770
repo, _ := tab.ReadRow(line, "REPOSITORY")
6871
tag, _ := tab.ReadRow(line, "TAG")
69-
if repo+":"+tag == testutil.CommonImage {
72+
if repo+":"+tag == commonImage.FamiliarName()+":"+commonImage.Tag {
7073
found = true
7174
break
7275
}
@@ -78,11 +81,11 @@ func TestImages(t *testing.T) {
7881
},
7982
{
8083
Description: "With names",
81-
Command: test.Command("images", "--names", testutil.CommonImage),
84+
Command: test.Command("images", "--names", commonImage.String()),
8285
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
8386
return &test.Expected{
8487
Output: expect.All(
85-
expect.Contains(testutil.CommonImage),
88+
expect.Contains(commonImage.String()),
8689
func(stdout string, info string, t *testing.T) {
8790
lines := strings.Split(strings.TrimSpace(stdout), "\n")
8891
assert.Assert(t, len(lines) >= 2, info)
@@ -92,7 +95,7 @@ func TestImages(t *testing.T) {
9295
found := false
9396
for _, line := range lines[1:] {
9497
name, _ := tab.ReadRow(line, "NAME")
95-
if name == testutil.CommonImage {
98+
if name == commonImage.String() {
9699
found = true
97100
break
98101
}
@@ -135,19 +138,21 @@ func TestImages(t *testing.T) {
135138
func TestImagesFilter(t *testing.T) {
136139
nerdtest.Setup()
137140

141+
commonImage, _ := referenceutil.Parse(testutil.CommonImage)
142+
138143
testCase := &test.Case{
139144
Require: nerdtest.Build,
140145
Setup: func(data test.Data, helpers test.Helpers) {
141-
helpers.Ensure("pull", "--quiet", testutil.CommonImage)
142-
helpers.Ensure("tag", testutil.CommonImage, "taggedimage:one-fragment-one")
143-
helpers.Ensure("tag", testutil.CommonImage, "taggedimage:two-fragment-two")
146+
helpers.Ensure("pull", "--quiet", commonImage.String())
147+
helpers.Ensure("tag", commonImage.String(), "taggedimage:one-fragment-one")
148+
helpers.Ensure("tag", commonImage.String(), "taggedimage:two-fragment-two")
144149

145150
dockerfile := fmt.Sprintf(`FROM %s
146151
CMD ["echo", "nerdctl-build-test-string"] \n
147152
LABEL foo=bar
148153
LABEL version=0.1
149154
RUN echo "actually creating a layer so that docker sets the createdAt time"
150-
`, testutil.CommonImage)
155+
`, commonImage.String())
151156
buildCtx := data.Temp().Path()
152157
err := os.WriteFile(filepath.Join(buildCtx, "Dockerfile"), []byte(dockerfile), 0o600)
153158
assert.NilError(helpers.T(), err)
@@ -237,32 +242,32 @@ RUN echo "actually creating a layer so that docker sets the createdAt time"
237242
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
238243
return &test.Expected{
239244
Output: expect.All(
240-
expect.Contains(testutil.ImageRepo(testutil.CommonImage)),
245+
expect.Contains(commonImage.FamiliarName(), commonImage.Tag),
241246
expect.DoesNotContain(data.Labels().Get("builtImageID")),
242247
),
243248
}
244249
},
245250
},
246251
{
247-
Description: "since=" + testutil.CommonImage,
248-
Command: test.Command("images", "--filter", fmt.Sprintf("since=%s", testutil.CommonImage)),
252+
Description: "since=" + commonImage.String(),
253+
Command: test.Command("images", "--filter", fmt.Sprintf("since=%s", commonImage.String())),
249254
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
250255
return &test.Expected{
251256
Output: expect.All(
252257
expect.Contains(data.Labels().Get("builtImageID")),
253-
expect.DoesNotContain(testutil.ImageRepo(testutil.CommonImage)),
258+
expect.DoesNotContain(commonImage.Tag),
254259
),
255260
}
256261
},
257262
},
258263
{
259-
Description: "since=" + testutil.CommonImage + " " + testutil.CommonImage,
260-
Command: test.Command("images", "--filter", fmt.Sprintf("since=%s", testutil.CommonImage), testutil.CommonImage),
264+
Description: "since=" + commonImage.String() + " " + commonImage.String(),
265+
Command: test.Command("images", "--filter", fmt.Sprintf("since=%s", commonImage.String()), commonImage.String()),
261266
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
262267
return &test.Expected{
263268
Output: expect.DoesNotContain(
264269
data.Labels().Get("builtImageID"),
265-
testutil.ImageRepo(testutil.CommonImage),
270+
commonImage.Tag,
266271
),
267272
}
268273
},

cmd/nerdctl/image/image_pull_linux_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/containerd/nerdctl/mod/tigron/require"
2929
"github.com/containerd/nerdctl/mod/tigron/test"
3030

31+
"github.com/containerd/nerdctl/v2/pkg/referenceutil"
3132
"github.com/containerd/nerdctl/v2/pkg/testutil"
3233
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest"
3334
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest/registry"
@@ -113,6 +114,7 @@ func TestImagePullPlainHttpWithDefaultPort(t *testing.T) {
113114
nerdtest.Setup()
114115

115116
var reg *registry.Server
117+
im, _ := referenceutil.Parse(testutil.CommonImage)
116118
dockerfile := fmt.Sprintf(`FROM %s
117119
CMD ["echo", "nerdctl-build-test-string"]
118120
`, testutil.CommonImage)
@@ -130,7 +132,7 @@ CMD ["echo", "nerdctl-build-test-string"]
130132
reg = nerdtest.RegistryWithNoAuth(data, helpers, 80, false)
131133
reg.Setup(data, helpers)
132134
testImageRef := fmt.Sprintf("%s/%s:%s",
133-
reg.IP.String(), data.Identifier(), strings.Split(testutil.CommonImage, ":")[1])
135+
reg.IP.String(), data.Identifier(), im.Tag)
134136
buildCtx := data.Temp().Path()
135137

136138
helpers.Ensure("build", "-t", testImageRef, buildCtx)

cmd/nerdctl/image/image_push_linux_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/containerd/nerdctl/mod/tigron/require"
2929
"github.com/containerd/nerdctl/mod/tigron/test"
3030

31+
"github.com/containerd/nerdctl/v2/pkg/referenceutil"
3132
"github.com/containerd/nerdctl/v2/pkg/testutil"
3233
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest"
3334
"github.com/containerd/nerdctl/v2/pkg/testutil/testregistry"
@@ -37,6 +38,7 @@ func TestPush(t *testing.T) {
3738
nerdtest.Setup()
3839

3940
var registryNoAuthHTTPRandom, registryNoAuthHTTPDefault, registryTokenAuthHTTPSRandom *testregistry.RegistryServer
41+
commonImage, _ := referenceutil.Parse(testutil.CommonImage)
4042

4143
testCase := &test.Case{
4244
Require: require.Linux,
@@ -66,7 +68,7 @@ func TestPush(t *testing.T) {
6668
Setup: func(data test.Data, helpers test.Helpers) {
6769
helpers.Ensure("pull", "--quiet", testutil.CommonImage)
6870
testImageRef := fmt.Sprintf("%s:%d/%s:%s",
69-
registryNoAuthHTTPRandom.IP.String(), registryNoAuthHTTPRandom.Port, data.Identifier(), strings.Split(testutil.CommonImage, ":")[1])
71+
registryNoAuthHTTPRandom.IP.String(), registryNoAuthHTTPRandom.Port, data.Identifier(), commonImage.Tag)
7072
data.Labels().Set("testImageRef", testImageRef)
7173
helpers.Ensure("tag", testutil.CommonImage, testImageRef)
7274
},

pkg/testutil/images.env

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
ALPINE=alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c
2+
BUSYBOX=busybox:1.37.0@sha256:37f7b378a29ceb4c551b1b5582e27747b855bbfaa73fa11914fe0df028dc581f
3+
DEBIAN=debian:bookworm-slim@sha256:b1211f6d19afd012477bd34fdcabb6b663d680e0f4b0537da6e6b0fd057a3ec3
4+
DOCKER_AUTH=cesanta/docker_auth:1.13.0@sha256:c2968eea28ff51b75b88e45147b1d5b8387fd7836400cb97d076c0feb4a451d9
5+
FLUENTD=fluentd:v1.18.0-debian-1.0@sha256:e7c937425430ad9a23123855379a144f5d079bed8d3b87342bf1e6babb4009fd
6+
GITLAB=gitlab/gitlab-ee:17.11.0-ee.0@sha256:e0d9d5e0d0068f4b4bac3e15eb48313b5c3bb508425645f421bf2773a964c4ae
7+
GOLANG=golang:1.23.8-bookworm@sha256:1a73e15c5a17855b58014aab45df0fdf8be778f12a62ed2a48009fe2c0022091
8+
HARBOR=bitnami/harbor-portal:v2.13.0@sha256:636f39610b359369aeeddd7859cb56274d9a1bc3e467e21d74ea89e1516c1a0c
9+
KUBO=ipfs/kubo:v0.34.1@sha256:1cf421fbd881d01144c0da39aa1511c05f1ef3fd5eebee6ba7487ecc0f915a44
10+
MARIADB=mariadb:11.7.2@sha256:81e893032978c4bf8ad43710b7a979774ed90787fa32d199162148ce28fe3b76
11+
NANOSERVER=mcr.microsoft.com/windows/nanoserver:ltsc2022@sha256:16b61ffac72961551c4b5312a7ab3da7c3dc3258510e40bee309e6e51f006ac6
12+
NGINX=nginx:alpine3.21@sha256:65645c7bb6a0661892a8b03b89d0743208a18dd2f3f17a54ef4b76fb8e2f2a10
13+
REGISTRY=registry:3.0.0@sha256:1fc7de654f2ac1247f0b67e8a459e273b0993be7d2beda1f3f56fbf1001ed3e7
14+
SYSTEMD=ghcr.io/containerd/stargz-snapshotter:0.16.3-kind@sha256:c7c7de2af39f2373a89b6f993a81c9e19b65bf37a65ab14ef2791c97c07e530e
15+
WORDPRESS=wordpress:6.8.0-php8.4-fpm-alpine@sha256:309b64fa4266d8a3fe6f0973ae3172fec1023c9b18242ccf1dffbff5dc8b81a8

0 commit comments

Comments
 (0)