]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: skip TestUnshare if there's nothing more to unshare
authorDmitri Shuralyov <dmitshur@golang.org>
Fri, 28 Jul 2023 16:34:30 +0000 (12:34 -0400)
committerGopher Robot <gobot@golang.org>
Fri, 28 Jul 2023 17:55:45 +0000 (17:55 +0000)
Tests that need to use the internet are expected not to run when -short
test flag is set, and the Go build system automatically catches when a
test forgets that. It does this by unsharing all real network interfaces
and leaving only a loopback interface in a new network namespace.

TestUnshare tests that a process started with CLONE_NEWNET unshare flag
has fewer network interfaces than before. Of course, if /proc/net/dev
starts out with a single loopback interface, the test would fail with
a false positive:

=== RUN TestUnshare
exec_linux_test.go:139: Got 3 lines of output, want <3
--- FAIL: TestUnshare (0.00s)

Give the test what it wants: a skip when the environment doesn't meet
the minimum requirements for the test, and more useful log output if
it fails.

Change-Id: I6b9c29d88ce725e640a7ee86c7e1be9761f21b02
Reviewed-on: https://go-review.googlesource.com/c/go/+/513762
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org>

src/syscall/exec_linux_test.go

index f4ff7bf81b358b227bbcf12c1dc2af23f7f8524d..e9919b680191cec06dd6898dfe11ade80664706b 100644 (file)
@@ -109,11 +109,17 @@ func TestUnshare(t *testing.T) {
                t.Fatal(err)
        }
 
-       orig, err := os.ReadFile(path)
+       b, err := os.ReadFile(path)
        if err != nil {
                t.Fatal(err)
        }
-       origLines := strings.Split(strings.TrimSpace(string(orig)), "\n")
+       orig := strings.TrimSpace(string(b))
+       if strings.Contains(orig, "lo:") && strings.Count(orig, ":") == 1 {
+               // This test expects there to be at least 1 more network interface
+               // in addition to the local network interface, so that it can tell
+               // that unshare worked.
+               t.Skip("not enough network interfaces to test unshare with")
+       }
 
        cmd := testenv.Command(t, "cat", path)
        cmd.SysProcAttr = &syscall.SysProcAttr{
@@ -128,15 +134,18 @@ func TestUnshare(t *testing.T) {
                t.Fatalf("Cmd failed with err %v, output: %s", err, out)
        }
 
-       // Check there is only the local network interface
+       // Check there is only the local network interface.
        sout := strings.TrimSpace(string(out))
        if !strings.Contains(sout, "lo:") {
                t.Fatalf("Expected lo network interface to exist, got %s", sout)
        }
 
+       origLines := strings.Split(orig, "\n")
        lines := strings.Split(sout, "\n")
        if len(lines) >= len(origLines) {
-               t.Fatalf("Got %d lines of output, want <%d", len(lines), len(origLines))
+               t.Logf("%s before unshare:\n%s", path, orig)
+               t.Logf("%s after unshare:\n%s", path, sout)
+               t.Fatalf("Got %d lines of output, want < %d", len(lines), len(origLines))
        }
 }