Commit 822f832d authored by Hiroshi Ioka's avatar Hiroshi Ioka Committed by David Crawshaw

cmd/nm: add test case for go archives

Also, rename some test cases, check (*os.File).Close

For #21706

Change-Id: Ie60c4d345b2259736c823dc6001c08affcdd86e7
Reviewed-on: https://go-review.googlesource.com/64510Reviewed-by: default avatarDavid Crawshaw <crawshaw@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent cd0a5f08
...@@ -11,13 +11,6 @@ import ( ...@@ -11,13 +11,6 @@ import (
"testing" "testing"
) )
func TestInternalLinkerCgoFile(t *testing.T) {
if !canInternalLink() {
t.Skip("skipping; internal linking is not supported")
}
testGoFile(t, true, false)
}
func canInternalLink() bool { func canInternalLink() bool {
switch runtime.GOOS { switch runtime.GOOS {
case "dragonfly": case "dragonfly":
...@@ -31,6 +24,13 @@ func canInternalLink() bool { ...@@ -31,6 +24,13 @@ func canInternalLink() bool {
return true return true
} }
func TestExternalLinkerCgoFile(t *testing.T) { func TestInternalLinkerCgoExec(t *testing.T) {
testGoFile(t, true, true) if !canInternalLink() {
t.Skip("skipping; internal linking is not supported")
}
testGoExec(t, true, false)
}
func TestExternalLinkerCgoExec(t *testing.T) {
testGoExec(t, true, true)
} }
...@@ -54,7 +54,7 @@ func testMain(m *testing.M) int { ...@@ -54,7 +54,7 @@ func testMain(m *testing.M) int {
return m.Run() return m.Run()
} }
func TestNonGoFiles(t *testing.T) { func TestNonGoExecs(t *testing.T) {
testfiles := []string{ testfiles := []string{
"elf/testdata/gcc-386-freebsd-exec", "elf/testdata/gcc-386-freebsd-exec",
"elf/testdata/gcc-amd64-linux-exec", "elf/testdata/gcc-amd64-linux-exec",
...@@ -75,8 +75,8 @@ func TestNonGoFiles(t *testing.T) { ...@@ -75,8 +75,8 @@ func TestNonGoFiles(t *testing.T) {
} }
} }
func testGoFile(t *testing.T, iscgo, isexternallinker bool) { func testGoExec(t *testing.T, iscgo, isexternallinker bool) {
tmpdir, err := ioutil.TempDir("", "TestGoFile") tmpdir, err := ioutil.TempDir("", "TestGoExec")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
...@@ -87,12 +87,13 @@ func testGoFile(t *testing.T, iscgo, isexternallinker bool) { ...@@ -87,12 +87,13 @@ func testGoFile(t *testing.T, iscgo, isexternallinker bool) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
err = template.Must(template.New("main").Parse(testprog)).Execute(file, iscgo) err = template.Must(template.New("main").Parse(testexec)).Execute(file, iscgo)
if e := file.Close(); err == nil {
err = e
}
if err != nil { if err != nil {
file.Close()
t.Fatal(err) t.Fatal(err)
} }
file.Close()
exe := filepath.Join(tmpdir, "a.exe") exe := filepath.Join(tmpdir, "a.exe")
args := []string{"build", "-o", exe} args := []string{"build", "-o", exe}
...@@ -156,11 +157,101 @@ func testGoFile(t *testing.T, iscgo, isexternallinker bool) { ...@@ -156,11 +157,101 @@ func testGoFile(t *testing.T, iscgo, isexternallinker bool) {
} }
} }
func TestGoFile(t *testing.T) { func TestGoExec(t *testing.T) {
testGoFile(t, false, false) testGoExec(t, false, false)
} }
const testprog = ` func testGoLib(t *testing.T) {
tmpdir, err := ioutil.TempDir("", "TestGoLib")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tmpdir)
gopath := filepath.Join(tmpdir, "gopath")
libpath := filepath.Join(gopath, "src", "mylib")
err = os.MkdirAll(libpath, 0777)
if err != nil {
t.Fatal(err)
}
src := filepath.Join(libpath, "a.go")
file, err := os.Create(src)
if err != nil {
t.Fatal(err)
}
err = template.Must(template.New("mylib").Parse(testlib)).Execute(file, nil)
if e := file.Close(); err == nil {
err = e
}
if err != nil {
t.Fatal(err)
}
args := []string{"install", "mylib"}
cmd := exec.Command(testenv.GoToolPath(t), args...)
cmd.Env = append(os.Environ(), "GOPATH="+gopath)
out, err := cmd.CombinedOutput()
if err != nil {
t.Fatalf("building test lib failed: %s %s", err, out)
}
pat := filepath.Join(gopath, "pkg", "*", "mylib.a")
ms, err := filepath.Glob(pat)
if err != nil {
t.Fatal(err)
}
if len(ms) == 0 {
t.Fatalf("cannot found paths for pattern %s", pat)
}
mylib := ms[0]
out, err = exec.Command(testnmpath, mylib).CombinedOutput()
if err != nil {
t.Fatalf("go tool nm: %v\n%s", err, string(out))
}
type symType struct {
Type string
Name string
Found bool
}
var syms = []symType{
{"B", "%22%22.Testdata", false},
{"T", "%22%22.Testfunc", false},
}
scanner := bufio.NewScanner(bytes.NewBuffer(out))
for scanner.Scan() {
f := strings.Fields(scanner.Text())
if len(f) < 3 {
continue
}
typ := f[1]
name := f[2]
for i := range syms {
sym := &syms[i]
if sym.Type == typ && sym.Name == name {
if sym.Found {
t.Fatalf("duplicate symbol %s %s", sym.Type, sym.Name)
}
sym.Found = true
}
}
}
err = scanner.Err()
if err != nil {
t.Fatalf("error reading nm output: %v", err)
}
for _, sym := range syms {
if !sym.Found {
t.Errorf("cannot found symbol %s %s", sym.Type, sym.Name)
}
}
}
func TestGoLib(t *testing.T) {
testGoLib(t)
}
const testexec = `
package main package main
import "fmt" import "fmt"
...@@ -179,3 +270,11 @@ func testfunc() { ...@@ -179,3 +270,11 @@ func testfunc() {
fmt.Printf("testdata=%p\n", &testdata) fmt.Printf("testdata=%p\n", &testdata)
} }
` `
const testlib = `
package mylib
var Testdata uint32
func Testfunc() {}
`
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment