aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/cgo/internal/testcarchive/carchive_test.go29
-rw-r--r--src/cmd/cgo/internal/testcshared/cshared_test.go70
-rw-r--r--src/cmd/cgo/internal/testerrors/argposition_test.go4
-rw-r--r--src/cmd/cgo/internal/testerrors/badsym_test.go14
-rw-r--r--src/cmd/cgo/internal/testerrors/errors_test.go5
-rw-r--r--src/cmd/cgo/internal/testerrors/ptr_test.go9
-rw-r--r--src/cmd/cgo/internal/testfortran/fortran_test.go1
-rw-r--r--src/cmd/cgo/internal/testgodefs/testgodefs_test.go1
-rw-r--r--src/cmd/cgo/internal/testlife/life_test.go4
-rw-r--r--src/cmd/cgo/internal/testplugin/plugin_test.go14
-rw-r--r--src/cmd/cgo/internal/testsanitizers/asan_test.go10
-rw-r--r--src/cmd/cgo/internal/testsanitizers/cc_test.go24
-rw-r--r--src/cmd/cgo/internal/testsanitizers/cshared_test.go8
-rw-r--r--src/cmd/cgo/internal/testsanitizers/msan_test.go3
-rw-r--r--src/cmd/cgo/internal/testsanitizers/tsan_test.go4
-rw-r--r--src/cmd/cgo/internal/testshared/shared_test.go16
-rw-r--r--src/cmd/cgo/internal/testso/noso_test.go9
-rw-r--r--src/cmd/cgo/internal/testso/so_test.go27
-rw-r--r--src/cmd/cgo/internal/testsovar/noso_test.go9
-rw-r--r--src/cmd/cgo/internal/testsovar/so_test.go27
-rw-r--r--src/cmd/cgo/internal/teststdio/stdio_test.go4
-rw-r--r--src/cmd/dist/test.go42
-rw-r--r--src/internal/platform/supported.go2
-rw-r--r--src/internal/testenv/testenv.go9
24 files changed, 197 insertions, 148 deletions
diff --git a/src/cmd/cgo/internal/testcarchive/carchive_test.go b/src/cmd/cgo/internal/testcarchive/carchive_test.go
index a92ec46c1a..a367bca2f1 100644
--- a/src/cmd/cgo/internal/testcarchive/carchive_test.go
+++ b/src/cmd/cgo/internal/testcarchive/carchive_test.go
@@ -461,6 +461,8 @@ func checkELFArchiveObject(t *testing.T, arname string, off int64, obj io.Reader
func TestInstall(t *testing.T) {
testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-archive")
if !testWork {
defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
@@ -504,6 +506,8 @@ func TestEarlySignalHandler(t *testing.T) {
t.Skip("skipping signal test on Windows")
}
testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-archive")
if !testWork {
defer func() {
@@ -643,6 +647,9 @@ func checkSignalForwardingTest(t *testing.T) {
case "windows":
t.Skip("skipping signal test on Windows")
}
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-archive")
}
// buildSignalForwardingTest builds the executable used by the various
@@ -772,6 +779,8 @@ func TestOsSignal(t *testing.T) {
t.Skip("skipping signal test on Windows")
}
testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-archive")
if !testWork {
defer func() {
@@ -811,6 +820,8 @@ func TestSigaltstack(t *testing.T) {
t.Skip("skipping signal test on Windows")
}
testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-archive")
if !testWork {
defer func() {
@@ -860,10 +871,10 @@ func TestExtar(t *testing.T) {
if runtime.Compiler == "gccgo" {
t.Skip("skipping -extar test when using gccgo")
}
- if runtime.GOOS == "ios" {
- t.Skip("shell scripts are not executable on iOS hosts")
- }
testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-archive")
+ testenv.MustHaveExecPath(t, "bash") // This test uses a bash script
if !testWork {
defer func() {
@@ -907,6 +918,8 @@ func TestPIE(t *testing.T) {
t.Skipf("skipping PIE test on %s", GOOS)
}
testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-archive")
libgoa := "libgo.a"
if runtime.Compiler == "gccgo" {
@@ -1002,6 +1015,8 @@ func TestSIGPROF(t *testing.T) {
t.Skipf("skipping SIGPROF test on %s; see https://golang.org/issue/19320", GOOS)
}
testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-archive")
t.Parallel()
@@ -1116,6 +1131,9 @@ func TestCompileWithoutShared(t *testing.T) {
// Test that installing a second time recreates the header file.
func TestCachedInstall(t *testing.T) {
testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-archive")
+
if !testWork {
defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
}
@@ -1156,6 +1174,9 @@ func TestCachedInstall(t *testing.T) {
// Issue 35294.
func TestManyCalls(t *testing.T) {
testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-archive")
+
t.Parallel()
if !testWork {
@@ -1215,6 +1236,8 @@ func TestPreemption(t *testing.T) {
t.Skip("skipping asynchronous preemption test with gccgo")
}
testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-archive")
t.Parallel()
diff --git a/src/cmd/cgo/internal/testcshared/cshared_test.go b/src/cmd/cgo/internal/testcshared/cshared_test.go
index 2b57249817..fbbe66662f 100644
--- a/src/cmd/cgo/internal/testcshared/cshared_test.go
+++ b/src/cmd/cgo/internal/testcshared/cshared_test.go
@@ -12,6 +12,7 @@ import (
"encoding/binary"
"flag"
"fmt"
+ "internal/testenv"
"log"
"os"
"os/exec"
@@ -50,6 +51,11 @@ func testMain(m *testing.M) int {
os.Exit(0)
}
}
+ if !testenv.HasGoBuild() {
+ // Checking for "go build" is a proxy for whether or not we can run "go env".
+ fmt.Printf("SKIP - no go build")
+ os.Exit(0)
+ }
GOOS = goEnv("GOOS")
GOARCH = goEnv("GOARCH")
@@ -390,6 +396,10 @@ var (
)
func createHeadersOnce(t *testing.T) {
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-shared")
+
headersOnce.Do(func() {
headersErr = createHeaders()
})
@@ -413,6 +423,9 @@ func cleanupAndroid() {
// test0: exported symbols in shared lib are accessible.
func TestExportedSymbols(t *testing.T) {
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveExec(t)
+
t.Parallel()
cmd := "testp0"
@@ -516,6 +529,10 @@ func TestNumberOfExportedFunctions(t *testing.T) {
if GOOS != "windows" {
t.Skip("skipping windows only test")
}
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-shared")
+
t.Parallel()
t.Run("OnlyExported", func(t *testing.T) {
@@ -528,12 +545,13 @@ func TestNumberOfExportedFunctions(t *testing.T) {
// test1: shared library can be dynamically loaded and exported symbols are accessible.
func TestExportedSymbolsWithDynamicLoad(t *testing.T) {
- t.Parallel()
-
if GOOS == "windows" {
- t.Logf("Skipping on %s", GOOS)
- return
+ t.Skipf("Skipping on %s", GOOS)
}
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveExec(t)
+
+ t.Parallel()
cmd := "testp1"
bin := cmdToRun(cmd)
@@ -557,12 +575,14 @@ func TestExportedSymbolsWithDynamicLoad(t *testing.T) {
// test2: tests libgo2 which does not export any functions.
func TestUnexportedSymbols(t *testing.T) {
- t.Parallel()
-
if GOOS == "windows" {
- t.Logf("Skipping on %s", GOOS)
- return
+ t.Skipf("Skipping on %s", GOOS)
}
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-shared")
+
+ t.Parallel()
cmd := "testp2"
bin := cmdToRun(cmd)
@@ -597,6 +617,9 @@ func TestUnexportedSymbols(t *testing.T) {
// test3: tests main.main is exported on android.
func TestMainExportedOnAndroid(t *testing.T) {
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveExec(t)
+
t.Parallel()
switch GOOS {
@@ -624,6 +647,13 @@ func TestMainExportedOnAndroid(t *testing.T) {
}
func testSignalHandlers(t *testing.T, pkgname, cfile, cmd string) {
+ if GOOS == "windows" {
+ t.Skipf("Skipping on %s", GOOS)
+ }
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-shared")
+
libname := pkgname + ".a"
run(t,
nil,
@@ -655,34 +685,25 @@ func testSignalHandlers(t *testing.T, pkgname, cfile, cmd string) {
// test4: test signal handlers
func TestSignalHandlers(t *testing.T) {
t.Parallel()
- if GOOS == "windows" {
- t.Logf("Skipping on %s", GOOS)
- return
- }
testSignalHandlers(t, "./libgo4", "main4.c", "testp4")
}
// test5: test signal handlers with os/signal.Notify
func TestSignalHandlersWithNotify(t *testing.T) {
t.Parallel()
- if GOOS == "windows" {
- t.Logf("Skipping on %s", GOOS)
- return
- }
testSignalHandlers(t, "./libgo5", "main5.c", "testp5")
}
func TestPIE(t *testing.T) {
- t.Parallel()
-
switch GOOS {
case "linux", "android":
break
default:
- t.Logf("Skipping on %s", GOOS)
- return
+ t.Skipf("Skipping on %s", GOOS)
}
+ t.Parallel()
+
createHeadersOnce(t)
f, err := elf.Open(libgoname)
@@ -717,6 +738,10 @@ func TestPIE(t *testing.T) {
// Test that installing a second time recreates the header file.
func TestCachedInstall(t *testing.T) {
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-shared")
+
tmpdir, err := os.MkdirTemp("", "cshared")
if err != nil {
t.Fatal(err)
@@ -817,6 +842,9 @@ func TestGo2C2Go(t *testing.T) {
case "android":
t.Skip("test fails on android; issue 29087")
}
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-shared")
t.Parallel()
@@ -866,6 +894,8 @@ func TestGo2C2Go(t *testing.T) {
}
func TestIssue36233(t *testing.T) {
+ testenv.MustHaveCGO(t)
+
t.Parallel()
// Test that the export header uses GoComplex64 and GoComplex128
diff --git a/src/cmd/cgo/internal/testerrors/argposition_test.go b/src/cmd/cgo/internal/testerrors/argposition_test.go
index dd26663df2..0876dc4caf 100644
--- a/src/cmd/cgo/internal/testerrors/argposition_test.go
+++ b/src/cmd/cgo/internal/testerrors/argposition_test.go
@@ -12,6 +12,7 @@ import (
"go/ast"
"go/parser"
"go/token"
+ "internal/testenv"
"os"
"os/exec"
"path/filepath"
@@ -65,6 +66,9 @@ func (v *Visitor) Visit(node ast.Node) ast.Visitor {
}
func TestArgumentsPositions(t *testing.T) {
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveExec(t)
+
testdata, err := filepath.Abs("testdata")
if err != nil {
t.Fatal(err)
diff --git a/src/cmd/cgo/internal/testerrors/badsym_test.go b/src/cmd/cgo/internal/testerrors/badsym_test.go
index bc3ba2b489..6c87977bd1 100644
--- a/src/cmd/cgo/internal/testerrors/badsym_test.go
+++ b/src/cmd/cgo/internal/testerrors/badsym_test.go
@@ -6,6 +6,8 @@ package errorstest
import (
"bytes"
+ "cmd/internal/quoted"
+ "internal/testenv"
"os"
"os/exec"
"path/filepath"
@@ -39,6 +41,9 @@ func main() {
`
func TestBadSymbol(t *testing.T) {
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+
dir := t.TempDir()
mkdir := func(base string) string {
@@ -167,7 +172,14 @@ func TestBadSymbol(t *testing.T) {
}
func cCompilerCmd(t *testing.T) []string {
- cc := []string{goEnv(t, "CC")}
+ cc, err := quoted.Split(goEnv(t, "CC"))
+ if err != nil {
+ t.Skipf("parsing go env CC: %s", err)
+ }
+ if len(cc) == 0 {
+ t.Skipf("no C compiler")
+ }
+ testenv.MustHaveExecPath(t, cc[0])
out := goEnv(t, "GOGCCFLAGS")
quote := '\000'
diff --git a/src/cmd/cgo/internal/testerrors/errors_test.go b/src/cmd/cgo/internal/testerrors/errors_test.go
index 5147e51aa1..486530e186 100644
--- a/src/cmd/cgo/internal/testerrors/errors_test.go
+++ b/src/cmd/cgo/internal/testerrors/errors_test.go
@@ -24,6 +24,7 @@ func path(file string) string {
func check(t *testing.T, file string) {
t.Run(file, func(t *testing.T) {
testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
t.Parallel()
contents, err := os.ReadFile(path(file))
@@ -91,6 +92,8 @@ func expect(t *testing.T, file string, errors []*regexp.Regexp) {
}
func sizeofLongDouble(t *testing.T) int {
+ testenv.MustHaveGoRun(t)
+ testenv.MustHaveCGO(t)
cmd := exec.Command("go", "run", path("long_double_size.go"))
out, err := cmd.CombinedOutput()
if err != nil {
@@ -137,6 +140,7 @@ func TestToleratesOptimizationFlag(t *testing.T) {
cflags := cflags
t.Run(cflags, func(t *testing.T) {
testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
t.Parallel()
cmd := exec.Command("go", "build", path("issue14669.go"))
@@ -150,6 +154,7 @@ func TestToleratesOptimizationFlag(t *testing.T) {
}
func TestMallocCrashesOnNil(t *testing.T) {
+ testenv.MustHaveCGO(t)
testenv.MustHaveGoRun(t)
t.Parallel()
diff --git a/src/cmd/cgo/internal/testerrors/ptr_test.go b/src/cmd/cgo/internal/testerrors/ptr_test.go
index 24851cbf35..149445899f 100644
--- a/src/cmd/cgo/internal/testerrors/ptr_test.go
+++ b/src/cmd/cgo/internal/testerrors/ptr_test.go
@@ -10,9 +10,11 @@ import (
"bytes"
"flag"
"fmt"
+ "internal/testenv"
"os"
"os/exec"
"path/filepath"
+ "runtime"
"strings"
"sync/atomic"
"testing"
@@ -434,6 +436,13 @@ var ptrTests = []ptrTest{
}
func TestPointerChecks(t *testing.T) {
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ if runtime.GOOS == "windows" {
+ // TODO: Skip just the cases that fail?
+ t.Skipf("some tests fail to build on %s", runtime.GOOS)
+ }
+
var gopath string
var dir string
if *tmp != "" {
diff --git a/src/cmd/cgo/internal/testfortran/fortran_test.go b/src/cmd/cgo/internal/testfortran/fortran_test.go
index fa4f0e6049..eaa36ac7f9 100644
--- a/src/cmd/cgo/internal/testfortran/fortran_test.go
+++ b/src/cmd/cgo/internal/testfortran/fortran_test.go
@@ -17,6 +17,7 @@ import (
func TestFortran(t *testing.T) {
testenv.MustHaveGoRun(t)
+ testenv.MustHaveCGO(t)
// Find the FORTRAN compiler.
fc := os.Getenv("FC")
diff --git a/src/cmd/cgo/internal/testgodefs/testgodefs_test.go b/src/cmd/cgo/internal/testgodefs/testgodefs_test.go
index 7b149ffe20..8138b7fa3d 100644
--- a/src/cmd/cgo/internal/testgodefs/testgodefs_test.go
+++ b/src/cmd/cgo/internal/testgodefs/testgodefs_test.go
@@ -32,6 +32,7 @@ var filePrefixes = []string{
func TestGoDefs(t *testing.T) {
testenv.MustHaveGoRun(t)
+ testenv.MustHaveCGO(t)
testdata, err := filepath.Abs("testdata")
if err != nil {
diff --git a/src/cmd/cgo/internal/testlife/life_test.go b/src/cmd/cgo/internal/testlife/life_test.go
index e6b371fe7c..7beeaa9823 100644
--- a/src/cmd/cgo/internal/testlife/life_test.go
+++ b/src/cmd/cgo/internal/testlife/life_test.go
@@ -46,10 +46,8 @@ func testMain(m *testing.M) int {
// TestTestRun runs a test case for cgo //export.
func TestTestRun(t *testing.T) {
- if os.Getenv("GOOS") == "android" {
- t.Skip("the go tool runs with CGO_ENABLED=0 on the android device")
- }
testenv.MustHaveGoRun(t)
+ testenv.MustHaveCGO(t)
cmd := exec.Command("go", "run", "main.go")
got, err := cmd.CombinedOutput()
diff --git a/src/cmd/cgo/internal/testplugin/plugin_test.go b/src/cmd/cgo/internal/testplugin/plugin_test.go
index 84ea839a2f..e211a96304 100644
--- a/src/cmd/cgo/internal/testplugin/plugin_test.go
+++ b/src/cmd/cgo/internal/testplugin/plugin_test.go
@@ -9,10 +9,13 @@ import (
"context"
"flag"
"fmt"
+ "internal/platform"
+ "internal/testenv"
"log"
"os"
"os/exec"
"path/filepath"
+ "runtime"
"strings"
"testing"
"time"
@@ -44,6 +47,17 @@ func prettyPrintf(format string, args ...interface{}) {
}
func testMain(m *testing.M) int {
+ // TODO: Move all of this initialization stuff into a sync.Once that each
+ // test can use, where we can properly t.Skip.
+ if !platform.BuildModeSupported(runtime.Compiler, "plugin", runtime.GOOS, runtime.GOARCH) {
+ fmt.Printf("SKIP - plugin build mode not supported\n")
+ os.Exit(0)
+ }
+ if !testenv.HasCGO() {
+ fmt.Printf("SKIP - cgo not supported\n")
+ os.Exit(0)
+ }
+
cwd, err := os.Getwd()
if err != nil {
log.Fatal(err)
diff --git a/src/cmd/cgo/internal/testsanitizers/asan_test.go b/src/cmd/cgo/internal/testsanitizers/asan_test.go
index 9bf48915e2..7db356244a 100644
--- a/src/cmd/cgo/internal/testsanitizers/asan_test.go
+++ b/src/cmd/cgo/internal/testsanitizers/asan_test.go
@@ -8,11 +8,15 @@ package sanitizers_test
import (
"fmt"
+ "internal/platform"
+ "internal/testenv"
"strings"
"testing"
)
func TestASAN(t *testing.T) {
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
goos, err := goEnv("GOOS")
if err != nil {
t.Fatal(err)
@@ -22,7 +26,7 @@ func TestASAN(t *testing.T) {
t.Fatal(err)
}
// The asan tests require support for the -asan option.
- if !aSanSupported(goos, goarch) {
+ if !platform.ASanSupported(goos, goarch) {
t.Skipf("skipping on %s/%s; -asan option is not supported.", goos, goarch)
}
// The current implementation is only compatible with the ASan library from version
@@ -102,6 +106,8 @@ func TestASAN(t *testing.T) {
}
func TestASANLinkerX(t *testing.T) {
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
// Test ASAN with linker's -X flag (see issue 56175).
goos, err := goEnv("GOOS")
if err != nil {
@@ -112,7 +118,7 @@ func TestASANLinkerX(t *testing.T) {
t.Fatal(err)
}
// The asan tests require support for the -asan option.
- if !aSanSupported(goos, goarch) {
+ if !platform.ASanSupported(goos, goarch) {
t.Skipf("skipping on %s/%s; -asan option is not supported.", goos, goarch)
}
if !compilerRequiredAsanVersion(goos, goarch) {
diff --git a/src/cmd/cgo/internal/testsanitizers/cc_test.go b/src/cmd/cgo/internal/testsanitizers/cc_test.go
index 5facb37e68..6eb5a64f9b 100644
--- a/src/cmd/cgo/internal/testsanitizers/cc_test.go
+++ b/src/cmd/cgo/internal/testsanitizers/cc_test.go
@@ -562,27 +562,3 @@ func hangProneCmd(name string, arg ...string) *exec.Cmd {
}
return cmd
}
-
-// mSanSupported is a copy of the function cmd/internal/sys.MSanSupported,
-// because the internal package can't be used here.
-func mSanSupported(goos, goarch string) bool {
- switch goos {
- case "linux":
- return goarch == "amd64" || goarch == "arm64"
- case "freebsd":
- return goarch == "amd64"
- default:
- return false
- }
-}
-
-// aSanSupported is a copy of the function cmd/internal/sys.ASanSupported,
-// because the internal package can't be used here.
-func aSanSupported(goos, goarch string) bool {
- switch goos {
- case "linux":
- return goarch == "amd64" || goarch == "arm64" || goarch == "riscv64" || goarch == "ppc64le"
- default:
- return false
- }
-}
diff --git a/src/cmd/cgo/internal/testsanitizers/cshared_test.go b/src/cmd/cgo/internal/testsanitizers/cshared_test.go
index 5a8e93d101..f26c50a621 100644
--- a/src/cmd/cgo/internal/testsanitizers/cshared_test.go
+++ b/src/cmd/cgo/internal/testsanitizers/cshared_test.go
@@ -8,12 +8,18 @@ package sanitizers_test
import (
"fmt"
+ "internal/platform"
+ "internal/testenv"
"os"
"strings"
"testing"
)
func TestShared(t *testing.T) {
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "c-shared")
+
t.Parallel()
requireOvercommit(t)
@@ -50,7 +56,7 @@ func TestShared(t *testing.T) {
tc := tc
name := strings.TrimSuffix(tc.src, ".go")
//The memory sanitizer tests require support for the -msan option.
- if tc.sanitizer == "memory" && !mSanSupported(GOOS, GOARCH) {
+ if tc.sanitizer == "memory" && !platform.MSanSupported(GOOS, GOARCH) {
t.Logf("skipping %s test on %s/%s; -msan option is not supported.", name, GOOS, GOARCH)
continue
}
diff --git a/src/cmd/cgo/internal/testsanitizers/msan_test.go b/src/cmd/cgo/internal/testsanitizers/msan_test.go
index a05c545d2a..1a22b5246c 100644
--- a/src/cmd/cgo/internal/testsanitizers/msan_test.go
+++ b/src/cmd/cgo/internal/testsanitizers/msan_test.go
@@ -7,6 +7,7 @@
package sanitizers_test
import (
+ "internal/platform"
"strings"
"testing"
)
@@ -21,7 +22,7 @@ func TestMSAN(t *testing.T) {
t.Fatal(err)
}
// The msan tests require support for the -msan option.
- if !mSanSupported(goos, goarch) {
+ if !platform.MSanSupported(goos, goarch) {
t.Skipf("skipping on %s/%s; -msan option is not supported.", goos, goarch)
}
diff --git a/src/cmd/cgo/internal/testsanitizers/tsan_test.go b/src/cmd/cgo/internal/testsanitizers/tsan_test.go
index 6f70ebfef5..8e758e6ea7 100644
--- a/src/cmd/cgo/internal/testsanitizers/tsan_test.go
+++ b/src/cmd/cgo/internal/testsanitizers/tsan_test.go
@@ -7,11 +7,15 @@
package sanitizers_test
import (
+ "internal/testenv"
"strings"
"testing"
)
func TestTSAN(t *testing.T) {
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveCGO(t)
+
goos, err := goEnv("GOOS")
if err != nil {
t.Fatal(err)
diff --git a/src/cmd/cgo/internal/testshared/shared_test.go b/src/cmd/cgo/internal/testshared/shared_test.go
index 34cf3f3141..05e87b9d50 100644
--- a/src/cmd/cgo/internal/testshared/shared_test.go
+++ b/src/cmd/cgo/internal/testshared/shared_test.go
@@ -12,6 +12,8 @@ import (
"flag"
"fmt"
"go/build"
+ "internal/platform"
+ "internal/testenv"
"io"
"log"
"os"
@@ -91,6 +93,17 @@ func goCmd(t *testing.T, args ...string) string {
// TestMain calls testMain so that the latter can use defer (TestMain exits with os.Exit).
func testMain(m *testing.M) (int, error) {
+ // TODO: Move all of this initialization stuff into a sync.Once that each
+ // test can use, where we can properly t.Skip.
+ if !platform.BuildModeSupported(runtime.Compiler, "shared", runtime.GOOS, runtime.GOARCH) {
+ fmt.Printf("SKIP - shared build mode not supported\n")
+ os.Exit(0)
+ }
+ if !testenv.HasCGO() {
+ fmt.Printf("SKIP - cgo not supported\n")
+ os.Exit(0)
+ }
+
cwd, err := os.Getwd()
if err != nil {
log.Fatal(err)
@@ -531,6 +544,7 @@ func TestTrivialPIE(t *testing.T) {
if strings.HasSuffix(os.Getenv("GO_BUILDER_NAME"), "-alpine") {
t.Skip("skipping on alpine until issue #54354 resolved")
}
+ testenv.MustHaveBuildMode(t, "pie")
name := "trivial_pie"
goCmd(t, "build", "-buildmode=pie", "-o="+name, "./trivial")
defer os.Remove(name)
@@ -539,6 +553,8 @@ func TestTrivialPIE(t *testing.T) {
}
func TestCgoPIE(t *testing.T) {
+ testenv.MustHaveCGO(t)
+ testenv.MustHaveBuildMode(t, "pie")
name := "cgo_pie"
goCmd(t, "build", "-buildmode=pie", "-o="+name, "./execgo")
defer os.Remove(name)
diff --git a/src/cmd/cgo/internal/testso/noso_test.go b/src/cmd/cgo/internal/testso/noso_test.go
deleted file mode 100644
index 45b13e1928..0000000000
--- a/src/cmd/cgo/internal/testso/noso_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:build !cgo
-
-package so_test
-
-// Nothing to test.
diff --git a/src/cmd/cgo/internal/testso/so_test.go b/src/cmd/cgo/internal/testso/so_test.go
index 5c460d21b6..a2cd056c45 100644
--- a/src/cmd/cgo/internal/testso/so_test.go
+++ b/src/cmd/cgo/internal/testso/so_test.go
@@ -2,11 +2,10 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-//go:build cgo
-
package so_test
import (
+ "internal/testenv"
"log"
"os"
"os/exec"
@@ -16,25 +15,13 @@ import (
"testing"
)
-func requireTestSOSupported(t *testing.T) {
- t.Helper()
- switch runtime.GOARCH {
- case "arm64":
- if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
- t.Skip("No exec facility on iOS.")
- }
- case "ppc64":
- if runtime.GOOS == "linux" {
- t.Skip("External linking not implemented on linux/ppc64 (issue #8912).")
- }
- }
- if runtime.GOOS == "android" {
- t.Skip("No exec facility on Android.")
- }
-}
-
func TestSO(t *testing.T) {
- requireTestSOSupported(t)
+ if runtime.GOOS == "ios" {
+ t.Skip("iOS disallows dynamic loading of user libraries")
+ }
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveExec(t)
+ testenv.MustHaveCGO(t)
GOPATH, err := os.MkdirTemp("", "cgosotest")
if err != nil {
diff --git a/src/cmd/cgo/internal/testsovar/noso_test.go b/src/cmd/cgo/internal/testsovar/noso_test.go
deleted file mode 100644
index 45b13e1928..0000000000
--- a/src/cmd/cgo/internal/testsovar/noso_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:build !cgo
-
-package so_test
-
-// Nothing to test.
diff --git a/src/cmd/cgo/internal/testsovar/so_test.go b/src/cmd/cgo/internal/testsovar/so_test.go
index 5c460d21b6..a2cd056c45 100644
--- a/src/cmd/cgo/internal/testsovar/so_test.go
+++ b/src/cmd/cgo/internal/testsovar/so_test.go
@@ -2,11 +2,10 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-//go:build cgo
-
package so_test
import (
+ "internal/testenv"
"log"
"os"
"os/exec"
@@ -16,25 +15,13 @@ import (
"testing"
)
-func requireTestSOSupported(t *testing.T) {
- t.Helper()
- switch runtime.GOARCH {
- case "arm64":
- if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
- t.Skip("No exec facility on iOS.")
- }
- case "ppc64":
- if runtime.GOOS == "linux" {
- t.Skip("External linking not implemented on linux/ppc64 (issue #8912).")
- }
- }
- if runtime.GOOS == "android" {
- t.Skip("No exec facility on Android.")
- }
-}
-
func TestSO(t *testing.T) {
- requireTestSOSupported(t)
+ if runtime.GOOS == "ios" {
+ t.Skip("iOS disallows dynamic loading of user libraries")
+ }
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveExec(t)
+ testenv.MustHaveCGO(t)
GOPATH, err := os.MkdirTemp("", "cgosotest")
if err != nil {
diff --git a/src/cmd/cgo/internal/teststdio/stdio_test.go b/src/cmd/cgo/internal/teststdio/stdio_test.go
index fad367e30c..f191c50a42 100644
--- a/src/cmd/cgo/internal/teststdio/stdio_test.go
+++ b/src/cmd/cgo/internal/teststdio/stdio_test.go
@@ -48,9 +48,7 @@ func testMain(m *testing.M) int {
// TestTestRun runs a cgo test that doesn't depend on non-standard libraries.
func TestTestRun(t *testing.T) {
testenv.MustHaveGoRun(t)
- if os.Getenv("GOOS") == "android" {
- t.Skip("subpackage stdio is not available on android")
- }
+ testenv.MustHaveCGO(t)
for _, file := range [...]string{
"chain.go",
diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go
index b6775cacbb..9fed4b9e20 100644
--- a/src/cmd/dist/test.go
+++ b/src/cmd/dist/test.go
@@ -847,40 +847,22 @@ func (t *tester) registerTests() {
}
const cgoHeading = "Testing cgo"
- if t.cgoEnabled && !t.iOS() {
- // Disabled on iOS. golang.org/issue/15919
- t.registerTest("cgo_teststdio", cgoHeading, &goTest{pkg: "cmd/cgo/internal/teststdio", timeout: 5 * time.Minute})
- t.registerTest("cgo_testlife", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testlife", timeout: 5 * time.Minute})
- if goos != "android" {
- t.registerTest("cgo_testfortran", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testfortran", timeout: 5 * time.Minute})
- }
- }
+ t.registerTest("cgo_teststdio", cgoHeading, &goTest{pkg: "cmd/cgo/internal/teststdio", timeout: 5 * time.Minute})
+ t.registerTest("cgo_testlife", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testlife", timeout: 5 * time.Minute})
+ t.registerTest("cgo_testfortran", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testfortran", timeout: 5 * time.Minute})
if t.cgoEnabled {
t.registerCgoTests(cgoHeading)
}
- if t.cgoEnabled {
- t.registerTest("cgo_testgodefs", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testgodefs", timeout: 5 * time.Minute})
-
- t.registerTest("cgo_testso", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testso", timeout: 600 * time.Second})
- t.registerTest("cgo_testsovar", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testsovar", timeout: 600 * time.Second})
- if t.supportedBuildmode("c-archive") {
- t.registerTest("cgo_testcarchive", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testcarchive", timeout: 5 * time.Minute})
- }
- if t.supportedBuildmode("c-shared") {
- t.registerTest("cgo_testcshared", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testcshared", timeout: 5 * time.Minute})
- }
- if t.supportedBuildmode("shared") {
- t.registerTest("cgo_testshared", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testshared", timeout: 600 * time.Second})
- }
- if t.supportedBuildmode("plugin") {
- t.registerTest("cgo_testplugin", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testplugin", timeout: 600 * time.Second})
- }
- t.registerTest("cgo_testsanitizers", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testsanitizers", timeout: 5 * time.Minute})
- if t.hasBash() && goos != "android" && !t.iOS() && gohostos != "windows" {
- t.registerTest("cgo_errors", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testerrors", timeout: 5 * time.Minute})
- }
- }
+ t.registerTest("cgo_testgodefs", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testgodefs", timeout: 5 * time.Minute})
+ t.registerTest("cgo_testso", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testso", timeout: 600 * time.Second})
+ t.registerTest("cgo_testsovar", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testsovar", timeout: 600 * time.Second})
+ t.registerTest("cgo_testcarchive", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testcarchive", timeout: 5 * time.Minute})
+ t.registerTest("cgo_testcshared", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testcshared", timeout: 5 * time.Minute})
+ t.registerTest("cgo_testshared", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testshared", timeout: 600 * time.Second})
+ t.registerTest("cgo_testplugin", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testplugin", timeout: 600 * time.Second})
+ t.registerTest("cgo_testsanitizers", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testsanitizers", timeout: 5 * time.Minute})
+ t.registerTest("cgo_errors", cgoHeading, &goTest{pkg: "cmd/cgo/internal/testerrors", timeout: 5 * time.Minute})
if goos != "android" && !t.iOS() {
// Only start multiple test dir shards on builders,
diff --git a/src/internal/platform/supported.go b/src/internal/platform/supported.go
index 1287838edb..e762bb304e 100644
--- a/src/internal/platform/supported.go
+++ b/src/internal/platform/supported.go
@@ -24,7 +24,6 @@ func RaceDetectorSupported(goos, goarch string) bool {
// MSanSupported reports whether goos/goarch supports the memory
// sanitizer option.
-// There is a copy of this function in misc/cgo/testsanitizers/cc_test.go.
func MSanSupported(goos, goarch string) bool {
switch goos {
case "linux":
@@ -38,7 +37,6 @@ func MSanSupported(goos, goarch string) bool {
// ASanSupported reports whether goos/goarch supports the address
// sanitizer option.
-// There is a copy of this function in misc/cgo/testsanitizers/cc_test.go.
func ASanSupported(goos, goarch string) bool {
switch goos {
case "linux":
diff --git a/src/internal/testenv/testenv.go b/src/internal/testenv/testenv.go
index 70606242d6..31b58ddba7 100644
--- a/src/internal/testenv/testenv.go
+++ b/src/internal/testenv/testenv.go
@@ -371,6 +371,15 @@ func MustInternalLink(t testing.TB, withCgo bool) {
}
}
+// MustHaveBuildMode reports whether the current system can build programs in
+// the given build mode.
+// If not, MustHaveBuildMode calls t.Skip with an explanation.
+func MustHaveBuildMode(t testing.TB, buildmode string) {
+ if !platform.BuildModeSupported(runtime.Compiler, buildmode, runtime.GOOS, runtime.GOARCH) {
+ t.Skipf("skipping test: build mode %s on %s/%s is not supported by the %s compiler", buildmode, runtime.GOOS, runtime.GOARCH, runtime.Compiler)
+ }
+}
+
// HasSymlink reports whether the current system can use os.Symlink.
func HasSymlink() bool {
ok, _ := hasSymlink()