Skip to content

Commit 599681f

Browse files
authored
Merge pull request containerd#4348 from apostasie/2025-05-ci-proofing-2
[CI] Fix broken image ref parsing and hard-coded data in tests
2 parents 15b2cc3 + 96ae925 commit 599681f

File tree

4 files changed

+42
-30
lines changed

4 files changed

+42
-30
lines changed

cmd/nerdctl/builder/builder_builder_test.go

Lines changed: 10 additions & 4 deletions
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_list_test.go

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package image
1919
import (
2020
"errors"
2121
"fmt"
22+
"regexp"
2223
"runtime"
2324
"slices"
2425
"strings"
@@ -31,6 +32,7 @@ import (
3132
"github.com/containerd/nerdctl/mod/tigron/test"
3233
"github.com/containerd/nerdctl/mod/tigron/tig"
3334

35+
"github.com/containerd/nerdctl/v2/pkg/referenceutil"
3436
"github.com/containerd/nerdctl/v2/pkg/tabutil"
3537
"github.com/containerd/nerdctl/v2/pkg/testutil"
3638
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest"
@@ -39,10 +41,12 @@ import (
3941
func TestImages(t *testing.T) {
4042
nerdtest.Setup()
4143

44+
commonImage, _ := referenceutil.Parse(testutil.CommonImage)
45+
4246
testCase := &test.Case{
4347
Require: require.Not(nerdtest.Docker),
4448
Setup: func(data test.Data, helpers test.Helpers) {
45-
helpers.Ensure("pull", "--quiet", testutil.CommonImage)
49+
helpers.Ensure("pull", "--quiet", commonImage.String())
4650
helpers.Ensure("pull", "--quiet", testutil.NginxAlpineImage)
4751
},
4852
SubTests: []*test.Case{
@@ -65,7 +69,7 @@ func TestImages(t *testing.T) {
6569
for _, line := range lines[1:] {
6670
repo, _ := tab.ReadRow(line, "REPOSITORY")
6771
tag, _ := tab.ReadRow(line, "TAG")
68-
if repo+":"+tag == testutil.CommonImage {
72+
if repo+":"+tag == commonImage.FamiliarName()+":"+commonImage.Tag {
6973
found = true
7074
break
7175
}
@@ -77,11 +81,11 @@ func TestImages(t *testing.T) {
7781
},
7882
{
7983
Description: "With names",
80-
Command: test.Command("images", "--names", testutil.CommonImage),
84+
Command: test.Command("images", "--names", commonImage.String()),
8185
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
8286
return &test.Expected{
8387
Output: expect.All(
84-
expect.Contains(testutil.CommonImage),
88+
expect.Contains(commonImage.String()),
8589
func(stdout string, t tig.T) {
8690
lines := strings.Split(strings.TrimSpace(stdout), "\n")
8791
assert.Assert(t, len(lines) >= 2, "there should be at least two lines\n")
@@ -91,7 +95,7 @@ func TestImages(t *testing.T) {
9195
found := false
9296
for _, line := range lines[1:] {
9397
name, _ := tab.ReadRow(line, "NAME")
94-
if name == testutil.CommonImage {
98+
if name == commonImage.String() {
9599
found = true
96100
break
97101
}
@@ -134,19 +138,21 @@ func TestImages(t *testing.T) {
134138
func TestImagesFilter(t *testing.T) {
135139
nerdtest.Setup()
136140

141+
commonImage, _ := referenceutil.Parse(testutil.CommonImage)
142+
137143
testCase := &test.Case{
138144
Require: nerdtest.Build,
139145
Setup: func(data test.Data, helpers test.Helpers) {
140-
helpers.Ensure("pull", "--quiet", testutil.CommonImage)
141-
helpers.Ensure("tag", testutil.CommonImage, "taggedimage:one-fragment-one")
142-
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")
143149

144150
dockerfile := fmt.Sprintf(`FROM %s
145151
CMD ["echo", "nerdctl-build-test-string"] \n
146152
LABEL foo=bar
147153
LABEL version=0.1
148154
RUN echo "actually creating a layer so that docker sets the createdAt time"
149-
`, testutil.CommonImage)
155+
`, commonImage.String())
150156
buildCtx := data.Temp().Path()
151157
data.Temp().Save(dockerfile, "Dockerfile")
152158
data.Labels().Set("buildCtx", buildCtx)
@@ -235,32 +241,32 @@ RUN echo "actually creating a layer so that docker sets the createdAt time"
235241
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
236242
return &test.Expected{
237243
Output: expect.All(
238-
expect.Contains(testutil.ImageRepo(testutil.CommonImage)),
244+
expect.Contains(commonImage.FamiliarName(), commonImage.Tag),
239245
expect.DoesNotContain(data.Labels().Get("builtImageID")),
240246
),
241247
}
242248
},
243249
},
244250
{
245-
Description: "since=" + testutil.CommonImage,
246-
Command: test.Command("images", "--filter", fmt.Sprintf("since=%s", testutil.CommonImage)),
251+
Description: "since=" + commonImage.String(),
252+
Command: test.Command("images", "--filter", fmt.Sprintf("since=%s", commonImage.String())),
247253
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
248254
return &test.Expected{
249255
Output: expect.All(
250256
expect.Contains(data.Labels().Get("builtImageID")),
251-
expect.DoesNotContain(testutil.ImageRepo(testutil.CommonImage)),
257+
expect.DoesNotMatch(regexp.MustCompile(commonImage.FamiliarName()+"[\\s]+"+commonImage.Tag)),
252258
),
253259
}
254260
},
255261
},
256262
{
257-
Description: "since=" + testutil.CommonImage + " " + testutil.CommonImage,
258-
Command: test.Command("images", "--filter", fmt.Sprintf("since=%s", testutil.CommonImage), testutil.CommonImage),
263+
Description: "since=" + commonImage.String() + " " + commonImage.String(),
264+
Command: test.Command("images", "--filter", fmt.Sprintf("since=%s", commonImage.String()), commonImage.String()),
259265
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
260266
return &test.Expected{
261-
Output: expect.DoesNotContain(
262-
data.Labels().Get("builtImageID"),
263-
testutil.ImageRepo(testutil.CommonImage),
267+
Output: expect.All(
268+
expect.DoesNotContain(data.Labels().Get("builtImageID")),
269+
expect.DoesNotMatch(regexp.MustCompile(commonImage.FamiliarName()+"[\\s]+"+commonImage.Tag)),
264270
),
265271
}
266272
},

mod/tigron/expect/comparators.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,14 @@ func Match(reg *regexp.Regexp) test.Comparator {
9191
}
9292
}
9393

94+
// DoesNotMatch returns a comparator verifying the output does not match the provided regexp.
95+
func DoesNotMatch(reg *regexp.Regexp) test.Comparator {
96+
return func(stdout string, t tig.T) {
97+
t.Helper()
98+
assertive.DoesNotMatch(assertive.WithFailLater(t), stdout, reg, "Inspecting output (!match)")
99+
}
100+
}
101+
94102
// JSON allows to verify that the output can be marshalled into T, and optionally can be further verified by a provided
95103
// method.
96104
func JSON[T any](obj T, verifier func(T, tig.T)) test.Comparator {

pkg/testutil/testutil.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import (
4040
"github.com/containerd/log"
4141

4242
"github.com/containerd/nerdctl/v2/pkg/buildkitutil"
43-
"github.com/containerd/nerdctl/v2/pkg/imgutil"
4443
"github.com/containerd/nerdctl/v2/pkg/infoutil"
4544
"github.com/containerd/nerdctl/v2/pkg/inspecttypes/dockercompat"
4645
"github.com/containerd/nerdctl/v2/pkg/inspecttypes/native"
@@ -749,13 +748,6 @@ func Identifier(t testing.TB) string {
749748
return s
750749
}
751750

752-
// ImageRepo returns the image repo that can be used to, e.g, validate output
753-
// from `nerdctl images`.
754-
func ImageRepo(s string) string {
755-
repo, _ := imgutil.ParseRepoTag(s)
756-
return repo
757-
}
758-
759751
// RegisterBuildCacheCleanup adds a 'builder prune --all --force' cleanup function
760752
// to run on test teardown.
761753
func RegisterBuildCacheCleanup(t *testing.T) {

0 commit comments

Comments
 (0)