| package tests |
| |
| import ( |
| "testing" |
| "time" |
| ) |
| |
| func inner(ch chan struct{}, b bool) ([]byte, error) { |
| // ensure gopherjs thinks that this inner function can block |
| if b { |
| <-ch |
| } |
| return []byte{}, nil |
| } |
| |
| // this function's call to inner never blocks, but the deferred |
| // statement does. |
| func outer(ch chan struct{}, b bool) ([]byte, error) { |
| defer func() { |
| <-ch |
| }() |
| |
| return inner(ch, b) |
| } |
| |
| func TestBlockingInDefer(t *testing.T) { |
| defer func() { |
| if x := recover(); x != nil { |
| t.Errorf("run time panic: %v", x) |
| } |
| }() |
| |
| ch := make(chan struct{}) |
| b := false |
| |
| go func() { |
| time.Sleep(5 * time.Millisecond) |
| ch <- struct{}{} |
| }() |
| |
| outer(ch, b) |
| } |