1
0
mirror of https://github.com/golang/go synced 2024-11-26 06:27:58 -07:00

build: make nacl pass

Add nacl.bash, the NaCl version of all.bash.
It's a separate script because it builds a variant of package syscall
with a large zip file embedded in it, containing all the input files
needed for tests.

Disable various tests new since the last round, mostly the ones using os/exec.

Fixes #7945.

LGTM=dave
R=golang-codereviews, remyoudompheng, dave, bradfitz
CC=golang-codereviews
https://golang.org/cl/100590044
This commit is contained in:
Russ Cox 2014-05-20 12:10:19 -04:00
parent f374dd30a0
commit 0c2a727477
33 changed files with 2146 additions and 56 deletions

220
misc/nacl/mkzip.go Normal file
View File

@ -0,0 +1,220 @@
// Copyright 2014 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.
// Mkzip creates a zip file from a 'proto' file describing the contents.
//
// The proto file is inspired by the Plan 9 mkfs prototype file format.
// It describes a file tree, one directory per line, with leading tab
// indentation marking the tree structure. Each line contains a leading
// name field giving the name of the file to copy into the zip file,
// and then a sequence of optional key=value attributes to control
// the copy. The only known attribute is src=foo, meaning copy the
// actual data for the file (or directory) from an alternate location.
package main
import (
"archive/zip"
"bufio"
"flag"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"path"
"path/filepath"
"strings"
)
func usage() {
fmt.Fprintf(os.Stderr, "usage: mkzip [-r root] src.proto out.zip\n")
os.Exit(2)
}
func sysfatal(format string, args ...interface{}) {
fmt.Fprintf(os.Stderr, "mkzip: %s\n", fmt.Sprintf(format, args...))
os.Exit(2)
}
var (
root = flag.String("r", ".", "interpret source paths relative to this directory")
gopackage = flag.String("p", "", "write Go source file in this package")
)
type stack struct {
name string
src string
depth int
}
func main() {
log.SetFlags(0)
flag.Usage = usage
flag.Parse()
args := flag.Args()
if len(args) != 2 {
usage()
}
rf, err := os.Open(args[0])
if err != nil {
sysfatal("%v", err)
}
r := bufio.NewScanner(rf)
zf, err := os.Create(args[1])
if err != nil {
sysfatal("%v", err)
}
var w io.Writer = zf
if *gopackage != "" {
fmt.Fprintf(zf, "package %s\n\nfunc init() {\n\tunzip(\"", *gopackage)
gw := &goWriter{b: bufio.NewWriter(w)}
defer func() {
if err := gw.Close(); err != nil {
sysfatal("finishing Go output: %v", err)
}
}()
w = gw
}
z := zip.NewWriter(w)
lineno := 0
addfile := func(info os.FileInfo, dst string, src string) {
zh, err := zip.FileInfoHeader(info)
if err != nil {
sysfatal("%s:%d: %s: %v", args[0], lineno, src, err)
}
zh.Name = dst
zh.Method = zip.Deflate
if info.IsDir() && !strings.HasSuffix(dst, "/") {
zh.Name += "/"
}
w, err := z.CreateHeader(zh)
if err != nil {
sysfatal("%s:%d: %s: %v", args[0], lineno, src, err)
}
if info.IsDir() {
return
}
r, err := os.Open(src)
if err != nil {
sysfatal("%s:%d: %s: %v", args[0], lineno, src, err)
}
defer r.Close()
if _, err := io.Copy(w, r); err != nil {
sysfatal("%s:%d: %s: %v", args[0], lineno, src, err)
}
}
var stk []stack
for r.Scan() {
line := r.Text()
lineno++
s := strings.TrimLeft(line, "\t")
prefix, line := line[:len(line)-len(s)], s
if i := strings.Index(line, "#"); i >= 0 {
line = line[:i]
}
f := strings.Fields(line)
if len(f) == 0 {
continue
}
if strings.HasPrefix(line, " ") {
sysfatal("%s:%d: must use tabs for indentation", args[0], lineno)
}
depth := len(prefix)
for len(stk) > 0 && depth <= stk[len(stk)-1].depth {
stk = stk[:len(stk)-1]
}
parent := ""
psrc := *root
if len(stk) > 0 {
parent = stk[len(stk)-1].name
psrc = stk[len(stk)-1].src
}
if strings.Contains(f[0], "/") {
sysfatal("%s:%d: destination name cannot contain slash", args[0], lineno)
}
name := path.Join(parent, f[0])
src := filepath.Join(psrc, f[0])
for _, attr := range f[1:] {
i := strings.Index(attr, "=")
if i < 0 {
sysfatal("%s:%d: malformed attribute %q", args[0], lineno, attr)
}
key, val := attr[:i], attr[i+1:]
switch key {
case "src":
src = val
default:
sysfatal("%s:%d: unknown attribute %q", args[0], lineno, attr)
}
}
stk = append(stk, stack{name: name, src: src, depth: depth})
if f[0] == "*" || f[0] == "+" {
if f[0] == "*" {
dir, err := ioutil.ReadDir(psrc)
if err != nil {
sysfatal("%s:%d: %v", args[0], lineno, err)
}
for _, d := range dir {
addfile(d, path.Join(parent, d.Name()), filepath.Join(psrc, d.Name()))
}
} else {
err := filepath.Walk(psrc, func(src string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if src == psrc {
return nil
}
if psrc == "." {
psrc = ""
}
name := path.Join(parent, filepath.ToSlash(src[len(psrc):]))
addfile(info, name, src)
return nil
})
if err != nil {
sysfatal("%s:%d: %v", args[0], lineno, err)
}
}
continue
}
fi, err := os.Stat(src)
if err != nil {
sysfatal("%s:%d: %v", args[0], lineno, err)
}
addfile(fi, name, src)
}
if err := z.Close(); err != nil {
sysfatal("finishing zip file: %v", err)
}
}
type goWriter struct {
b *bufio.Writer
}
func (w *goWriter) Write(b []byte) (int, error) {
for _, c := range b {
fmt.Fprintf(w.b, "\\x%02x", c)
}
return len(b), nil
}
func (w *goWriter) Close() error {
fmt.Fprintf(w.b, "\")\n}\n")
w.b.Flush()
return nil
}

