diff options
| author | Pieter Droogendijk <pieter@binky.org.uk> | 2013-07-29 19:43:08 +0400 |
|---|---|---|
| committer | Dmitriy Vyukov <dvyukov@google.com> | 2013-07-29 19:43:08 +0400 |
| commit | 6350e45892b5b0189fe3461ba1e7f530da23ff8f (patch) | |
| tree | fe90ee9ca61e20117ea8e420d3df9fac029e7f5d /src/pkg/runtime/mfinal_test.go | |
| parent | 3398322d5ebaf7b870f07aebae92fc2fd047704c (diff) | |
| download | go-6350e45892b5b0189fe3461ba1e7f530da23ff8f.tar.xz | |
runtime: allow SetFinalizer with a func(interface{})
Fixes #5368.
R=golang-dev, dvyukov
CC=golang-dev, rsc
https://golang.org/cl/11858043
Diffstat (limited to 'src/pkg/runtime/mfinal_test.go')
| -rw-r--r-- | src/pkg/runtime/mfinal_test.go | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/pkg/runtime/mfinal_test.go b/src/pkg/runtime/mfinal_test.go index de632717a5..98874a5c74 100644 --- a/src/pkg/runtime/mfinal_test.go +++ b/src/pkg/runtime/mfinal_test.go @@ -9,8 +9,94 @@ import ( "sync" "sync/atomic" "testing" + "time" ) +func TestFinalizerTypeSucceed(t *testing.T) { + if runtime.GOARCH != "amd64" { + t.Skipf("Skipping on non-amd64 machine") + } + ch := make(chan bool) + func() { + v := new(int) + *v = 97531 + runtime.SetFinalizer(v, func(v *int) { + if *v != 97531 { + t.Errorf("*int in finalizer has the wrong value: %d\n", *v) + } + close(ch) + }) + v = nil + }() + runtime.GC() + select { + case <-ch: + case <-time.After(time.Second * 4): + t.Errorf("Finalizer set by SetFinalizer(*int, func(*int)) didn't run") + } +} + +func TestFinalizerInterface(t *testing.T) { + if runtime.GOARCH != "amd64" { + t.Skipf("Skipping on non-amd64 machine") + } + ch := make(chan bool) + func() { + v := new(int) + *v = 97531 + runtime.SetFinalizer(v, func(v interface{}) { + i, ok := v.(*int) + if !ok { + t.Errorf("Expected *int from interface{} in finalizer, got %v", *i) + } + if *i != 97531 { + t.Errorf("*int from interface{} has the wrong value: %d\n", *i) + } + close(ch) + }) + v = nil + }() + runtime.GC() + select { + case <-ch: + case <-time.After(time.Second * 4): + t.Errorf("Finalizer set by SetFinalizer(*int, func(interface{})) didn't run") + } +} + +type bigValue struct { + fill uint64 + it bool + up string +} + +func TestFinalizerInterfaceBig(t *testing.T) { + if runtime.GOARCH != "amd64" { + t.Skipf("Skipping on non-amd64 machine") + } + ch := make(chan bool) + func() { + v := &bigValue{0xDEADBEEFDEADBEEF, true, "It matters not how strait the gate"} + runtime.SetFinalizer(v, func(v interface{}) { + i, ok := v.(*bigValue) + if !ok { + t.Errorf("Expected *bigValue from interface{} in finalizer, got %v", *i) + } + if i.fill != 0xDEADBEEFDEADBEEF && i.it != true && i.up != "It matters not how strait the gate" { + t.Errorf("*bigValue from interface{} has the wrong value: %d\n", *i) + } + close(ch) + }) + v = nil + }() + runtime.GC() + select { + case <-ch: + case <-time.After(time.Second * 4): + t.Errorf("Finalizer set by SetFinalizer(*bigValue, func(interface{})) didn't run") + } +} + func fin(v *int) { } |
