Skip to content

Commit 3a5893e

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

20 files changed

+248
-157
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/compose/compose_images_linux_test.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"strings"
2323
"testing"
2424

25+
"github.com/containerd/nerdctl/v2/pkg/referenceutil"
2526
"github.com/containerd/nerdctl/v2/pkg/testutil"
2627
)
2728

@@ -65,16 +66,16 @@ volumes:
6566
base.ComposeCmd("-f", comp.YAMLFullPath(), "up", "-d").AssertOK()
6667
defer base.ComposeCmd("-f", comp.YAMLFullPath(), "down", "-v").Run()
6768

68-
wordpressImageName := strings.Split(testutil.WordpressImage, ":")[0]
69-
dbImageName := strings.Split(testutil.MariaDBImage, ":")[0]
69+
wordpressImageName, _ := referenceutil.Parse(testutil.WordpressImage)
70+
dbImageName, _ := referenceutil.Parse(testutil.MariaDBImage)
7071

7172
// check one service image
72-
base.ComposeCmd("-f", comp.YAMLFullPath(), "images", "db").AssertOutContains(dbImageName)
73-
base.ComposeCmd("-f", comp.YAMLFullPath(), "images", "db").AssertOutNotContains(wordpressImageName)
73+
base.ComposeCmd("-f", comp.YAMLFullPath(), "images", "db").AssertOutContains(dbImageName.Name())
74+
base.ComposeCmd("-f", comp.YAMLFullPath(), "images", "db").AssertOutNotContains(wordpressImageName.Name())
7475

7576
// check all service images
76-
base.ComposeCmd("-f", comp.YAMLFullPath(), "images").AssertOutContains(dbImageName)
77-
base.ComposeCmd("-f", comp.YAMLFullPath(), "images").AssertOutContains(wordpressImageName)
77+
base.ComposeCmd("-f", comp.YAMLFullPath(), "images").AssertOutContains(dbImageName.Name())
78+
base.ComposeCmd("-f", comp.YAMLFullPath(), "images").AssertOutContains(wordpressImageName.Name())
7879
}
7980

8081
func TestComposeImagesJson(t *testing.T) {

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
@@ -32,6 +32,7 @@ import (
3232
"github.com/containerd/nerdctl/mod/tigron/require"
3333
"github.com/containerd/nerdctl/mod/tigron/test"
3434

35+
"github.com/containerd/nerdctl/v2/pkg/referenceutil"
3536
"github.com/containerd/nerdctl/v2/pkg/tabutil"
3637
"github.com/containerd/nerdctl/v2/pkg/testutil"
3738
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest"
@@ -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)

0 commit comments

Comments
 (0)