1
0
mirror of https://github.com/golang/go synced 2024-11-21 20:14:52 -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() {
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:
}
})
}