1
0
mirror of https://github.com/golang/go synced 2024-11-22 02:04:40 -07:00

channel tests: added a couple of tests with closed channels

R=rsc
CC=golang-dev
https://golang.org/cl/1774047
This commit is contained in:
Robert Griesemer 2010-07-14 13:18:57 -07:00
parent a3855235cd
commit 47b835e4a8

View File

@ -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()) {
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() {
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() {
unreachable() unreachable()
} }
}) })
// selects with closed channels don't block
testBlock(never, func() {
select {
case <-closedch:
}
})
testBlock(never, func() {
select {
case closedch <- 7:
}
})
} }