0
misc/nacl/testdata/bin/placeholder vendored Normal file
View File

0
misc/nacl/testdata/empty vendored Normal file
View File

8
misc/nacl/testdata/group vendored Normal file
View File

@ -0,0 +1,8 @@
nobody:*:-2:
nogroup:*:-1:
wheel:*:0:root
daemon:*:1:root
kmem:*:2:root
sys:*:3:root
tty:*:4:root
operator:*:5:root

1
misc/nacl/testdata/hosts vendored Normal file
View File

@ -0,0 +1 @@
127.0.0.1 localhost

1596
misc/nacl/testdata/mime.types vendored Normal file

File diff suppressed because it is too large Load Diff

116
misc/nacl/testzip.proto Normal file
View File

@ -0,0 +1,116 @@
etc src=/etc
mime.types src=../misc/nacl/testdata/mime.types
resolv.conf src=../misc/nacl/testdata/empty
group src=../misc/nacl/testdata/group
passwd src=../misc/nacl/testdata/empty
hosts src=../misc/nacl/testdata/hosts
services
usr src=../misc/nacl/testdata
bin
go src=..
src
cmd
gofmt
testdata
+
link
testdata
+
pkg
archive
tar
testdata
+
zip
testdata
+
compress
bzip2
testdata
+
flate
gzip
testdata
+
lzw
testdata
+
zlib
crypto
rsa
testdata
+
tls
testdata
+
debug
dwarf
testdata
+
elf
testdata
+
macho
testdata
+
pe
testdata
+
plan9obj
testdata
+
go
build
+
doc
testdata
+
format
+
parser
+
printer
+
image
testdata
+
draw
gif
jpeg
png
testdata
+
io
+
mime
testdata
+
multipart
testdata
+
net
http
+
testdata
+
os
+
path
filepath
+
regexp
testdata
+
strconv
testdata
+
text
template
testdata
+
lib
time
zoneinfo.zip
test
+

View File

@ -9,7 +9,7 @@ if [ ! -f make.bash ]; then
exit 1 exit 1
fi fi
OLDPATH="$PATH" OLDPATH="$PATH"
. ./make.bash --no-banner . ./make.bash "$@" --no-banner
bash run.bash --no-rebuild bash run.bash --no-rebuild
PATH="$OLDPATH" PATH="$OLDPATH"
$GOTOOLDIR/dist banner # print build info $GOTOOLDIR/dist banner # print build info

View File

