From c9fd1a38f0da276c4573776e4b3c5d85ddc94f7b Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Wed, 8 Apr 2026 11:43:55 -0700 Subject: [PATCH 1/5] libct/int: waitProcess: rm dead code Since Wait returns an ExitError if process' exit status is not 0, checking process status is redundant and this code is never reached. Remove it. Signed-off-by: Kir Kolyshkin (cherry picked from commit dd9fda7d6050f89cb136886eadcebeb816957d10) Signed-off-by: Kir Kolyshkin --- libcontainer/integration/utils_test.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/libcontainer/integration/utils_test.go b/libcontainer/integration/utils_test.go index 8fb8f8663..e30630953 100644 --- a/libcontainer/integration/utils_test.go +++ b/libcontainer/integration/utils_test.go @@ -88,14 +88,10 @@ func ok(t testing.TB, err error) { func waitProcess(p *libcontainer.Process, t testing.TB) { t.Helper() - status, err := p.Wait() + _, err := p.Wait() if err != nil { t.Fatalf("unexpected error: %v", err) } - - if !status.Success() { - t.Fatalf("unexpected status: %v", status) - } } // newRootfs creates a new tmp directory and copies the busybox root From f3e4f8ece99af983a97924989c2107ec2b3369c6 Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Wed, 8 Apr 2026 15:21:06 -0700 Subject: [PATCH 2/5] libct/int: show stderr if command failed When running a process inside a container, make sure its stderr is not nil (except for some trivial cases like cat). Modify waitProcess to show failed command's stderr, if possible. Signed-off-by: Kir Kolyshkin (cherry picked from commit bf4fcc300267f5eff5a89a7213aa62ffaa1a02a0) Signed-off-by: Kir Kolyshkin --- libcontainer/integration/exec_test.go | 24 ++++++++++++++++++------ libcontainer/integration/execin_test.go | 3 ++- libcontainer/integration/utils_test.go | 5 ++++- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/libcontainer/integration/exec_test.go b/libcontainer/integration/exec_test.go index 9133b6801..7d931bd21 100644 --- a/libcontainer/integration/exec_test.go +++ b/libcontainer/integration/exec_test.go @@ -171,6 +171,7 @@ func TestEnter(t *testing.T) { Env: standardEnvironment, Stdin: stdinR, Stdout: &stdout, + Stderr: new(strings.Builder), Init: true, } err = container.Run(&pconfig) @@ -184,13 +185,13 @@ func TestEnter(t *testing.T) { stdinR2, stdinW2, err := os.Pipe() ok(t, err) pconfig2 := libcontainer.Process{ - Cwd: "/", - Env: standardEnvironment, + Cwd: "/", + Args: []string{"sh", "-c", "cat && readlink /proc/self/ns/pid"}, + Env: standardEnvironment, + Stdin: stdinR2, + Stdout: &stdout2, + Stderr: new(strings.Builder), } - pconfig2.Args = []string{"sh", "-c", "cat && readlink /proc/self/ns/pid"} - pconfig2.Stdin = stdinR2 - pconfig2.Stdout = &stdout2 - err = container.Run(&pconfig2) _ = stdinR2.Close() defer stdinW2.Close() @@ -253,6 +254,7 @@ func TestProcessEnv(t *testing.T) { }, Stdin: nil, Stdout: &stdout, + Stderr: new(strings.Builder), Init: true, } err = container.Run(&pconfig) @@ -293,6 +295,7 @@ func TestProcessEmptyCaps(t *testing.T) { Env: standardEnvironment, Stdin: nil, Stdout: &stdout, + Stderr: new(strings.Builder), Init: true, } err = container.Run(&pconfig) @@ -336,6 +339,7 @@ func TestProcessCaps(t *testing.T) { Env: standardEnvironment, Stdin: nil, Stdout: &stdout, + Stderr: new(strings.Builder), Capabilities: &configs.Capabilities{}, Init: true, } @@ -396,6 +400,7 @@ func TestAdditionalGroups(t *testing.T) { Env: standardEnvironment, Stdin: nil, Stdout: &stdout, + Stderr: new(strings.Builder), AdditionalGroups: []int{3333, 99999}, Init: true, } @@ -833,6 +838,7 @@ func TestSysctl(t *testing.T) { Env: standardEnvironment, Stdin: nil, Stdout: &stdout, + Stderr: new(strings.Builder), Init: true, } err = container.Run(&pconfig) @@ -942,6 +948,7 @@ func TestOomScoreAdj(t *testing.T) { Env: standardEnvironment, Stdin: nil, Stdout: &stdout, + Stderr: new(strings.Builder), Init: true, } err = container.Run(&pconfig) @@ -1081,6 +1088,7 @@ func TestHook(t *testing.T) { Env: standardEnvironment, Stdin: nil, Stdout: &stdout, + Stderr: new(strings.Builder), Init: true, } err = container.Run(&pconfig) @@ -1196,6 +1204,7 @@ func TestRootfsPropagationSlaveMount(t *testing.T) { Env: standardEnvironment, Stdin: stdinR2, Stdout: &stdout2, + Stderr: new(strings.Builder), } err = container.Run(pconfig2) @@ -1307,6 +1316,7 @@ func TestRootfsPropagationSharedMount(t *testing.T) { Env: standardEnvironment, Stdin: stdinR2, Stdout: &stdout2, + Stderr: new(strings.Builder), Capabilities: &configs.Capabilities{}, } @@ -1490,6 +1500,7 @@ func TestInitJoinPID(t *testing.T) { Args: []string{"ps"}, Env: standardEnvironment, Stdout: buffers.Stdout, + Stderr: new(strings.Builder), } err = container1.Run(ps) ok(t, err) @@ -1622,6 +1633,7 @@ func TestTmpfsCopyUp(t *testing.T) { Env: standardEnvironment, Stdin: nil, Stdout: &stdout, + Stderr: new(strings.Builder), Init: true, } err = container.Run(&pconfig) diff --git a/libcontainer/integration/execin_test.go b/libcontainer/integration/execin_test.go index 2cd1f1375..32cdb1985 100644 --- a/libcontainer/integration/execin_test.go +++ b/libcontainer/integration/execin_test.go @@ -160,6 +160,7 @@ func TestExecInAdditionalGroups(t *testing.T) { Env: standardEnvironment, Stdin: nil, Stdout: &stdout, + Stderr: new(strings.Builder), AdditionalGroups: []int{4444, 87654}, } err = container.Run(&pconfig) @@ -538,7 +539,7 @@ func TestExecInUserns(t *testing.T) { "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", }, Stdout: buffers.Stdout, - Stderr: os.Stderr, + Stderr: new(strings.Builder), } err = container.Run(process2) ok(t, err) diff --git a/libcontainer/integration/utils_test.go b/libcontainer/integration/utils_test.go index e30630953..b9407d2a4 100644 --- a/libcontainer/integration/utils_test.go +++ b/libcontainer/integration/utils_test.go @@ -90,7 +90,10 @@ func waitProcess(p *libcontainer.Process, t testing.TB) { t.Helper() _, err := p.Wait() if err != nil { - t.Fatalf("unexpected error: %v", err) + if stderr, ok := p.Stderr.(fmt.Stringer); ok { + err = fmt.Errorf("%w; stderr:\n%s", err, stderr) + } + t.Fatalf("command failed: %v", err) } } From 87edc29643bf5e0535cd11bf5622e8fa90b45d97 Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Wed, 8 Apr 2026 15:22:44 -0700 Subject: [PATCH 3/5] libct/int: use readlink -v By default, readlink is silent about any errors. Make it verbose so we can better interpret any test failures. Signed-off-by: Kir Kolyshkin (cherry picked from commit 54be90bf68894f0d1e1fb6221d0b3228e85c2cf7) Signed-off-by: Kir Kolyshkin --- libcontainer/integration/exec_test.go | 16 ++++++++-------- libcontainer/integration/execin_test.go | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libcontainer/integration/exec_test.go b/libcontainer/integration/exec_test.go index 7d931bd21..0586dd0e8 100644 --- a/libcontainer/integration/exec_test.go +++ b/libcontainer/integration/exec_test.go @@ -63,7 +63,7 @@ func TestIPCPrivate(t *testing.T) { ok(t, err) config := newTemplateConfig(t, nil) - buffers := runContainerOk(t, config, "readlink", "/proc/self/ns/ipc") + buffers := runContainerOk(t, config, "readlink", "-v", "/proc/self/ns/ipc") if actual := strings.Trim(buffers.Stdout.String(), "\n"); actual == l { t.Fatalf("ipc link should be private to the container but equals host %q %q", actual, l) @@ -80,7 +80,7 @@ func TestIPCHost(t *testing.T) { config := newTemplateConfig(t, nil) config.Namespaces.Remove(configs.NEWIPC) - buffers := runContainerOk(t, config, "readlink", "/proc/self/ns/ipc") + buffers := runContainerOk(t, config, "readlink", "-v", "/proc/self/ns/ipc") if actual := strings.Trim(buffers.Stdout.String(), "\n"); actual != l { t.Fatalf("ipc link not equal to host link %q %q", actual, l) @@ -97,7 +97,7 @@ func TestIPCJoinPath(t *testing.T) { config := newTemplateConfig(t, nil) config.Namespaces.Add(configs.NEWIPC, "/proc/1/ns/ipc") - buffers := runContainerOk(t, config, "readlink", "/proc/self/ns/ipc") + buffers := runContainerOk(t, config, "readlink", "-v", "/proc/self/ns/ipc") if actual := strings.Trim(buffers.Stdout.String(), "\n"); actual != l { t.Fatalf("ipc link not equal to host link %q %q", actual, l) @@ -167,7 +167,7 @@ func TestEnter(t *testing.T) { pconfig := libcontainer.Process{ Cwd: "/", - Args: []string{"sh", "-c", "cat && readlink /proc/self/ns/pid"}, + Args: []string{"sh", "-c", "cat && readlink -v /proc/self/ns/pid"}, Env: standardEnvironment, Stdin: stdinR, Stdout: &stdout, @@ -186,7 +186,7 @@ func TestEnter(t *testing.T) { ok(t, err) pconfig2 := libcontainer.Process{ Cwd: "/", - Args: []string{"sh", "-c", "cat && readlink /proc/self/ns/pid"}, + Args: []string{"sh", "-c", "cat && readlink -v /proc/self/ns/pid"}, Env: standardEnvironment, Stdin: stdinR2, Stdout: &stdout2, @@ -1360,7 +1360,7 @@ func TestPIDHost(t *testing.T) { config := newTemplateConfig(t, nil) config.Namespaces.Remove(configs.NEWPID) - buffers := runContainerOk(t, config, "readlink", "/proc/self/ns/pid") + buffers := runContainerOk(t, config, "readlink", "-v", "/proc/self/ns/pid") if actual := strings.Trim(buffers.Stdout.String(), "\n"); actual != l { t.Fatalf("ipc link not equal to host link %q %q", actual, l) @@ -1663,7 +1663,7 @@ func TestCGROUPPrivate(t *testing.T) { config := newTemplateConfig(t, nil) config.Namespaces.Add(configs.NEWCGROUP, "") - buffers := runContainerOk(t, config, "readlink", "/proc/self/ns/cgroup") + buffers := runContainerOk(t, config, "readlink", "-v", "/proc/self/ns/cgroup") if actual := strings.Trim(buffers.Stdout.String(), "\n"); actual == l { t.Fatalf("cgroup link should be private to the container but equals host %q %q", actual, l) @@ -1682,7 +1682,7 @@ func TestCGROUPHost(t *testing.T) { ok(t, err) config := newTemplateConfig(t, nil) - buffers := runContainerOk(t, config, "readlink", "/proc/self/ns/cgroup") + buffers := runContainerOk(t, config, "readlink", "-v", "/proc/self/ns/cgroup") if actual := strings.Trim(buffers.Stdout.String(), "\n"); actual != l { t.Fatalf("cgroup link not equal to host link %q %q", actual, l) diff --git a/libcontainer/integration/execin_test.go b/libcontainer/integration/execin_test.go index 32cdb1985..414dcf9ea 100644 --- a/libcontainer/integration/execin_test.go +++ b/libcontainer/integration/execin_test.go @@ -534,7 +534,7 @@ func TestExecInUserns(t *testing.T) { buffers := newStdBuffers() process2 := &libcontainer.Process{ Cwd: "/", - Args: []string{"readlink", "/proc/self/ns/user"}, + Args: []string{"readlink", "-v", "/proc/self/ns/user"}, Env: []string{ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", }, From c63f75727c12c0fd80ac07c5318a22c30d76b49a Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Wed, 8 Apr 2026 15:30:58 -0700 Subject: [PATCH 4/5] libct/int: remove buffers.Stdin It is never used. Signed-off-by: Kir Kolyshkin (cherry picked from commit 568a309225fa203662296b7f3fdedac68f35391e) Signed-off-by: Kir Kolyshkin --- libcontainer/integration/bench_test.go | 1 - libcontainer/integration/execin_test.go | 4 ---- libcontainer/integration/seccomp_test.go | 4 ---- libcontainer/integration/utils_test.go | 3 --- 4 files changed, 12 deletions(-) diff --git a/libcontainer/integration/bench_test.go b/libcontainer/integration/bench_test.go index 0375ee7f7..5499ee215 100644 --- a/libcontainer/integration/bench_test.go +++ b/libcontainer/integration/bench_test.go @@ -106,7 +106,6 @@ func BenchmarkExecInBigEnv(b *testing.B) { Cwd: "/", Args: []string{"env"}, Env: env, - Stdin: buffers.Stdin, Stdout: buffers.Stdout, Stderr: buffers.Stderr, } diff --git a/libcontainer/integration/execin_test.go b/libcontainer/integration/execin_test.go index 414dcf9ea..d28166292 100644 --- a/libcontainer/integration/execin_test.go +++ b/libcontainer/integration/execin_test.go @@ -49,7 +49,6 @@ func TestExecIn(t *testing.T) { Cwd: "/", Args: []string{"ps"}, Env: standardEnvironment, - Stdin: buffers.Stdin, Stdout: buffers.Stdout, Stderr: buffers.Stderr, } @@ -107,7 +106,6 @@ func testExecInRlimit(t *testing.T, userns bool) { Cwd: "/", Args: []string{"/bin/sh", "-c", "ulimit -n"}, Env: standardEnvironment, - Stdin: buffers.Stdin, Stdout: buffers.Stdout, Stderr: buffers.Stderr, Rlimits: []configs.Rlimit{ @@ -357,7 +355,6 @@ func TestExecInEnvironment(t *testing.T) { Cwd: "/", Args: []string{"/bin/env"}, Env: execEnv, - Stdin: buffers.Stdin, Stdout: buffers.Stdout, Stderr: buffers.Stderr, } @@ -483,7 +480,6 @@ func TestExecInOomScoreAdj(t *testing.T) { Cwd: "/", Args: []string{"/bin/sh", "-c", "cat /proc/self/oom_score_adj"}, Env: standardEnvironment, - Stdin: buffers.Stdin, Stdout: buffers.Stdout, Stderr: buffers.Stderr, } diff --git a/libcontainer/integration/seccomp_test.go b/libcontainer/integration/seccomp_test.go index 4e8e0912a..7ad040664 100644 --- a/libcontainer/integration/seccomp_test.go +++ b/libcontainer/integration/seccomp_test.go @@ -40,7 +40,6 @@ func TestSeccompDenySyslogWithErrno(t *testing.T) { Cwd: "/", Args: []string{"dmesg"}, Env: standardEnvironment, - Stdin: buffers.Stdin, Stdout: buffers.Stdout, Stderr: buffers.Stderr, Init: true, @@ -88,7 +87,6 @@ func TestSeccompDenySyslog(t *testing.T) { Cwd: "/", Args: []string{"dmesg"}, Env: standardEnvironment, - Stdin: buffers.Stdin, Stdout: buffers.Stdout, Stderr: buffers.Stderr, Init: true, @@ -143,7 +141,6 @@ func TestSeccompPermitWriteConditional(t *testing.T) { Cwd: "/", Args: []string{"busybox", "ls", "/"}, Env: standardEnvironment, - Stdin: buffers.Stdin, Stdout: buffers.Stdout, Stderr: buffers.Stderr, Init: true, @@ -195,7 +192,6 @@ func TestSeccompDenyWriteConditional(t *testing.T) { Cwd: "/", Args: []string{"busybox", "ls", "does_not_exist"}, Env: standardEnvironment, - Stdin: buffers.Stdin, Stdout: buffers.Stdout, Stderr: buffers.Stderr, Init: true, diff --git a/libcontainer/integration/utils_test.go b/libcontainer/integration/utils_test.go index b9407d2a4..346b5b733 100644 --- a/libcontainer/integration/utils_test.go +++ b/libcontainer/integration/utils_test.go @@ -55,14 +55,12 @@ func ptrInt(v int) *int { func newStdBuffers() *stdBuffers { return &stdBuffers{ - Stdin: bytes.NewBuffer(nil), Stdout: bytes.NewBuffer(nil), Stderr: bytes.NewBuffer(nil), } } type stdBuffers struct { - Stdin *bytes.Buffer Stdout *bytes.Buffer Stderr *bytes.Buffer } @@ -187,7 +185,6 @@ func runContainer(t testing.TB, config *configs.Config, args ...string) (buffers Cwd: "/", Args: args, Env: standardEnvironment, - Stdin: buffers.Stdin, Stdout: buffers.Stdout, Stderr: buffers.Stderr, Init: true, From c2092624ede7fec8068ed5361691765ca19a2346 Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Wed, 8 Apr 2026 15:46:27 -0700 Subject: [PATCH 5/5] libct/int: switch from bytes.Buffer to strings.Builder The latter is simpler and provides just enough functionality to be used here. Signed-off-by: Kir Kolyshkin (cherry picked from commit 9970cbfdb6e3af99a8d02fa394fbed8b612822b0) Signed-off-by: Kir Kolyshkin --- libcontainer/integration/bench_test.go | 5 ++-- libcontainer/integration/checkpoint_test.go | 5 ++-- libcontainer/integration/exec_test.go | 29 ++++++++++----------- libcontainer/integration/execin_test.go | 7 +++-- libcontainer/integration/update_test.go | 3 +-- libcontainer/integration/utils_test.go | 9 +++---- 6 files changed, 26 insertions(+), 32 deletions(-) diff --git a/libcontainer/integration/bench_test.go b/libcontainer/integration/bench_test.go index 5499ee215..c185276cf 100644 --- a/libcontainer/integration/bench_test.go +++ b/libcontainer/integration/bench_test.go @@ -1,7 +1,6 @@ package integration import ( - "bytes" "math/rand" "os" "strings" @@ -95,7 +94,7 @@ func BenchmarkExecInBigEnv(b *testing.B) { const numEnv = 5000 env := append(standardEnvironment, genBigEnv(numEnv)...) // Construct the expected output. - var wantOut bytes.Buffer + var wantOut strings.Builder for _, e := range env { wantOut.WriteString(e + "\n") } @@ -112,7 +111,7 @@ func BenchmarkExecInBigEnv(b *testing.B) { err = container.Run(exec) ok(b, err) waitProcess(exec, b) - if !bytes.Equal(buffers.Stdout.Bytes(), wantOut.Bytes()) { + if buffers.Stdout.String() != wantOut.String() { b.Fatalf("unexpected output: %s (stderr: %s)", buffers.Stdout, buffers.Stderr) } } diff --git a/libcontainer/integration/checkpoint_test.go b/libcontainer/integration/checkpoint_test.go index fa4a4975c..21da101d8 100644 --- a/libcontainer/integration/checkpoint_test.go +++ b/libcontainer/integration/checkpoint_test.go @@ -1,7 +1,6 @@ package integration import ( - "bytes" "os" "os/exec" "path/filepath" @@ -54,7 +53,7 @@ func testCheckpoint(t *testing.T, userns bool) { stdinR, stdinW, err := os.Pipe() ok(t, err) - var stdout bytes.Buffer + var stdout strings.Builder pconfig := libcontainer.Process{ Cwd: "/", @@ -131,7 +130,7 @@ func testCheckpoint(t *testing.T, userns bool) { restoreStdinR, restoreStdinW, err := os.Pipe() ok(t, err) - var restoreStdout bytes.Buffer + var restoreStdout strings.Builder restoreProcessConfig := &libcontainer.Process{ Cwd: "/", Stdin: restoreStdinR, diff --git a/libcontainer/integration/exec_test.go b/libcontainer/integration/exec_test.go index 0586dd0e8..e0e49990d 100644 --- a/libcontainer/integration/exec_test.go +++ b/libcontainer/integration/exec_test.go @@ -1,7 +1,6 @@ package integration import ( - "bytes" "encoding/json" "errors" "fmt" @@ -163,7 +162,7 @@ func TestEnter(t *testing.T) { stdinR, stdinW, err := os.Pipe() ok(t, err) - var stdout, stdout2 bytes.Buffer + var stdout, stdout2 strings.Builder pconfig := libcontainer.Process{ Cwd: "/", @@ -242,7 +241,7 @@ func TestProcessEnv(t *testing.T) { ok(t, err) defer destroyContainer(container) - var stdout bytes.Buffer + var stdout strings.Builder pconfig := libcontainer.Process{ Cwd: "/", Args: []string{"sh", "-c", "env"}, @@ -288,7 +287,7 @@ func TestProcessEmptyCaps(t *testing.T) { ok(t, err) defer destroyContainer(container) - var stdout bytes.Buffer + var stdout strings.Builder pconfig := libcontainer.Process{ Cwd: "/", Args: []string{"sh", "-c", "cat /proc/self/status"}, @@ -332,7 +331,7 @@ func TestProcessCaps(t *testing.T) { ok(t, err) defer destroyContainer(container) - var stdout bytes.Buffer + var stdout strings.Builder pconfig := libcontainer.Process{ Cwd: "/", Args: []string{"sh", "-c", "cat /proc/self/status"}, @@ -393,7 +392,7 @@ func TestAdditionalGroups(t *testing.T) { ok(t, err) defer destroyContainer(container) - var stdout bytes.Buffer + var stdout strings.Builder pconfig := libcontainer.Process{ Cwd: "/", Args: []string{"sh", "-c", "id", "-Gn"}, @@ -772,7 +771,7 @@ func TestPassExtraFiles(t *testing.T) { ok(t, err) defer destroyContainer(container) - var stdout bytes.Buffer + var stdout strings.Builder pipeout1, pipein1, err := os.Pipe() ok(t, err) pipeout2, pipein2, err := os.Pipe() @@ -831,7 +830,7 @@ func TestSysctl(t *testing.T) { ok(t, err) defer destroyContainer(container) - var stdout bytes.Buffer + var stdout strings.Builder pconfig := libcontainer.Process{ Cwd: "/proc/sys/kernel", Args: []string{"sh", "-c", cmd}, @@ -941,7 +940,7 @@ func TestOomScoreAdj(t *testing.T) { ok(t, err) defer destroyContainer(container) - var stdout bytes.Buffer + var stdout strings.Builder pconfig := libcontainer.Process{ Cwd: "/", Args: []string{"sh", "-c", "cat /proc/self/oom_score_adj"}, @@ -1081,7 +1080,7 @@ func TestHook(t *testing.T) { cmd.WriteString("/" + hook + " ") } - var stdout bytes.Buffer + var stdout strings.Builder pconfig := libcontainer.Process{ Cwd: "/", Args: []string{"sh", "-c", cmd.String()}, @@ -1193,7 +1192,7 @@ func TestRootfsPropagationSlaveMount(t *testing.T) { ok(t, err) // Run "cat /proc/self/mountinfo" in container and look at mount points. - var stdout2 bytes.Buffer + var stdout2 strings.Builder stdinR2, stdinW2, err := os.Pipe() ok(t, err) @@ -1305,7 +1304,7 @@ func TestRootfsPropagationSharedMount(t *testing.T) { dir2cont = filepath.Join(dir1cont, filepath.Base(dir2host)) // Mount something in container and see if it is visible on host. - var stdout2 bytes.Buffer + var stdout2 strings.Builder stdinR2, stdinW2, err := os.Pipe() ok(t, err) @@ -1340,7 +1339,7 @@ func TestRootfsPropagationSharedMount(t *testing.T) { // Check if mount is visible on host or not. out, err := exec.Command("findmnt", "-n", "-f", "-oTARGET", dir2host).CombinedOutput() - outtrim := string(bytes.TrimSpace(out)) + outtrim := strings.TrimSpace(string(out)) if err != nil { t.Logf("findmnt error %q: %q", err, outtrim) } @@ -1627,7 +1626,7 @@ func TestTmpfsCopyUp(t *testing.T) { ok(t, err) defer destroyContainer(container) - var stdout bytes.Buffer + var stdout strings.Builder pconfig := libcontainer.Process{ Args: []string{"ls", "/etc/passwd"}, Env: standardEnvironment, @@ -1818,7 +1817,7 @@ func TestBindMountAndUser(t *testing.T) { ok(t, err) defer destroyContainer(container) - var stdout bytes.Buffer + var stdout strings.Builder pconfig := libcontainer.Process{ Cwd: "/", diff --git a/libcontainer/integration/execin_test.go b/libcontainer/integration/execin_test.go index d28166292..707d842c1 100644 --- a/libcontainer/integration/execin_test.go +++ b/libcontainer/integration/execin_test.go @@ -1,7 +1,6 @@ package integration import ( - "bytes" "fmt" "io" "os" @@ -151,7 +150,7 @@ func TestExecInAdditionalGroups(t *testing.T) { defer stdinW.Close() ok(t, err) - var stdout bytes.Buffer + var stdout strings.Builder pconfig := libcontainer.Process{ Cwd: "/", Args: []string{"sh", "-c", "id", "-Gn"}, @@ -264,7 +263,7 @@ func TestExecInTTY(t *testing.T) { // Repeat to increase chances to catch a race; see // https://github.com/opencontainers/runc/issues/2425. for range 300 { - var stdout bytes.Buffer + var stdout strings.Builder parent, child, err := utils.NewSockPair("console") ok(t, err) @@ -410,7 +409,7 @@ func TestExecinPassExtraFiles(t *testing.T) { defer stdinW.Close() ok(t, err) - var stdout bytes.Buffer + var stdout strings.Builder pipeout1, pipein1, err := os.Pipe() ok(t, err) pipeout2, pipein2, err := os.Pipe() diff --git a/libcontainer/integration/update_test.go b/libcontainer/integration/update_test.go index 3c0fa4b52..ef204a040 100644 --- a/libcontainer/integration/update_test.go +++ b/libcontainer/integration/update_test.go @@ -1,7 +1,6 @@ package integration import ( - "bytes" "os" "strings" "testing" @@ -40,7 +39,7 @@ func testUpdateDevices(t *testing.T, systemd bool) { }() ok(t, err) - var buf bytes.Buffer + var buf strings.Builder devCheck := &libcontainer.Process{ Cwd: "/", Args: []string{"/bin/sh", "-c", "echo > /dev/full; cat /dev/null; true"}, diff --git a/libcontainer/integration/utils_test.go b/libcontainer/integration/utils_test.go index 346b5b733..a9cf4aa09 100644 --- a/libcontainer/integration/utils_test.go +++ b/libcontainer/integration/utils_test.go @@ -1,7 +1,6 @@ package integration import ( - "bytes" "errors" "fmt" "os" @@ -55,14 +54,14 @@ func ptrInt(v int) *int { func newStdBuffers() *stdBuffers { return &stdBuffers{ - Stdout: bytes.NewBuffer(nil), - Stderr: bytes.NewBuffer(nil), + Stdout: new(strings.Builder), + Stderr: new(strings.Builder), } } type stdBuffers struct { - Stdout *bytes.Buffer - Stderr *bytes.Buffer + Stdout *strings.Builder + Stderr *strings.Builder } func (b *stdBuffers) String() string {