Commit 47b835e4 authored by Robert Griesemer's avatar Robert Griesemer

channel tests: added a couple of tests with closed channels

R=rsc
CC=golang-dev
https://golang.org/cl/1774047
parent a3855235
...@@ -25,7 +25,7 @@ func testPanic(signal string, f func()) { ...@@ -25,7 +25,7 @@ func testPanic(signal string, f func()) {
defer func() { defer func() {
s := never s := never
if recover() != nil { if recover() != nil {
s = always // f panicked s = always // f panicked
} }
if s != signal { if s != signal {
panic(signal + " panic") panic(signal + " panic")
...@@ -55,6 +55,8 @@ func testBlock(signal string, f func()) { ...@@ -55,6 +55,8 @@ func testBlock(signal string, f func()) {
func main() { func main() {
const async = 1 // asynchronous channels const async = 1 // asynchronous channels
var nilch chan int var nilch chan int
closedch := make(chan int)
close(closedch)
// sending/receiving from a nil channel outside a select panics // sending/receiving from a nil channel outside a select panics
testPanic(always, func() { testPanic(always, func() {
...@@ -86,6 +88,24 @@ func main() { ...@@ -86,6 +88,24 @@ func main() {
ch <- 7 ch <- 7
}) })
// receiving (a small number of times) from a closed channel never blocks
testBlock(never, func() {
for i := 0; i < 10; i++ {
if <-closedch != 0 {
panic("expected zero value when reading from closed channel")
}
}
})
// sending (a small number of times) to a closed channel is not specified
// but the current implementation doesn't block: test that different
// implementations behave the same
testBlock(never, func() {
for i := 0; i < 10; i++ {
closedch <- 7
}
})
// receiving from a non-ready channel always blocks // receiving from a non-ready channel always blocks
testBlock(always, func() { testBlock(always, func() {
ch := make(chan int) ch := make(chan int)
...@@ -173,4 +193,16 @@ func main() { ...@@ -173,4 +193,16 @@ func main() {
unreachable() unreachable()
} }
}) })
// selects with closed channels don't block
testBlock(never, func() {
select {
case <-closedch:
}
})
testBlock(never, func() {
select {
case closedch <- 7:
}
})
} }
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