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:
parent
a3855235cd
commit
47b835e4a8
@ -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:
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user