Home | History | Annotate | Download | only in testenv
      1 // Copyright 2015 The Go Authors.  All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 // Package testenv provides information about what functionality
      6 // is available in different testing environments run by the Go team.
      7 //
      8 // It is an internal package because these details are specific
      9 // to the Go team's test setup (on build.golang.org) and not
     10 // fundamental to tests in general.
     11 package testenv
     12 
     13 import (
     14 	"os"
     15 	"runtime"
     16 	"strings"
     17 	"testing"
     18 )
     19 
     20 // Builder reports the name of the builder running this test
     21 // (for example, "linux-amd64" or "windows-386-gce").
     22 // If the test is not running on the build infrastructure,
     23 // Builder returns the empty string.
     24 func Builder() string {
     25 	return os.Getenv("GO_BUILDER_NAME")
     26 }
     27 
     28 // HasGoBuild reports whether the current system can build programs with ``go build''
     29 // and then run them with os.StartProcess or exec.Command.
     30 func HasGoBuild() bool {
     31 	switch runtime.GOOS {
     32 	case "android", "nacl":
     33 		return false
     34 	case "darwin":
     35 		if strings.HasPrefix(runtime.GOARCH, "arm") {
     36 			return false
     37 		}
     38 	}
     39 	return true
     40 }
     41 
     42 // MustHaveGoBuild checks that the current system can build programs with ``go build''
     43 // and then run them with os.StartProcess or exec.Command.
     44 // If not, MustHaveGoBuild calls t.Skip with an explanation.
     45 func MustHaveGoBuild(t *testing.T) {
     46 	if !HasGoBuild() {
     47 		t.Skipf("skipping test: 'go build' not available on %s/%s", runtime.GOOS, runtime.GOARCH)
     48 	}
     49 }
     50 
     51 // HasGoRun reports whether the current system can run programs with ``go run.''
     52 func HasGoRun() bool {
     53 	// For now, having go run and having go build are the same.
     54 	return HasGoBuild()
     55 }
     56 
     57 // MustHaveGoRun checks that the current system can run programs with ``go run.''
     58 // If not, MustHaveGoRun calls t.Skip with an explanation.
     59 func MustHaveGoRun(t *testing.T) {
     60 	if !HasGoRun() {
     61 		t.Skipf("skipping test: 'go run' not available on %s/%s", runtime.GOOS, runtime.GOARCH)
     62 	}
     63 }
     64 
     65 // HasExec reports whether the current system can start new processes
     66 // using os.StartProcess or (more commonly) exec.Command.
     67 func HasExec() bool {
     68 	switch runtime.GOOS {
     69 	case "nacl":
     70 		return false
     71 	case "darwin":
     72 		if strings.HasPrefix(runtime.GOARCH, "arm") {
     73 			return false
     74 		}
     75 	}
     76 	return true
     77 }
     78 
     79 // MustHaveExec checks that the current system can start new processes
     80 // using os.StartProcess or (more commonly) exec.Command.
     81 // If not, MustHaveExec calls t.Skip with an explanation.
     82 func MustHaveExec(t *testing.T) {
     83 	if !HasExec() {
     84 		t.Skipf("skipping test: cannot exec subprocess on %s/%s", runtime.GOOS, runtime.GOARCH)
     85 	}
     86 }
     87 
     88 // HasExternalNetwork reports whether the current system can use
     89 // external (non-localhost) networks.
     90 func HasExternalNetwork() bool {
     91 	return !testing.Short()
     92 }
     93 
     94 // MustHaveExternalNetwork checks that the current system can use
     95 // external (non-localhost) networks.
     96 // If not, MustHaveExternalNetwork calls t.Skip with an explanation.
     97 func MustHaveExternalNetwork(t *testing.T) {
     98 	if testing.Short() {
     99 		t.Skipf("skipping test: no external network in -short mode")
    100 	}
    101 }
    102