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()) {
defer func() {
s := never
if recover() != nil {
s = always // f panicked
s = always // f panicked
}
if s != signal {
panic(signal + " panic")
......@@ -55,6 +55,8 @@ func testBlock(signal string, f func()) {
func main() {
const async = 1 // asynchronous channels
var nilch chan int
closedch := make(chan int)
close(closedch)
// sending/receiving from a nil channel outside a select panics
testPanic(always, func() {
......@@ -86,6 +88,24 @@ func main() {
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
testBlock(always, func() {
ch := make(chan int)
......@@ -173,4 +193,16 @@ func main() {
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