Skip to content

Commit 57497ca

Browse files
committed
Migrate container tests
Signed-off-by: apostasie <[email protected]>
1 parent 0953eba commit 57497ca

17 files changed

+812
-519
lines changed

cmd/nerdctl/container/container_attach_linux_test.go

Lines changed: 88 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -24,81 +24,99 @@ import (
2424
"gotest.tools/v3/assert"
2525

2626
"github.com/containerd/nerdctl/v2/pkg/testutil"
27+
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest"
28+
"github.com/containerd/nerdctl/v2/pkg/testutil/test"
2729
)
2830

29-
// skipAttachForDocker should be called by attach-related tests that assert 'read detach keys' in stdout.
30-
func skipAttachForDocker(t *testing.T) {
31-
t.Helper()
32-
if testutil.GetTarget() == testutil.Docker {
33-
t.Skip("When detaching from a container, for a session started with 'docker attach'" +
34-
", it prints 'read escape sequence', but for one started with 'docker (run|start)', it prints nothing." +
35-
" However, the flag is called '--detach-keys' in all cases" +
36-
", so nerdctl prints 'read detach keys' for all cases" +
37-
", and that's why this test is skipped for Docker.")
38-
}
39-
}
40-
41-
// prepareContainerToAttach spins up a container (entrypoint = shell) with `-it` and detaches from it
42-
// so that it can be re-attached to later.
43-
func prepareContainerToAttach(base *testutil.Base, containerName string) {
44-
opts := []func(*testutil.Cmd){
45-
testutil.WithStdin(testutil.NewDelayOnceReader(bytes.NewReader(
31+
func TestAttachDetachKeys(t *testing.T) {
32+
testCase := nerdtest.Setup()
33+
34+
setup := func(data test.Data, helpers test.Helpers) {
35+
// unbuffer(1) emulates tty, which is required by `nerdctl run -t`.
36+
// unbuffer(1) can be installed with `apt-get install expect`.
37+
//
38+
// "-p" is needed because we need unbuffer to read from stdin, and from [1]:
39+
// "Normally, unbuffer does not read from stdin. This simplifies use of unbuffer in some situations.
40+
// To use unbuffer in a pipeline, use the -p flag."
41+
//
42+
// [1] https://linux.die.net/man/1/unbuffer
43+
44+
si := testutil.NewDelayOnceReader(bytes.NewReader(
4645
[]byte{16, 17}, // ctrl+p,ctrl+q, see https://www.physics.udel.edu/~watson/scen103/ascii.html
47-
))),
46+
))
47+
48+
cmd := helpers.
49+
Command("run", "-it", "--name", data.Identifier(), testutil.CommonImage)
50+
cmd.WithWrapper("unbuffer", "-p")
51+
cmd.WithStdin(si)
52+
cmd.Run(&test.Expected{
53+
Output: test.All(
54+
// NOTE:
55+
// When detaching from a container, for a session started with 'docker attach',
56+
// it prints 'read escape sequence', but for one started with 'docker (run|start)', it prints nothing.
57+
// However, the flag is called '--detach-keys' in all cases, and nerdctl does print read detach keys
58+
// in all cases.
59+
// Disabling the contains test here allow both cli to run the test.
60+
// test.Contains("read detach keys"),
61+
func(stdout string, info string, t *testing.T) {
62+
container := nerdtest.InspectContainer(helpers, data.Identifier())
63+
assert.Equal(t, container.State.Running, true, info)
64+
}),
65+
})
4866
}
49-
// unbuffer(1) emulates tty, which is required by `nerdctl run -t`.
50-
// unbuffer(1) can be installed with `apt-get install expect`.
51-
//
52-
// "-p" is needed because we need unbuffer to read from stdin, and from [1]:
53-
// "Normally, unbuffer does not read from stdin. This simplifies use of unbuffer in some situations.
54-
// To use unbuffer in a pipeline, use the -p flag."
55-
//
56-
// [1] https://linux.die.net/man/1/unbuffer
57-
base.CmdWithHelper([]string{"unbuffer", "-p"}, "run", "-it", "--name", containerName, testutil.CommonImage).
58-
CmdOption(opts...).AssertOutContains("read detach keys")
59-
container := base.InspectContainer(containerName)
60-
assert.Equal(base.T, container.State.Running, true)
61-
}
62-
63-
func TestAttach(t *testing.T) {
64-
t.Parallel()
65-
66-
skipAttachForDocker(t)
67-
68-
base := testutil.NewBase(t)
69-
containerName := testutil.Identifier(t)
7067

71-
defer base.Cmd("container", "rm", "-f", containerName).AssertOK()
72-
prepareContainerToAttach(base, containerName)
73-
74-
opts := []func(*testutil.Cmd){
75-
testutil.WithStdin(testutil.NewDelayOnceReader(strings.NewReader("expr 1 + 1\nexit\n"))),
68+
testCase.SubTests = []*test.Case{
69+
{
70+
Description: "TestAttachDefaultKeys",
71+
Require: test.Binary("unbuffer"),
72+
Cleanup: func(data test.Data, helpers test.Helpers) {
73+
helpers.Anyhow("container", "rm", "-f", data.Identifier())
74+
},
75+
Setup: setup,
76+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
77+
si := testutil.NewDelayOnceReader(strings.NewReader("expr 1 + 1\nexit\n"))
78+
// `unbuffer -p` returns 0 even if the underlying nerdctl process returns a non-zero exit code,
79+
// so the exit code cannot be easily tested here.
80+
cmd := helpers.Command("attach", data.Identifier())
81+
cmd.WithStdin(si)
82+
cmd.WithWrapper("unbuffer", "-p")
83+
84+
return cmd
85+
},
86+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
87+
return &test.Expected{
88+
Output: func(stdout string, info string, t *testing.T) {
89+
container := nerdtest.InspectContainer(helpers, data.Identifier())
90+
assert.Equal(t, container.State.Running, false, info)
91+
},
92+
}
93+
},
94+
},
95+
{
96+
Description: "TestAttachCustomKeys",
97+
Require: test.Binary("unbuffer"),
98+
Cleanup: func(data test.Data, helpers test.Helpers) {
99+
helpers.Anyhow("container", "rm", "-f", data.Identifier())
100+
},
101+
Setup: setup,
102+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
103+
si := testutil.NewDelayOnceReader(bytes.NewReader([]byte{1, 2}))
104+
cmd := helpers.
105+
Command("attach", "--detach-keys=ctrl-a,ctrl-b", data.Identifier())
106+
cmd.WithStdin(si)
107+
cmd.WithWrapper("unbuffer", "-p")
108+
return cmd
109+
},
110+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
111+
return &test.Expected{
112+
Output: func(stdout string, info string, t *testing.T) {
113+
container := nerdtest.InspectContainer(helpers, data.Identifier())
114+
assert.Equal(t, container.State.Running, true, info)
115+
},
116+
}
117+
},
118+
},
76119
}
77-
// `unbuffer -p` returns 0 even if the underlying nerdctl process returns a non-zero exit code,
78-
// so the exit code cannot be easily tested here.
79-
base.CmdWithHelper([]string{"unbuffer", "-p"}, "attach", containerName).CmdOption(opts...).AssertOutContains("2")
80-
container := base.InspectContainer(containerName)
81-
assert.Equal(base.T, container.State.Running, false)
82-
}
83-
84-
func TestAttachDetachKeys(t *testing.T) {
85-
t.Parallel()
86120

87-
skipAttachForDocker(t)
88-
89-
base := testutil.NewBase(t)
90-
containerName := testutil.Identifier(t)
91-
92-
defer base.Cmd("container", "rm", "-f", containerName).AssertOK()
93-
prepareContainerToAttach(base, containerName)
94-
95-
opts := []func(*testutil.Cmd){
96-
testutil.WithStdin(testutil.NewDelayOnceReader(bytes.NewReader(
97-
[]byte{1, 2}, // https://www.physics.udel.edu/~watson/scen103/ascii.html
98-
))),
99-
}
100-
base.CmdWithHelper([]string{"unbuffer", "-p"}, "attach", "--detach-keys=ctrl-a,ctrl-b", containerName).
101-
CmdOption(opts...).AssertOutContains("read detach keys")
102-
container := base.InspectContainer(containerName)
103-
assert.Equal(base.T, container.State.Running, true)
121+
testCase.Run(t)
104122
}

cmd/nerdctl/container/container_commit_test.go

Lines changed: 52 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,63 @@
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", 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+
Cleanup: func(data test.Data, helpers test.Helpers) {
57+
helpers.Anyhow("rm", "-f", data.Identifier())
58+
helpers.Anyhow("rmi", data.Identifier())
59+
},
60+
Setup: func(data test.Data, helpers test.Helpers) {
61+
helpers.Ensure("run", "-d", "--name", data.Identifier(), testutil.CommonImage, "sleep", "infinity")
62+
nerdtest.EnsureContainerStarted(helpers, data.Identifier())
63+
helpers.Ensure("exec", data.Identifier(), "sh", "-euxc", `echo hello-test-commit > /foo`)
64+
},
65+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
66+
helpers.Ensure(
67+
"commit",
68+
"-c", `CMD ["/foo"]`,
69+
"-c", `ENTRYPOINT ["cat"]`,
70+
"--pause=false",
71+
data.Identifier(), data.Identifier())
72+
return helpers.Command("run", "--rm", data.Identifier())
73+
},
74+
Expected: test.Expects(0, nil, test.Equals("hello-test-commit\n")),
75+
},
5476
}
77+
78+
testCase.Run(t)
5579
}

0 commit comments

Comments
 (0)