From 655171c78cb5e6c43bd15447379d0a8b1aaebbfb Mon Sep 17 00:00:00 2001 From: apostasie Date: Sun, 23 Feb 2025 17:53:59 -0800 Subject: [PATCH] Remove unbuffer from container tests Signed-off-by: apostasie --- .../container/container_exec_linux_test.go | 65 ++++++++-- cmd/nerdctl/container/container_logs_test.go | 119 +++++++++++------- .../container/container_run_linux_test.go | 68 +++++++--- 3 files changed, 176 insertions(+), 76 deletions(-) diff --git a/cmd/nerdctl/container/container_exec_linux_test.go b/cmd/nerdctl/container/container_exec_linux_test.go index 2d8cc8a09ee..917c8cc563d 100644 --- a/cmd/nerdctl/container/container_exec_linux_test.go +++ b/cmd/nerdctl/container/container_exec_linux_test.go @@ -21,6 +21,7 @@ import ( "github.com/containerd/nerdctl/v2/pkg/testutil" "github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest" + "github.com/containerd/nerdctl/v2/pkg/testutil/test" ) func TestExecWithUser(t *testing.T) { @@ -52,19 +53,57 @@ func TestExecWithUser(t *testing.T) { } func TestExecTTY(t *testing.T) { - t.Parallel() - base := testutil.NewBase(t) + const sttyPartialOutput = "speed 38400 baud" - testContainer := testutil.Identifier(t) - defer base.Cmd("rm", "-f", testContainer).Run() - base.Cmd("run", "-d", "--name", testContainer, testutil.CommonImage, "sleep", nerdtest.Infinity).AssertOK() + testCase := nerdtest.Setup() - const sttyPartialOutput = "speed 38400 baud" - // unbuffer(1) emulates tty, which is required by `nerdctl run -t`. - // unbuffer(1) can be installed with `apt-get install expect`. - unbuffer := []string{"unbuffer"} - base.CmdWithHelper(unbuffer, "exec", "-it", testContainer, "stty").AssertOutContains(sttyPartialOutput) - base.CmdWithHelper(unbuffer, "exec", "-t", testContainer, "stty").AssertOutContains(sttyPartialOutput) - base.Cmd("exec", "-i", testContainer, "stty").AssertFail() - base.Cmd("exec", testContainer, "stty").AssertFail() + testCase.Cleanup = func(data test.Data, helpers test.Helpers) { + helpers.Ensure("rm", "-f", data.Identifier()) + } + + testCase.Setup = func(data test.Data, helpers test.Helpers) { + helpers.Ensure("run", "-d", "--name", data.Identifier(), testutil.CommonImage, "sleep", nerdtest.Infinity) + data.Set("container_name", data.Identifier()) + } + + testCase.SubTests = []*test.Case{ + { + Description: "stty with -it", + Command: func(data test.Data, helpers test.Helpers) test.TestableCommand { + cmd := helpers.Command("exec", "-it", data.Get("container_name"), "stty") + cmd.WithPseudoTTY() + return cmd + }, + Expected: test.Expects(0, nil, test.Contains(sttyPartialOutput)), + }, + { + Description: "stty with -t", + Command: func(data test.Data, helpers test.Helpers) test.TestableCommand { + cmd := helpers.Command("exec", "-t", data.Get("container_name"), "stty") + cmd.WithPseudoTTY() + return cmd + }, + Expected: test.Expects(0, nil, test.Contains(sttyPartialOutput)), + }, + { + Description: "stty with -i", + Command: func(data test.Data, helpers test.Helpers) test.TestableCommand { + cmd := helpers.Command("exec", "-i", data.Get("container_name"), "stty") + cmd.WithPseudoTTY() + return cmd + }, + Expected: test.Expects(test.ExitCodeGenericFail, nil, nil), + }, + { + Description: "stty without params", + Command: func(data test.Data, helpers test.Helpers) test.TestableCommand { + cmd := helpers.Command("exec", data.Get("container_name"), "stty") + cmd.WithPseudoTTY() + return cmd + }, + Expected: test.Expects(test.ExitCodeGenericFail, nil, nil), + }, + } + + testCase.Run(t) } diff --git a/cmd/nerdctl/container/container_logs_test.go b/cmd/nerdctl/container/container_logs_test.go index e1ed851fa7d..b15fc4c00cb 100644 --- a/cmd/nerdctl/container/container_logs_test.go +++ b/cmd/nerdctl/container/container_logs_test.go @@ -28,6 +28,8 @@ import ( "gotest.tools/v3/icmd" "github.com/containerd/nerdctl/v2/pkg/testutil" + "github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest" + "github.com/containerd/nerdctl/v2/pkg/testutil/test" ) func TestLogs(t *testing.T) { @@ -160,65 +162,86 @@ func TestLogsWithFailingContainer(t *testing.T) { } func TestLogsWithForegroundContainers(t *testing.T) { - t.Parallel() - if runtime.GOOS == "windows" { - t.Skip("dual logging is not supported on Windows") - } - base := testutil.NewBase(t) - tid := testutil.Identifier(t) + testCase := nerdtest.Setup() + // dual logging is not supported on Windows + testCase.Require = test.Not(test.Windows) - // unbuffer(1) emulates tty, which is required by `nerdctl run -t`. - // unbuffer(1) can be installed with `apt-get install expect`. - unbuffer := []string{"unbuffer"} + testCase.Run(t) - testCases := []struct { - name string - flags []string - tty bool - }{ + testCase.SubTests = []*test.Case{ { - name: "foreground", - flags: nil, - tty: false, + Description: "foreground", + Cleanup: func(data test.Data, helpers test.Helpers) { + helpers.Anyhow("rm", "-f", data.Identifier()) + }, + Setup: func(data test.Data, helpers test.Helpers) { + helpers.Ensure("run", "--name", data.Identifier(), testutil.CommonImage, "sh", "-euxc", "echo foo; echo bar") + }, + Command: func(data test.Data, helpers test.Helpers) test.TestableCommand { + return helpers.Command("logs", data.Identifier()) + }, + Expected: test.Expects(0, nil, test.All( + test.Contains("foo"), + test.Contains("bar"), + test.DoesNotContain("baz"), + )), }, { - name: "interactive", - flags: []string{"-i"}, - tty: false, + Description: "interactive", + Cleanup: func(data test.Data, helpers test.Helpers) { + helpers.Anyhow("rm", "-f", data.Identifier()) + }, + Setup: func(data test.Data, helpers test.Helpers) { + helpers.Ensure("run", "-i", "--name", data.Identifier(), testutil.CommonImage, "sh", "-euxc", "echo foo; echo bar") + }, + Command: func(data test.Data, helpers test.Helpers) test.TestableCommand { + return helpers.Command("logs", data.Identifier()) + }, + Expected: test.Expects(0, nil, test.All( + test.Contains("foo"), + test.Contains("bar"), + test.DoesNotContain("baz"), + )), }, { - name: "PTY", - flags: []string{"-t"}, - tty: true, + Description: "PTY", + Cleanup: func(data test.Data, helpers test.Helpers) { + helpers.Anyhow("rm", "-f", data.Identifier()) + }, + Setup: func(data test.Data, helpers test.Helpers) { + cmd := helpers.Command("run", "-t", "--name", data.Identifier(), testutil.CommonImage, "sh", "-euxc", "echo foo; echo bar") + cmd.WithPseudoTTY() + cmd.Run(&test.Expected{ExitCode: 0}) + }, + Command: func(data test.Data, helpers test.Helpers) test.TestableCommand { + return helpers.Command("logs", data.Identifier()) + }, + Expected: test.Expects(0, nil, test.All( + test.Contains("foo"), + test.Contains("bar"), + test.DoesNotContain("baz"), + )), }, { - name: "interactivePTY", - flags: []string{"-i", "-t"}, - tty: true, + Description: "interactivePTY", + Cleanup: func(data test.Data, helpers test.Helpers) { + helpers.Anyhow("rm", "-f", data.Identifier()) + }, + Setup: func(data test.Data, helpers test.Helpers) { + cmd := helpers.Command("run", "-i", "-t", "--name", data.Identifier(), testutil.CommonImage, "sh", "-euxc", "echo foo; echo bar") + cmd.WithPseudoTTY() + cmd.Run(&test.Expected{ExitCode: 0}) + }, + Command: func(data test.Data, helpers test.Helpers) test.TestableCommand { + return helpers.Command("logs", data.Identifier()) + }, + Expected: test.Expects(0, nil, test.All( + test.Contains("foo"), + test.Contains("bar"), + test.DoesNotContain("baz"), + )), }, } - - for _, tc := range testCases { - tc := tc - func(t *testing.T) { - containerName := tid + "-" + tc.name - var cmdArgs []string - defer base.Cmd("rm", "-f", containerName).Run() - cmdArgs = append(cmdArgs, "run", "--name", containerName) - cmdArgs = append(cmdArgs, tc.flags...) - cmdArgs = append(cmdArgs, testutil.CommonImage, "sh", "-euxc", "echo foo; echo bar") - - if tc.tty { - base.CmdWithHelper(unbuffer, cmdArgs...).AssertOK() - } else { - base.Cmd(cmdArgs...).AssertOK() - } - - base.Cmd("logs", containerName).AssertOutContains("foo") - base.Cmd("logs", containerName).AssertOutContains("bar") - base.Cmd("logs", containerName).AssertOutNotContains("baz") - }(t) - } } func TestTailFollowRotateLogs(t *testing.T) { diff --git a/cmd/nerdctl/container/container_run_linux_test.go b/cmd/nerdctl/container/container_run_linux_test.go index ec58351af7f..5d5047d542d 100644 --- a/cmd/nerdctl/container/container_run_linux_test.go +++ b/cmd/nerdctl/container/container_run_linux_test.go @@ -33,7 +33,6 @@ import ( "time" "gotest.tools/v3/assert" - "gotest.tools/v3/icmd" "github.com/containerd/nerdctl/v2/cmd/nerdctl/helpers" "github.com/containerd/nerdctl/v2/pkg/rootlessutil" @@ -311,21 +310,60 @@ func TestRunWithInit(t *testing.T) { } func TestRunTTY(t *testing.T) { - t.Parallel() - base := testutil.NewBase(t) - const sttyPartialOutput = "speed 38400 baud" - // unbuffer(1) emulates tty, which is required by `nerdctl run -t`. - // unbuffer(1) can be installed with `apt-get install expect`. - unbuffer := []string{"unbuffer"} - base.CmdWithHelper(unbuffer, "run", "--rm", "-it", testutil.CommonImage, "stty").AssertOutContains(sttyPartialOutput) - base.CmdWithHelper(unbuffer, "run", "--rm", "-t", testutil.CommonImage, "stty").AssertOutContains(sttyPartialOutput) - base.Cmd("run", "--rm", "-i", testutil.CommonImage, "stty").AssertFail() - base.Cmd("run", "--rm", testutil.CommonImage, "stty").AssertFail() - - // tests pipe works - res := icmd.RunCmd(icmd.Command("unbuffer", "/bin/sh", "-c", fmt.Sprintf("%q run --rm -it %q echo hi | grep hi", base.Binary, testutil.CommonImage))) - assert.Equal(t, 0, res.ExitCode, res) + + testCase := nerdtest.Setup() + + testCase.SubTests = []*test.Case{ + { + Description: "stty with -it", + Cleanup: func(data test.Data, helpers test.Helpers) { + helpers.Ensure("rm", "-f", data.Identifier()) + }, + Command: func(data test.Data, helpers test.Helpers) test.TestableCommand { + cmd := helpers.Command("run", "-it", data.Identifier(), "stty") + cmd.WithPseudoTTY() + return cmd + }, + Expected: test.Expects(0, nil, test.Contains(sttyPartialOutput)), + }, + { + Description: "stty with -t", + Cleanup: func(data test.Data, helpers test.Helpers) { + helpers.Ensure("rm", "-f", data.Identifier()) + }, + Command: func(data test.Data, helpers test.Helpers) test.TestableCommand { + cmd := helpers.Command("run", "-t", data.Identifier(), "stty") + cmd.WithPseudoTTY() + return cmd + }, + Expected: test.Expects(0, nil, test.Contains(sttyPartialOutput)), + }, + { + Description: "stty with -i", + Cleanup: func(data test.Data, helpers test.Helpers) { + helpers.Ensure("rm", "-f", data.Identifier()) + }, + Command: func(data test.Data, helpers test.Helpers) test.TestableCommand { + cmd := helpers.Command("run", "-i", data.Identifier(), "stty") + cmd.WithPseudoTTY() + return cmd + }, + Expected: test.Expects(test.ExitCodeGenericFail, nil, nil), + }, + { + Description: "stty without params", + Cleanup: func(data test.Data, helpers test.Helpers) { + helpers.Ensure("rm", "-f", data.Identifier()) + }, + Command: func(data test.Data, helpers test.Helpers) test.TestableCommand { + cmd := helpers.Command("run", data.Identifier(), "stty") + cmd.WithPseudoTTY() + return cmd + }, + Expected: test.Expects(test.ExitCodeGenericFail, nil, nil), + }, + } } func runSigProxy(t *testing.T, args ...string) (string, bool, bool) {