@ -92,6 +92,10 @@ func testAddr2Line(t *testing.T, exepath, addr string) {
// This is line 93. The test depends on that. // This is line 93. The test depends on that.
func TestAddr2Line(t *testing.T) { func TestAddr2Line(t *testing.T) {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
syms := loadSyms(t) syms := loadSyms(t)
tmpDir, err := ioutil.TempDir("", "TestAddr2Line") tmpDir, err := ioutil.TempDir("", "TestAddr2Line")

View File

@ -55,6 +55,10 @@ func checkSymbols(t *testing.T, nmoutput []byte) {
} }
func TestNM(t *testing.T) { func TestNM(t *testing.T) {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
tmpDir, err := ioutil.TempDir("", "TestNM") tmpDir, err := ioutil.TempDir("", "TestNM")
if err != nil { if err != nil {
t.Fatal("TempDir failed: ", err) t.Fatal("TempDir failed: ", err)

View File

@ -19,6 +19,10 @@ import (
) )
func loadSyms(t *testing.T) map[string]string { func loadSyms(t *testing.T) map[string]string {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
cmd := exec.Command("go", "tool", "nm", os.Args[0]) cmd := exec.Command("go", "tool", "nm", os.Args[0])
out, err := cmd.CombinedOutput() out, err := cmd.CombinedOutput()
if err != nil { if err != nil {
@ -40,6 +44,10 @@ func loadSyms(t *testing.T) map[string]string {
} }
func runObjDump(t *testing.T, exe, startaddr, endaddr string) (path, lineno string) { func runObjDump(t *testing.T, exe, startaddr, endaddr string) (path, lineno string) {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
cmd := exec.Command(exe, os.Args[0], startaddr, endaddr) cmd := exec.Command(exe, os.Args[0], startaddr, endaddr)
out, err := cmd.CombinedOutput() out, err := cmd.CombinedOutput()
if err != nil { if err != nil {
@ -67,7 +75,7 @@ func runObjDump(t *testing.T, exe, startaddr, endaddr string) (path, lineno stri
return f[0], f[1] return f[0], f[1]
} }
func testObjDump(t *testing.T, exe, startaddr, endaddr string) { func testObjDump(t *testing.T, exe, startaddr, endaddr string, line int) {
srcPath, srcLineNo := runObjDump(t, exe, startaddr, endaddr) srcPath, srcLineNo := runObjDump(t, exe, startaddr, endaddr)
fi1, err := os.Stat("objdump_test.go") fi1, err := os.Stat("objdump_test.go")
if err != nil { if err != nil {
@ -80,13 +88,13 @@ func testObjDump(t *testing.T, exe, startaddr, endaddr string) {
if !os.SameFile(fi1, fi2) { if !os.SameFile(fi1, fi2) {
t.Fatalf("objdump_test.go and %s are not same file", srcPath) t.Fatalf("objdump_test.go and %s are not same file", srcPath)
} }
if srcLineNo != "89" { if srcLineNo != fmt.Sprint(line) {
t.Fatalf("line number = %v; want 89", srcLineNo) t.Fatalf("line number = %v; want %d", srcLineNo, line)
} }
} }
// This is line 88. The test depends on that.
func TestObjDump(t *testing.T) { func TestObjDump(t *testing.T) {
_, _, line, _ := runtime.Caller(0)
syms := loadSyms(t) syms := loadSyms(t)
tmp, exe := buildObjdump(t) tmp, exe := buildObjdump(t)
@ -98,11 +106,15 @@ func TestObjDump(t *testing.T) {
t.Fatalf("invalid start address %v: %v", startaddr, err) t.Fatalf("invalid start address %v: %v", startaddr, err)
} }
endaddr := fmt.Sprintf("%x", addr+10) endaddr := fmt.Sprintf("%x", addr+10)
testObjDump(t, exe, startaddr, endaddr) testObjDump(t, exe, startaddr, endaddr, line-1)
testObjDump(t, exe, "0x"+startaddr, "0x"+endaddr) testObjDump(t, exe, "0x"+startaddr, "0x"+endaddr, line-1)
} }
func buildObjdump(t *testing.T) (tmp, exe string) { func buildObjdump(t *testing.T) (tmp, exe string) {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
tmp, err := ioutil.TempDir("", "TestObjDump") tmp, err := ioutil.TempDir("", "TestObjDump")
if err != nil { if err != nil {
t.Fatal("TempDir failed: ", err) t.Fatal("TempDir failed: ", err)

View File

@ -14,6 +14,7 @@ import (
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"regexp" "regexp"
"runtime"
"testing" "testing"
"time" "time"
"unicode/utf8" "unicode/utf8"
@ -185,6 +186,10 @@ func TestExtract(t *testing.T) {
// Test that pack-created archives can be understood by the tools. // Test that pack-created archives can be understood by the tools.
func TestHello(t *testing.T) { func TestHello(t *testing.T) {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
dir := tmpDir(t) dir := tmpDir(t)
defer os.RemoveAll(dir) defer os.RemoveAll(dir)
hello := filepath.Join(dir, "hello.go") hello := filepath.Join(dir, "hello.go")
@ -217,6 +222,10 @@ func TestHello(t *testing.T) {
// Test that pack works with very long lines in PKGDEF. // Test that pack works with very long lines in PKGDEF.
func TestLargeDefs(t *testing.T) { func TestLargeDefs(t *testing.T) {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
dir := tmpDir(t) dir := tmpDir(t)
defer os.RemoveAll(dir) defer os.RemoveAll(dir)
large := filepath.Join(dir, "large.go") large := filepath.Join(dir, "large.go")

View File

@ -153,6 +153,7 @@ echo "# Building compilers and Go bootstrap tool for host, $GOHOSTOS/$GOHOSTARCH
buildall="-a" buildall="-a"
if [ "$1" = "--no-clean" ]; then if [ "$1" = "--no-clean" ]; then
buildall="" buildall=""
shift
fi fi
./cmd/dist/dist bootstrap $buildall $GO_DISTFLAGS -v # builds go_bootstrap ./cmd/dist/dist bootstrap $buildall $GO_DISTFLAGS -v # builds go_bootstrap
# Delay move of dist tool to now, because bootstrap may clear tool directory. # Delay move of dist tool to now, because bootstrap may clear tool directory.

50
src/nacltest.bash Normal file
View File

@ -0,0 +1,50 @@
#!/bin/bash
# Copyright 2014 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.
# For testing Native Client on builders or locally.
# Builds a test file system and embeds it into package syscall
# in every generated binary.
#
# Assumes that sel_ldr binaries are in $PATH; see ../misc/nacl/README.
set -e
ulimit -c 0
# Check GOARCH.
naclGOARCH=${GOARCH:-386}
case "$naclGOARCH" in
amd64p32)
if ! which sel_ldr_x86_64 >/dev/null; then
echo 'cannot find sel_ldr_x86_64' 1>&2
exit 1
fi
;;
386)
if ! which sel_ldr_x86_32 >/dev/null; then
echo 'cannot find sel_ldr_x86_32' 1>&2
exit 1
fi
;;
*)
echo 'unsupported $GOARCH for nacl: '"$naclGOARCH" 1>&2
exit 1
esac
# Run host build to get toolchain for running zip generator.
unset GOOS GOARCH
if [ ! -f make.bash ]; then
echo 'nacl.bash must be run from $GOROOT/src' 1>&2
exit 1
fi
GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH ./make.bash
# Build zip file embedded in package syscall.
gobin=${GOBIN:-$(pwd)/../bin}
rm -f pkg/syscall/fstest_nacl.go
GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH $gobin/go run ../misc/nacl/mkzip.go -p syscall -r .. ../misc/nacl/testzip.proto pkg/syscall/fstest_nacl.go
# Run standard build and tests.
export PATH=$(pwd)/../misc/nacl:$PATH
GOOS=nacl GOARCH=$naclGOARCH ./all.bash --no-clean

View File

@ -22,6 +22,7 @@ import (
"net" "net"
"os/exec" "os/exec"
"reflect" "reflect"
"runtime"
"testing" "testing"
"time" "time"
) )
@ -727,6 +728,10 @@ func TestParsePEMCRL(t *testing.T) {
} }
func TestImports(t *testing.T) { func TestImports(t *testing.T) {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
if err := exec.Command("go", "run", "x509_test_import.go").Run(); err != nil { if err := exec.Command("go", "run", "x509_test_import.go").Run(); err != nil {
t.Errorf("failed to run x509_test_import.go: %s", err) t.Errorf("failed to run x509_test_import.go: %s", err)
} }

View File

@ -16,6 +16,7 @@ import (
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"os" "os"
"runtime"
"testing" "testing"
"time" "time"
) )
@ -23,6 +24,10 @@ import (
// This test is a CGI host (testing host.go) that runs its own binary // This test is a CGI host (testing host.go) that runs its own binary
// as a child process testing the other half of CGI (child.go). // as a child process testing the other half of CGI (child.go).
func TestHostingOurselves(t *testing.T) { func TestHostingOurselves(t *testing.T) {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
h := &Handler{ h := &Handler{
Path: os.Args[0], Path: os.Args[0],
Root: "/test.go", Root: "/test.go",
@ -87,6 +92,10 @@ func (w *limitWriter) Write(p []byte) (n int, err error) {
// If there's an error copying the child's output to the parent, test // If there's an error copying the child's output to the parent, test
// that we kill the child. // that we kill the child.
func TestKillChildAfterCopyError(t *testing.T) { func TestKillChildAfterCopyError(t *testing.T) {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
defer func() { testHookStartProcess = nil }() defer func() { testHookStartProcess = nil }()
proc := make(chan *os.Process, 1) proc := make(chan *os.Process, 1)
testHookStartProcess = func(p *os.Process) { testHookStartProcess = func(p *os.Process) {
@ -130,6 +139,10 @@ func TestKillChildAfterCopyError(t *testing.T) {
// Test that a child handler writing only headers works. // Test that a child handler writing only headers works.
// golang.org/issue/7196 // golang.org/issue/7196
func TestChildOnlyHeaders(t *testing.T) { func TestChildOnlyHeaders(t *testing.T) {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
h := &Handler{ h := &Handler{
Path: os.Args[0], Path: os.Args[0],
Root: "/test.go", Root: "/test.go",

View File

@ -40,7 +40,7 @@ func packetConnTestData(t *testing.T, net string, i int) ([]byte, func()) {
return b, nil return b, nil
case "unixgram": case "unixgram":
switch runtime.GOOS { switch runtime.GOOS {
case "plan9", "windows": case "nacl", "plan9", "windows":
return nil, func() { return nil, func() {
t.Logf("skipping %q test on %q", net, runtime.GOOS) t.Logf("skipping %q test on %q", net, runtime.GOOS)
} }

View File

@ -236,7 +236,7 @@ func TestIPConnSpecificMethods(t *testing.T) {
func TestUnixListenerSpecificMethods(t *testing.T) { func TestUnixListenerSpecificMethods(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "plan9", "windows": case "nacl", "plan9", "windows":
t.Skipf("skipping test on %q", runtime.GOOS) t.Skipf("skipping test on %q", runtime.GOOS)
} }
@ -278,7 +278,7 @@ func TestUnixListenerSpecificMethods(t *testing.T) {
func TestUnixConnSpecificMethods(t *testing.T) { func TestUnixConnSpecificMethods(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "plan9", "windows": case "nacl", "plan9", "windows":
t.Skipf("skipping test on %q", runtime.GOOS) t.Skipf("skipping test on %q", runtime.GOOS)
} }

View File

@ -16,7 +16,7 @@ import (
func skipServerTest(net, unixsotype, addr string, ipv6, ipv4map, linuxOnly bool) bool { func skipServerTest(net, unixsotype, addr string, ipv6, ipv4map, linuxOnly bool) bool {
switch runtime.GOOS { switch runtime.GOOS {
case "linux": case "linux":
case "plan9", "windows": case "nacl", "plan9", "windows":
// "unix" sockets are not supported on Windows and Plan 9. // "unix" sockets are not supported on Windows and Plan 9.
if net == unixsotype { if net == unixsotype {
return true return true

View File

@ -120,6 +120,9 @@ func TestReadTimeout(t *testing.T) {
t.Fatalf("Read: expected err %v, got %v", errClosing, err) t.Fatalf("Read: expected err %v, got %v", errClosing, err)
} }
default: default:
if err == io.EOF && runtime.GOOS == "nacl" { // close enough; golang.org/issue/8044
break
}
if err != errClosing { if err != errClosing {
t.Fatalf("Read: expected err %v, got %v", errClosing, err) t.Fatalf("Read: expected err %v, got %v", errClosing, err)
} }
@ -708,7 +711,7 @@ func TestProlongTimeout(t *testing.T) {
func TestDeadlineRace(t *testing.T) { func TestDeadlineRace(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "plan9": case "nacl", "plan9":
t.Skipf("skipping test on %q", runtime.GOOS) t.Skipf("skipping test on %q", runtime.GOOS)
} }

View File

@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !plan9,!windows // +build !nacl,!plan9,!windows
package net package net

View File

@ -27,7 +27,10 @@ import (
"time" "time"
) )
func helperCommand(s ...string) *exec.Cmd { func helperCommand(t *testing.T, s ...string) *exec.Cmd {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
cs := []string{"-test.run=TestHelperProcess", "--"} cs := []string{"-test.run=TestHelperProcess", "--"}
cs = append(cs, s...) cs = append(cs, s...)
cmd := exec.Command(os.Args[0], cs...) cmd := exec.Command(os.Args[0], cs...)
@ -36,7 +39,7 @@ func helperCommand(s ...string) *exec.Cmd {
} }
func TestEcho(t *testing.T) { func TestEcho(t *testing.T) {
bs, err := helperCommand("echo", "foo bar", "baz").Output() bs, err := helperCommand(t, "echo", "foo bar", "baz").Output()
if err != nil { if err != nil {
t.Errorf("echo: %v", err) t.Errorf("echo: %v", err)
} }
@ -75,7 +78,7 @@ func TestCommandRelativeName(t *testing.T) {
func TestCatStdin(t *testing.T) { func TestCatStdin(t *testing.T) {
// Cat, testing stdin and stdout. // Cat, testing stdin and stdout.
input := "Input string\nLine 2" input := "Input string\nLine 2"
p := helperCommand("cat") p := helperCommand(t, "cat")
p.Stdin = strings.NewReader(input) p.Stdin = strings.NewReader(input)
bs, err := p.Output() bs, err := p.Output()
if err != nil { if err != nil {
@ -89,7 +92,7 @@ func TestCatStdin(t *testing.T) {
func TestCatGoodAndBadFile(t *testing.T) { func TestCatGoodAndBadFile(t *testing.T) {
// Testing combined output and error values. // Testing combined output and error values.
bs, err := helperCommand("cat", "/bogus/file.foo", "exec_test.go").CombinedOutput() bs, err := helperCommand(t, "cat", "/bogus/file.foo", "exec_test.go").CombinedOutput()
if _, ok := err.(*exec.ExitError); !ok { if _, ok := err.(*exec.ExitError); !ok {
t.Errorf("expected *exec.ExitError from cat combined; got %T: %v", err, err) t.Errorf("expected *exec.ExitError from cat combined; got %T: %v", err, err)
} }
@ -117,7 +120,7 @@ func TestNoExistBinary(t *testing.T) {
func TestExitStatus(t *testing.T) { func TestExitStatus(t *testing.T) {
// Test that exit values are returned correctly // Test that exit values are returned correctly
cmd := helperCommand("exit", "42") cmd := helperCommand(t, "exit", "42")
err := cmd.Run() err := cmd.Run()
want := "exit status 42" want := "exit status 42"
switch runtime.GOOS { switch runtime.GOOS {
@ -140,7 +143,7 @@ func TestPipes(t *testing.T) {
} }
} }
// Cat, testing stdin and stdout. // Cat, testing stdin and stdout.
c := helperCommand("pipetest") c := helperCommand(t, "pipetest")
stdin, err := c.StdinPipe() stdin, err := c.StdinPipe()
check("StdinPipe", err) check("StdinPipe", err)
stdout, err := c.StdoutPipe() stdout, err := c.StdoutPipe()
@ -193,7 +196,7 @@ func TestStdinClose(t *testing.T) {
t.Fatalf("%s: %v", what, err) t.Fatalf("%s: %v", what, err)
} }
} }
cmd := helperCommand("stdinClose") cmd := helperCommand(t, "stdinClose")
stdin, err := cmd.StdinPipe() stdin, err := cmd.StdinPipe()
check("StdinPipe", err) check("StdinPipe", err)
// Check that we can access methods of the underlying os.File.` // Check that we can access methods of the underlying os.File.`
@ -313,7 +316,7 @@ func TestExtraFilesFDShuffle(t *testing.T) {
// Moving this test case around within the overall tests may // Moving this test case around within the overall tests may
// affect the FDs obtained and hence the checks to catch these cases. // affect the FDs obtained and hence the checks to catch these cases.
npipes := 2 npipes := 2
c := helperCommand("extraFilesAndPipes", strconv.Itoa(npipes+1)) c := helperCommand(t, "extraFilesAndPipes", strconv.Itoa(npipes+1))
rd, wr, _ := os.Pipe() rd, wr, _ := os.Pipe()
defer rd.Close() defer rd.Close()
if rd.Fd() != 3 { if rd.Fd() != 3 {
@ -440,7 +443,7 @@ func TestExtraFiles(t *testing.T) {
t.Fatalf("Seek: %v", err) t.Fatalf("Seek: %v", err)
} }
c := helperCommand("read3") c := helperCommand(t, "read3")
var stdout, stderr bytes.Buffer var stdout, stderr bytes.Buffer
c.Stdout = &stdout c.Stdout = &stdout
c.Stderr = &stderr c.Stderr = &stderr
@ -483,10 +486,10 @@ func TestExtraFilesRace(t *testing.T) {
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
la := listen() la := listen()
ca := helperCommand("describefiles") ca := helperCommand(t, "describefiles")
ca.ExtraFiles = []*os.File{listenerFile(la)} ca.ExtraFiles = []*os.File{listenerFile(la)}
lb := listen() lb := listen()
cb := helperCommand("describefiles") cb := helperCommand(t, "describefiles")
cb.ExtraFiles = []*os.File{listenerFile(lb)} cb.ExtraFiles = []*os.File{listenerFile(lb)}
ares := make(chan string) ares := make(chan string)
bres := make(chan string) bres := make(chan string)

View File

@ -496,10 +496,10 @@ func TestHardLink(t *testing.T) {
} }
} }
func TestSymLink(t *testing.T) { func TestSymlink(t *testing.T) {
// Symlinks are not supported under windows or Plan 9. switch runtime.GOOS {
if runtime.GOOS == "windows" || runtime.GOOS == "plan9" { case "windows", "plan9", "nacl":
return t.Skipf("skipping on %s", runtime.GOOS)
} }
from, to := "symlinktestfrom", "symlinktestto" from, to := "symlinktestfrom", "symlinktestto"
Remove(from) // Just in case. Remove(from) // Just in case.
@ -559,9 +559,9 @@ func TestSymLink(t *testing.T) {
} }
func TestLongSymlink(t *testing.T) { func TestLongSymlink(t *testing.T) {
// Symlinks are not supported under windows or Plan 9. switch runtime.GOOS {
if runtime.GOOS == "windows" || runtime.GOOS == "plan9" { case "windows", "plan9", "nacl":
return t.Skipf("skipping on %s", runtime.GOOS)
} }
s := "0123456789abcdef" s := "0123456789abcdef"
// Long, but not too long: a common limit is 255. // Long, but not too long: a common limit is 255.
@ -630,6 +630,10 @@ func exec(t *testing.T, dir, cmd string, args []string, expect string) {
} }
func TestStartProcess(t *testing.T) { func TestStartProcess(t *testing.T) {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
var dir, cmd string var dir, cmd string
var args []string var args []string
if runtime.GOOS == "windows" { if runtime.GOOS == "windows" {
@ -703,9 +707,11 @@ func TestFTruncate(t *testing.T) {
checkSize(t, f, 1024) checkSize(t, f, 1024)
f.Truncate(0) f.Truncate(0)
checkSize(t, f, 0) checkSize(t, f, 0)
f.Write([]byte("surprise!")) _, err := f.Write([]byte("surprise!"))
if err == nil {
checkSize(t, f, 13+9) // wrote at offset past where hello, world was. checkSize(t, f, 13+9) // wrote at offset past where hello, world was.
} }
}
func TestTruncate(t *testing.T) { func TestTruncate(t *testing.T) {
f := newFile("TestTruncate", t) f := newFile("TestTruncate", t)
@ -721,9 +727,11 @@ func TestTruncate(t *testing.T) {
checkSize(t, f, 1024) checkSize(t, f, 1024)
Truncate(f.Name(), 0) Truncate(f.Name(), 0)
checkSize(t, f, 0) checkSize(t, f, 0)
f.Write([]byte("surprise!")) _, err := f.Write([]byte("surprise!"))
if err == nil {
checkSize(t, f, 13+9) // wrote at offset past where hello, world was. checkSize(t, f, 13+9) // wrote at offset past where hello, world was.
} }
}
// Use TempDir() to make sure we're on a local file system, // Use TempDir() to make sure we're on a local file system,
// so that timings are not distorted by latency and caching. // so that timings are not distorted by latency and caching.
@ -757,13 +765,13 @@ func TestChtimes(t *testing.T) {
} }
postStat := st postStat := st
/* Plan 9: /* Plan 9, NaCl:
Mtime is the time of the last change of content. Similarly, atime is set whenever the Mtime is the time of the last change of content. Similarly, atime is set whenever the
contents are accessed; also, it is set whenever mtime is set. contents are accessed; also, it is set whenever mtime is set.
*/ */
pat := Atime(postStat) pat := Atime(postStat)
pmt := postStat.ModTime() pmt := postStat.ModTime()
if !pat.Before(at) && runtime.GOOS != "plan9" { if !pat.Before(at) && runtime.GOOS != "plan9" && runtime.GOOS != "nacl" {
t.Errorf("AccessTime didn't go backwards; was=%d, after=%d", at, pat) t.Errorf("AccessTime didn't go backwards; was=%d, after=%d", at, pat)
} }
@ -965,8 +973,9 @@ func run(t *testing.T, cmd []string) string {
func TestHostname(t *testing.T) { func TestHostname(t *testing.T) {
// There is no other way to fetch hostname on windows, but via winapi. // There is no other way to fetch hostname on windows, but via winapi.
// On Plan 9 it is can be taken from #c/sysname as Hostname() does. // On Plan 9 it is can be taken from #c/sysname as Hostname() does.
if runtime.GOOS == "windows" || runtime.GOOS == "plan9" { switch runtime.GOOS {
return case "windows", "plan9", "nacl":
t.Skipf("skipping on %s", runtime.GOOS)
} }
// Check internal Hostname() against the output of /bin/hostname. // Check internal Hostname() against the output of /bin/hostname.
@ -1225,6 +1234,10 @@ func TestReadAtEOF(t *testing.T) {
} }
func testKillProcess(t *testing.T, processKiller func(p *Process)) { func testKillProcess(t *testing.T, processKiller func(p *Process)) {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
dir, err := ioutil.TempDir("", "go-build") dir, err := ioutil.TempDir("", "go-build")
if err != nil { if err != nil {
t.Fatalf("Failed to create temp directory: %v", err) t.Fatalf("Failed to create temp directory: %v", err)

View File

@ -167,8 +167,9 @@ func TestRemoveAll(t *testing.T) {
} }
func TestMkdirAllWithSymlink(t *testing.T) { func TestMkdirAllWithSymlink(t *testing.T) {
if runtime.GOOS == "windows" || runtime.GOOS == "plan9" { switch runtime.GOOS {
t.Skip("Skipping test: symlinks don't exist under Windows/Plan 9") case "nacl", "plan9", "windows":
t.Skipf("skipping on %s", runtime.GOOS)
} }
tmpDir, err := ioutil.TempDir("", "TestMkdirAllWithSymlink-") tmpDir, err := ioutil.TempDir("", "TestMkdirAllWithSymlink-")

View File

@ -167,11 +167,10 @@ var globSymlinkTests = []struct {
func TestGlobSymlink(t *testing.T) { func TestGlobSymlink(t *testing.T) {
switch runtime.GOOS { switch runtime.GOOS {
case "windows", "plan9": case "nacl", "plan9", "windows":
// The tests below are Unix specific so we skip plan9, which does not t.Skipf("skipping on %s", runtime.GOOS)
// support symlinks, and windows.
t.Skipf("skipping test on %v", runtime.GOOS)
} }
tmpDir, err := ioutil.TempDir("", "globsymlink") tmpDir, err := ioutil.TempDir("", "globsymlink")
if err != nil { if err != nil {
t.Fatal("creating temp dir:", err) t.Fatal("creating temp dir:", err)

View File

@ -691,8 +691,9 @@ func simpleJoin(dir, path string) string {
} }
func TestEvalSymlinks(t *testing.T) { func TestEvalSymlinks(t *testing.T) {
if runtime.GOOS == "plan9" { switch runtime.GOOS {
t.Skip("Skipping test: symlinks don't exist under Plan 9") case "nacl", "plan9":
t.Skipf("skipping on %s", runtime.GOOS)
} }
tmpDir, err := ioutil.TempDir("", "evalsymlink") tmpDir, err := ioutil.TempDir("", "evalsymlink")

View File

@ -302,7 +302,7 @@ TEXT reflect·call(SB), NOSPLIT, $0-20
JMP AX JMP AX
#define CALLFN(NAME,MAXSIZE) \ #define CALLFN(NAME,MAXSIZE) \
TEXT runtime·NAME(SB), WRAPPER, $MAXSIZE-12; \ TEXT runtime·NAME(SB), WRAPPER, $MAXSIZE-16; \
/* copy arguments to stack */ \ /* copy arguments to stack */ \
MOVL argptr+4(FP), SI; \ MOVL argptr+4(FP), SI; \
MOVL argsize+8(FP), CX; \ MOVL argsize+8(FP), CX; \
@ -315,7 +315,11 @@ TEXT runtime·NAME(SB), WRAPPER, $MAXSIZE-12; \
/* copy return values back */ \ /* copy return values back */ \
MOVL argptr+4(FP), DI; \ MOVL argptr+4(FP), DI; \
MOVL argsize+8(FP), CX; \ MOVL argsize+8(FP), CX; \
MOVL retoffset+12(FP), BX; \
MOVL SP, SI; \ MOVL SP, SI; \
ADDL BX, DI; \
ADDL BX, SI; \
SUBL BX, CX; \
REP;MOVSB; \ REP;MOVSB; \
RET RET

View File

@ -9,6 +9,7 @@ import (
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"runtime"
"strings" "strings"
"testing" "testing"
"text/template" "text/template"
@ -31,6 +32,10 @@ func testEnv(cmd *exec.Cmd) *exec.Cmd {
} }
func executeTest(t *testing.T, templ string, data interface{}) string { func executeTest(t *testing.T, templ string, data interface{}) string {
if runtime.GOOS == "nacl" {
t.Skip("skipping on nacl")
}
checkStaleRuntime(t) checkStaleRuntime(t)
st := template.Must(template.New("crashSource").Parse(templ)) st := template.Must(template.New("crashSource").Parse(templ))

View File

@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build !nacl
package pprof_test package pprof_test
import ( import (

View File

@ -95,6 +95,10 @@ func BenchmarkDeferMany(b *testing.B) {
// The value reported will include the padding between runtime.gogo and the // The value reported will include the padding between runtime.gogo and the
// next function in memory. That's fine. // next function in memory. That's fine.
func TestRuntimeGogoBytes(t *testing.T) { func TestRuntimeGogoBytes(t *testing.T) {
if GOOS == "nacl" {
t.Skip("skipping on nacl")
}
dir, err := ioutil.TempDir("", "go-build") dir, err := ioutil.TempDir("", "go-build")
if err != nil { if err != nil {
t.Fatalf("failed to create temp directory: %v", err) t.Fatalf("failed to create temp directory: %v", err)
@ -183,6 +187,10 @@ func TestSetPanicOnFault(t *testing.T) {
} }
func testSetPanicOnFault(t *testing.T, addr uintptr) { func testSetPanicOnFault(t *testing.T, addr uintptr) {
if GOOS == "nacl" {
t.Skip("nacl doesn't seem to fault on high addresses")
}
defer func() { defer func() {
if err := recover(); err == nil { if err := recover(); err == nil {
t.Fatalf("did not find error in recover") t.Fatalf("did not find error in recover")

View File

@ -34,7 +34,7 @@ fi
# allow all.bash to avoid double-build of everything # allow all.bash to avoid double-build of everything
rebuild=true rebuild=true
if [ "$1" = "--no-rebuild" ]; then if [ "$1" == "--no-rebuild" ]; then
shift shift
else else
echo '# Building packages and commands.' echo '# Building packages and commands.'
@ -178,15 +178,18 @@ go run main.go || exit 1
./test.bash || exit 1 ./test.bash || exit 1
) || exit $? ) || exit $?
[ "$GOOS" == nacl ] ||
(xcd ../doc/progs (xcd ../doc/progs
time ./run || exit 1 time ./run || exit 1
) || exit $? ) || exit $?
[ "$GOOS" == nacl ] ||
[ "$GOARCH" == arm ] || # uses network, fails under QEMU [ "$GOARCH" == arm ] || # uses network, fails under QEMU
(xcd ../doc/articles/wiki (xcd ../doc/articles/wiki
./test.bash || exit 1 ./test.bash || exit 1
) || exit $? ) || exit $?
[ "$GOOS" == nacl ] ||
(xcd ../doc/codewalk (xcd ../doc/codewalk
time ./run || exit 1 time ./run || exit 1
) || exit $? ) || exit $?
@ -196,6 +199,7 @@ echo '#' ../misc/goplay
go build ../misc/goplay go build ../misc/goplay
rm -f goplay rm -f goplay
[ "$GOOS" == nacl ] ||
[ "$GOARCH" == arm ] || [ "$GOARCH" == arm ] ||
(xcd ../test/bench/shootout (xcd ../test/bench/shootout
time ./timing.sh -test || exit 1 time ./timing.sh -test || exit 1
@ -210,12 +214,17 @@ go test ../test/bench/go1 || exit 1
(xcd ../test (xcd ../test
unset GOMAXPROCS unset GOMAXPROCS
time go run run.go || exit 1 GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH go build -o runtest run.go || exit 1
time ./runtest || exit 1
rm -f runtest
) || exit $?
[ "$GOOS" == nacl ] ||
(
echo
echo '# Checking API compatibility.'
time go run $GOROOT/src/cmd/api/run.go || exit 1
) || exit $? ) || exit $?
echo
echo '# Checking API compatibility.'
time go run $GOROOT/src/cmd/api/run.go
echo echo
echo ALL TESTS PASSED echo ALL TESTS PASSED

View File

@ -1,5 +1,7 @@
// run // run
// +build !nacl
// Copyright 2011 The Go Authors. All rights reserved. // Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
@ -36,7 +38,7 @@ func main() {
} }
runtime.ReadMemStats(memstats) runtime.ReadMemStats(memstats)
obj := memstats.HeapObjects - st.HeapObjects obj := int64(memstats.HeapObjects - st.HeapObjects)
if obj > N/5 { if obj > N/5 {
fmt.Println("too many objects left:", obj) fmt.Println("too many objects left:", obj)
os.Exit(1) os.Exit(1)

View File

@ -1,5 +1,7 @@
// run // run
// +build !nacl
// Copyright 2014 The Go Authors. All rights reserved. // Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
@ -273,7 +275,6 @@ TestCases:
ioutil.WriteFile(filepath.Join(dir, "asm.s"), buf.Bytes(), 0666) ioutil.WriteFile(filepath.Join(dir, "asm.s"), buf.Bytes(), 0666)
cmd := exec.Command("go", "build") cmd := exec.Command("go", "build")
cmd.Dir = dir cmd.Dir = dir
output, err := cmd.CombinedOutput() output, err := cmd.CombinedOutput()