diff options
author | Michael Stapelberg <stapelberg@debian.org> | 2013-05-14 18:39:35 +0200 |
---|---|---|
committer | Michael Stapelberg <michael@stapelberg.de> | 2013-05-14 18:39:35 +0200 |
commit | efcc50dfdc94c82ee0292bf71992ecb7c0123061 (patch) | |
tree | 17dca99d1dc7fc4e9fe49c2cf6a99d337d4c039f /misc/cgo/test | |
parent | 04b08da9af0c450d645ab7389d1467308cfc2db8 (diff) | |
download | golang-efcc50dfdc94c82ee0292bf71992ecb7c0123061.tar.gz |
Imported Upstream version 1.1upstream/1.1
Diffstat (limited to 'misc/cgo/test')
-rw-r--r-- | misc/cgo/test/callback.go | 43 | ||||
-rw-r--r-- | misc/cgo/test/cflags.go | 32 | ||||
-rw-r--r-- | misc/cgo/test/cgo_test.go | 3 | ||||
-rw-r--r-- | misc/cgo/test/cthread.go | 6 | ||||
-rw-r--r-- | misc/cgo/test/issue4029.go | 9 | ||||
-rw-r--r-- | misc/cgo/test/issue5227.go | 38 |
6 files changed, 122 insertions, 9 deletions
diff --git a/misc/cgo/test/callback.go b/misc/cgo/test/callback.go index 4f5d3f855..b6e2e3c1c 100644 --- a/misc/cgo/test/callback.go +++ b/misc/cgo/test/callback.go @@ -12,7 +12,9 @@ import "C" import ( "./backdoor" + "path" "runtime" + "strings" "testing" "unsafe" ) @@ -136,3 +138,44 @@ func testBlocking(t *testing.T) { } }) } + +// Test that the stack can be unwound through a call out and call back +// into Go. +func testCallbackCallers(t *testing.T) { + pc := make([]uintptr, 100) + n := 0 + name := []string{ + "test.goCallback", + "runtime.cgocallbackg", + "runtime.cgocallback_gofunc", + "return", + "runtime.cgocall", + "test._Cfunc_callback", + "test.nestedCall", + "test.testCallbackCallers", + "test.TestCallbackCallers", + "testing.tRunner", + "runtime.goexit", + } + nestedCall(func() { + n = runtime.Callers(2, pc) + }) + if n != len(name) { + t.Errorf("expected %d frames, got %d", len(name), n) + } + for i := 0; i < n; i++ { + f := runtime.FuncForPC(pc[i]) + if f == nil { + t.Fatalf("expected non-nil Func for pc %p", pc[i]) + } + fname := f.Name() + // Remove the prepended pathname from automatically + // generated cgo function names. + if strings.HasPrefix(fname, "_") { + fname = path.Base(f.Name()[1:]) + } + if fname != name[i] { + t.Errorf("expected function name %s, got %s", name[i], fname) + } + } +} diff --git a/misc/cgo/test/cflags.go b/misc/cgo/test/cflags.go new file mode 100644 index 000000000..24caab471 --- /dev/null +++ b/misc/cgo/test/cflags.go @@ -0,0 +1,32 @@ +// Copyright 2013 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. + +// Test that the #cgo CFLAGS directive works, +// with and without platform filters. +// See http://code.google.com/p/go/issues/detail?id=5224 for details. +package cgotest + +/* +#cgo CFLAGS: -DCOMMON_VALUE=123 +#cgo windows CFLAGS: -DIS_WINDOWS=1 +#cgo !windows CFLAGS: -DIS_WINDOWS=0 +int common = COMMON_VALUE; +int is_windows = IS_WINDOWS; +*/ +import "C" + +import ( + "runtime" + "testing" +) + +func testCflags(t *testing.T) { + is_windows := C.is_windows == 1 + if is_windows != (runtime.GOOS == "windows") { + t.Errorf("is_windows: %v, runtime.GOOS: %s", is_windows, runtime.GOOS) + } + if C.common != 123 { + t.Errorf("common: %v (expected 123)", C.common) + } +} diff --git a/misc/cgo/test/cgo_test.go b/misc/cgo/test/cgo_test.go index 536fa507a..56e1a0625 100644 --- a/misc/cgo/test/cgo_test.go +++ b/misc/cgo/test/cgo_test.go @@ -36,5 +36,8 @@ func TestBoolAlign(t *testing.T) { testBoolAlign(t) } func Test3729(t *testing.T) { test3729(t) } func Test3775(t *testing.T) { test3775(t) } func TestCthread(t *testing.T) { testCthread(t) } +func TestCallbackCallers(t *testing.T) { testCallbackCallers(t) } +func Test5227(t *testing.T) { test5227(t) } +func TestCflags(t *testing.T) { testCflags(t) } func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) } diff --git a/misc/cgo/test/cthread.go b/misc/cgo/test/cthread.go index d918d033f..68d4a03ea 100644 --- a/misc/cgo/test/cthread.go +++ b/misc/cgo/test/cthread.go @@ -8,7 +8,6 @@ package cgotest import "C" import ( - "runtime" "sync" "testing" ) @@ -31,10 +30,7 @@ func Add(x int) { } func testCthread(t *testing.T) { - if runtime.GOARCH == "arm" { - t.Skip("testCthread disabled on arm") - } - + sum.i = 0 C.doAdd(10, 6) want := 10 * (10 - 1) / 2 * 6 diff --git a/misc/cgo/test/issue4029.go b/misc/cgo/test/issue4029.go index 7495d38fe..b0385eb85 100644 --- a/misc/cgo/test/issue4029.go +++ b/misc/cgo/test/issue4029.go @@ -47,14 +47,15 @@ func test4029(t *testing.T) { func loadThySelf(t *testing.T, symbol string) { this_process := C.dlopen(nil, C.RTLD_NOW) if this_process == nil { - t.Fatal("dlopen:", C.GoString(C.dlerror())) + t.Error("dlopen:", C.GoString(C.dlerror())) + return } defer C.dlclose(this_process) symbol_address := C.dlsym(this_process, C.CString(symbol)) if symbol_address == nil { - t.Fatal("dlsym:", C.GoString(C.dlerror())) - } else { - t.Log(symbol, symbol_address) + t.Error("dlsym:", C.GoString(C.dlerror())) + return } + t.Log(symbol, symbol_address) } diff --git a/misc/cgo/test/issue5227.go b/misc/cgo/test/issue5227.go new file mode 100644 index 000000000..336c4c609 --- /dev/null +++ b/misc/cgo/test/issue5227.go @@ -0,0 +1,38 @@ +// Copyright 2013 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. + +// Issue 5227: linker incorrectly treats common symbols and +// leaves them undefined. + +package cgotest + +/* +typedef struct { + int Count; +} Fontinfo; + +Fontinfo SansTypeface; + +extern void init(); + +Fontinfo loadfont() { + Fontinfo f = {0}; + return f; +} + +void init() { + SansTypeface = loadfont(); +} +*/ +import "C" + +import "testing" + +func test5227(t *testing.T) { + C.init() +} + +func selectfont() C.Fontinfo { + return C.SansTypeface +} |