Skip to content

Commit dbcc3bc

Browse files
authored
Merge pull request containerd#3550 from apostasie/part5-tests
Part 5: tests
2 parents c4eab4d + 9603bf4 commit dbcc3bc

File tree

8 files changed

+144
-225
lines changed

8 files changed

+144
-225
lines changed

cmd/nerdctl/container/container_commit_linux_test.go

+59-65
Original file line numberDiff line numberDiff line change
@@ -21,76 +21,70 @@ import (
2121
"testing"
2222

2323
"github.com/containerd/nerdctl/v2/pkg/testutil"
24+
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest"
25+
"github.com/containerd/nerdctl/v2/pkg/testutil/test"
2426
)
2527

26-
/*
27-
This test below is meant to assert that https://github.com/containerd/nerdctl/issues/827 is NOT fixed.
28-
Obviously, once we fix the issue, it should be replaced by something that assert it works.
29-
Unfortunately, this is flaky.
30-
It will regularly succeed or fail, making random PR fail the Kube check.
31-
*/
32-
33-
func TestKubeCommitPush(t *testing.T) {
34-
t.Parallel()
35-
36-
base := testutil.NewBaseForKubernetes(t)
37-
tID := testutil.Identifier(t)
38-
39-
var containerID string
40-
// var registryIP string
41-
42-
setup := func() {
43-
testutil.KubectlHelper(base, "run", "--image", testutil.CommonImage, tID, "--", "sleep", "Inf").
44-
AssertOK()
45-
46-
testutil.KubectlHelper(base, "wait", "pod", tID, "--for=condition=ready", "--timeout=1m").
47-
AssertOK()
48-
49-
testutil.KubectlHelper(base, "exec", tID, "--", "mkdir", "-p", "/tmp/whatever").
50-
AssertOK()
51-
52-
cmd := testutil.KubectlHelper(base, "get", "pods", tID, "-o", "jsonpath={ .status.containerStatuses[0].containerID }")
53-
cmd.Run()
54-
containerID = strings.TrimPrefix(cmd.Out(), "containerd://")
55-
56-
// This below is missing configuration to allow for plain http communication
57-
// This is left here for future work to successfully start a registry usable in the cluster
58-
/*
59-
// Start a registry
60-
testutil.KubectlHelper(base, "run", "--port", "5000", "--image", testutil.RegistryImageStable, "testregistry").
61-
AssertOK()
62-
63-
testutil.KubectlHelper(base, "wait", "pod", "testregistry", "--for=condition=ready", "--timeout=1m").
64-
AssertOK()
65-
66-
cmd = testutil.KubectlHelper(base, "get", "pods", tID, "-o", "jsonpath={ .status.hostIPs[0].ip }")
67-
cmd.Run()
68-
registryIP = cmd.Out()
69-
70-
cmd = testutil.KubectlHelper(base, "apply", "-f", "-", fmt.Sprintf(`apiVersion: v1
71-
kind: ConfigMap
72-
metadata:
73-
name: local-registry
74-
namespace: nerdctl-test
75-
data:
76-
localRegistryHosting.v1: |
77-
host: "%s:5000"
78-
help: "https://kind.sigs.k8s.io/docs/user/local-registry/"
79-
`, registryIP))
80-
*/
81-
28+
func TestKubeCommitSave(t *testing.T) {
29+
testCase := nerdtest.Setup()
30+
31+
testCase.Require = nerdtest.OnlyKubernetes
32+
33+
testCase.Setup = func(data test.Data, helpers test.Helpers) {
34+
containerID := ""
35+
// NOTE: kubectl namespaces are not the same as containerd namespaces.
36+
// We still want kube test objects segregated in their own Kube API namespace.
37+
nerdtest.KubeCtlCommand(helpers, "create", "namespace", "nerdctl-test-k8s").Run(&test.Expected{})
38+
nerdtest.KubeCtlCommand(helpers, "run", "--image", testutil.CommonImage, data.Identifier(), "--", "sleep", "Inf").Run(&test.Expected{})
39+
nerdtest.KubeCtlCommand(helpers, "wait", "pod", data.Identifier(), "--for=condition=ready", "--timeout=1m").Run(&test.Expected{})
40+
nerdtest.KubeCtlCommand(helpers, "exec", data.Identifier(), "--", "mkdir", "-p", "/tmp/whatever").Run(&test.Expected{})
41+
nerdtest.KubeCtlCommand(helpers, "get", "pods", data.Identifier(), "-o", "jsonpath={ .status.containerStatuses[0].containerID }").Run(&test.Expected{
42+
Output: func(stdout string, info string, t *testing.T) {
43+
containerID = strings.TrimPrefix(stdout, "containerd://")
44+
},
45+
})
46+
data.Set("containerID", containerID)
8247
}
8348

84-
tearDown := func() {
85-
testutil.KubectlHelper(base, "delete", "pod", "--all").Run()
49+
testCase.Cleanup = func(data test.Data, helpers test.Helpers) {
50+
nerdtest.KubeCtlCommand(helpers, "delete", "pod", "--all").Run(nil)
8651
}
8752

88-
tearDown()
89-
t.Cleanup(tearDown)
90-
setup()
53+
testCase.Command = func(data test.Data, helpers test.Helpers) test.TestableCommand {
54+
helpers.Ensure("commit", data.Get("containerID"), "testcommitsave")
55+
return helpers.Command("save", "testcommitsave")
56+
}
9157

92-
t.Run("test commit / push on Kube (https://github.com/containerd/nerdctl/issues/827)", func(t *testing.T) {
93-
base.Cmd("commit", containerID, "testcommitsave").AssertOK()
94-
base.Cmd("save", "testcommitsave").AssertOK()
95-
})
58+
testCase.Expected = test.Expects(0, nil, nil)
59+
60+
testCase.Run(t)
61+
62+
// This below is missing configuration to allow for plain http communication
63+
// This is left here for future work to successfully start a registry usable in the cluster
64+
/*
65+
// Start a registry
66+
nerdtest.KubeCtlCommand(helpers, "run", "--port", "5000", "--image", testutil.RegistryImageStable, "testregistry").
67+
Run(&test.Expected{})
68+
69+
nerdtest.KubeCtlCommand(helpers, "wait", "pod", "testregistry", "--for=condition=ready", "--timeout=1m").
70+
AssertOK()
71+
72+
cmd = nerdtest.KubeCtlCommand(helpers, "get", "pods", tID, "-o", "jsonpath={ .status.hostIPs[0].ip }")
73+
cmd.Run(&test.Expected{
74+
Output: func(stdout string, info string, t *testing.T) {
75+
registryIP = stdout
76+
},
77+
})
78+
79+
cmd = nerdtest.KubeCtlCommand(helpers, "apply", "-f", "-", fmt.Sprintf(`apiVersion: v1
80+
kind: ConfigMap
81+
metadata:
82+
name: local-registry
83+
namespace: nerdctl-test
84+
data:
85+
localRegistryHosting.v1: |
86+
host: "%s:5000"
87+
help: "https://kind.sigs.k8s.io/docs/user/local-registry/"
88+
`, registryIP))
89+
*/
9690
}

cmd/nerdctl/container/container_commit_test.go

+53-28
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,64 @@
1717
package container
1818

1919
import (
20-
"fmt"
2120
"testing"
2221

2322
"github.com/containerd/nerdctl/v2/pkg/testutil"
23+
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest"
24+
"github.com/containerd/nerdctl/v2/pkg/testutil/test"
2425
)
2526

2627
func TestCommit(t *testing.T) {
27-
t.Parallel()
28-
base := testutil.NewBase(t)
29-
switch base.Info().CgroupDriver {
30-
case "none", "":
31-
t.Skip("requires cgroup (for pausing)")
32-
}
33-
testContainer := testutil.Identifier(t)
34-
testImage := testutil.Identifier(t) + "-img"
35-
defer base.Cmd("rm", "-f", testContainer).Run()
36-
defer base.Cmd("rmi", testImage).Run()
37-
38-
for _, pause := range []string{
39-
"true",
40-
"false",
41-
} {
42-
base.Cmd("run", "-d", "--name", testContainer, testutil.CommonImage, "sleep", "infinity").AssertOK()
43-
base.EnsureContainerStarted(testContainer)
44-
base.Cmd("exec", testContainer, "sh", "-euxc", `echo hello-test-commit > /foo`).AssertOK()
45-
base.Cmd(
46-
"commit",
47-
"-c", `CMD ["/foo"]`,
48-
"-c", `ENTRYPOINT ["cat"]`,
49-
fmt.Sprintf("--pause=%s", pause),
50-
testContainer, testImage).AssertOK()
51-
base.Cmd("run", "--rm", testImage).AssertOutExactly("hello-test-commit\n")
52-
base.Cmd("rm", "-f", testContainer).Run()
53-
base.Cmd("rmi", testImage).Run()
28+
testCase := nerdtest.Setup()
29+
30+
testCase.SubTests = []*test.Case{
31+
{
32+
Description: "with pause",
33+
Require: nerdtest.CGroup,
34+
Cleanup: func(data test.Data, helpers test.Helpers) {
35+
helpers.Anyhow("rm", "-f", data.Identifier())
36+
helpers.Anyhow("rmi", "-f", data.Identifier())
37+
},
38+
Setup: func(data test.Data, helpers test.Helpers) {
39+
helpers.Ensure("run", "-d", "--name", data.Identifier(), testutil.CommonImage, "sleep", "infinity")
40+
nerdtest.EnsureContainerStarted(helpers, data.Identifier())
41+
helpers.Ensure("exec", data.Identifier(), "sh", "-euxc", `echo hello-test-commit > /foo`)
42+
},
43+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
44+
helpers.Ensure(
45+
"commit",
46+
"-c", `CMD ["/foo"]`,
47+
"-c", `ENTRYPOINT ["cat"]`,
48+
"--pause=true",
49+
data.Identifier(), data.Identifier())
50+
return helpers.Command("run", "--rm", data.Identifier())
51+
},
52+
Expected: test.Expects(0, nil, test.Equals("hello-test-commit\n")),
53+
},
54+
{
55+
Description: "no pause",
56+
Require: test.Not(test.Windows),
57+
Cleanup: func(data test.Data, helpers test.Helpers) {
58+
helpers.Anyhow("rm", "-f", data.Identifier())
59+
helpers.Anyhow("rmi", "-f", data.Identifier())
60+
},
61+
Setup: func(data test.Data, helpers test.Helpers) {
62+
helpers.Ensure("run", "-d", "--name", data.Identifier(), testutil.CommonImage, "sleep", "infinity")
63+
nerdtest.EnsureContainerStarted(helpers, data.Identifier())
64+
helpers.Ensure("exec", data.Identifier(), "sh", "-euxc", `echo hello-test-commit > /foo`)
65+
},
66+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
67+
helpers.Ensure(
68+
"commit",
69+
"-c", `CMD ["/foo"]`,
70+
"-c", `ENTRYPOINT ["cat"]`,
71+
"--pause=false",
72+
data.Identifier(), data.Identifier())
73+
return helpers.Command("run", "--rm", data.Identifier())
74+
},
75+
Expected: test.Expects(0, nil, test.Equals("hello-test-commit\n")),
76+
},
5477
}
78+
79+
testCase.Run(t)
5580
}

cmd/nerdctl/issues/issues_linux_test.go

+13-12
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,24 @@ import (
2424

2525
"github.com/containerd/nerdctl/v2/pkg/testutil"
2626
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest"
27+
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest/registry"
2728
"github.com/containerd/nerdctl/v2/pkg/testutil/test"
28-
"github.com/containerd/nerdctl/v2/pkg/testutil/testregistry"
2929
)
3030

3131
func TestIssue3425(t *testing.T) {
3232
nerdtest.Setup()
3333

34-
var registry *testregistry.RegistryServer
34+
var reg *registry.Server
3535

3636
testCase := &test.Case{
37+
Require: nerdtest.Registry,
3738
Setup: func(data test.Data, helpers test.Helpers) {
38-
base := testutil.NewBase(t)
39-
registry = testregistry.NewWithNoAuth(base, 0, false)
39+
reg = nerdtest.RegistryWithNoAuth(data, helpers, 0, false)
40+
reg.Setup(data, helpers)
4041
},
4142
Cleanup: func(data test.Data, helpers test.Helpers) {
42-
if registry != nil {
43-
registry.Cleanup(nil)
43+
if reg != nil {
44+
reg.Cleanup(data, helpers)
4445
}
4546
},
4647
SubTests: []*test.Case{
@@ -52,14 +53,14 @@ func TestIssue3425(t *testing.T) {
5253
helpers.Ensure("run", "-d", "--name", data.Identifier(), testutil.CommonImage)
5354
helpers.Ensure("image", "rm", "-f", testutil.CommonImage)
5455
helpers.Ensure("image", "pull", testutil.CommonImage)
55-
helpers.Ensure("tag", testutil.CommonImage, fmt.Sprintf("localhost:%d/%s", registry.Port, data.Identifier()))
56+
helpers.Ensure("tag", testutil.CommonImage, fmt.Sprintf("localhost:%d/%s", reg.Port, data.Identifier()))
5657
},
5758
Cleanup: func(data test.Data, helpers test.Helpers) {
5859
helpers.Anyhow("rm", "-f", data.Identifier())
59-
helpers.Anyhow("rmi", "-f", fmt.Sprintf("localhost:%d/%s", registry.Port, data.Identifier()))
60+
helpers.Anyhow("rmi", "-f", fmt.Sprintf("localhost:%d/%s", reg.Port, data.Identifier()))
6061
},
6162
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
62-
return helpers.Command("push", fmt.Sprintf("localhost:%d/%s", registry.Port, data.Identifier()))
63+
return helpers.Command("push", fmt.Sprintf("localhost:%d/%s", reg.Port, data.Identifier()))
6364
},
6465
Expected: test.Expects(0, nil, nil),
6566
},
@@ -71,14 +72,14 @@ func TestIssue3425(t *testing.T) {
7172
helpers.Ensure("run", "-d", "--name", data.Identifier(), testutil.CommonImage, "touch", "/something")
7273
helpers.Ensure("image", "rm", "-f", testutil.CommonImage)
7374
helpers.Ensure("image", "pull", testutil.CommonImage)
74-
helpers.Ensure("commit", data.Identifier(), fmt.Sprintf("localhost:%d/%s", registry.Port, data.Identifier()))
75+
helpers.Ensure("commit", data.Identifier(), fmt.Sprintf("localhost:%d/%s", reg.Port, data.Identifier()))
7576
},
7677
Cleanup: func(data test.Data, helpers test.Helpers) {
7778
helpers.Anyhow("rm", "-f", data.Identifier())
78-
helpers.Anyhow("rmi", "-f", fmt.Sprintf("localhost:%d/%s", registry.Port, data.Identifier()))
79+
helpers.Anyhow("rmi", "-f", fmt.Sprintf("localhost:%d/%s", reg.Port, data.Identifier()))
7980
},
8081
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
81-
return helpers.Command("push", fmt.Sprintf("localhost:%d/%s", registry.Port, data.Identifier()))
82+
return helpers.Command("push", fmt.Sprintf("localhost:%d/%s", reg.Port, data.Identifier()))
8283
},
8384
Expected: test.Expects(0, nil, nil),
8485
},

cmd/nerdctl/login/login_linux_test.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131

3232
"github.com/containerd/nerdctl/v2/pkg/imgutil/dockerconfigresolver"
3333
"github.com/containerd/nerdctl/v2/pkg/testutil"
34+
"github.com/containerd/nerdctl/v2/pkg/testutil/test"
3435
"github.com/containerd/nerdctl/v2/pkg/testutil/testca"
3536
"github.com/containerd/nerdctl/v2/pkg/testutil/testregistry"
3637
)
@@ -108,8 +109,8 @@ func TestLoginPersistence(t *testing.T) {
108109
t.Run(fmt.Sprintf("Server %s", tc.auth), func(t *testing.T) {
109110
t.Parallel()
110111

111-
username := testregistry.SafeRandomString(30) + "∞"
112-
password := testregistry.SafeRandomString(30) + ":∞"
112+
username := test.RandomStringBase64(30) + "∞"
113+
password := test.RandomStringBase64(30) + ":∞"
113114

114115
// Add the requested authentication
115116
var auth testregistry.Auth
@@ -297,8 +298,8 @@ func TestLoginAgainstVariants(t *testing.T) {
297298
}
298299

299300
// Generate credentials that are specific to each registry, so that we never cross hit another one
300-
username := testregistry.SafeRandomString(30) + "∞"
301-
password := testregistry.SafeRandomString(30) + ":∞"
301+
username := test.RandomStringBase64(30) + "∞"
302+
password := test.RandomStringBase64(30) + ":∞"
302303

303304
// Get a CA if we want TLS
304305
var ca *testca.CA

pkg/testutil/nerdtest/requirements.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,13 @@ var OnlyIPv6 = &test.Requirement{
6464
var OnlyKubernetes = &test.Requirement{
6565
Check: func(data test.Data, helpers test.Helpers) (ret bool, mess string) {
6666
helpers.Write(kubernetes, only)
67+
if _, err := exec.LookPath("kubectl"); err != nil {
68+
return false, fmt.Sprintf("kubectl is not in the path: %+v", err)
69+
}
6770
ret = environmentHasKubernetes()
68-
if !ret {
71+
if ret {
72+
helpers.Write(Namespace, "k8s.io")
73+
} else {
6974
mess = "runner skips Kubernetes compatible tests in the non-Kubernetes environment"
7075
}
7176
return ret, mess

pkg/testutil/nerdtest/third-party.go

+8
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ func BuildCtlCommand(helpers test.Helpers, args ...string) test.TestableCommand
3535
return cmd
3636
}
3737

38+
func KubeCtlCommand(helpers test.Helpers, args ...string) test.TestableCommand {
39+
kubectl, _ := exec.LookPath("kubectl")
40+
cmd := helpers.Custom(kubectl)
41+
cmd.WithArgs("--namespace=nerdctl-test-k8s")
42+
cmd.WithArgs(args...)
43+
return cmd
44+
}
45+
3846
func RegistryWithTokenAuth(data test.Data, helpers test.Helpers, user, pass string, port int, tls bool) (*registry.Server, *registry.TokenAuthServer) {
3947
rca := ca.New(data, helpers.T())
4048
as := registry.NewCesantaAuthServer(data, helpers, rca, 0, user, pass, tls)

0 commit comments

Comments
 (0)