eventer: add test for concurrent Post/Register
This test reports the race condition when run using "go test -race".
This commit is contained in:
parent
7c9508ed71
commit
d451269977
|
@ -1,6 +1,10 @@
|
||||||
package eventer
|
package eventer
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"math/rand"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
func TestChannel(t *testing.T) {
|
func TestChannel(t *testing.T) {
|
||||||
eventer := New()
|
eventer := New()
|
||||||
|
@ -64,3 +68,46 @@ func TestOn(t *testing.T) {
|
||||||
t.Error("Expected function event with data 'hello world'. Got", data)
|
t.Error("Expected function event with data 'hello world'. Got", data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConcurrentUsage(t *testing.T) {
|
||||||
|
rand.Seed(time.Now().Unix())
|
||||||
|
eventer := New()
|
||||||
|
stop := make(chan struct{})
|
||||||
|
recv := make(chan int)
|
||||||
|
poster := func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-stop:
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
eventer.Post("test", "hi")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
listener := func(i int) {
|
||||||
|
time.Sleep(time.Duration(rand.Intn(99)) * time.Millisecond)
|
||||||
|
c := eventer.Register("test")
|
||||||
|
// wait for the first event
|
||||||
|
<-c
|
||||||
|
recv <- i
|
||||||
|
// keep receiving to prevent deadlock
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-stop:
|
||||||
|
return
|
||||||
|
case <-c:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nlisteners := 200
|
||||||
|
go poster()
|
||||||
|
for i := 0; i < nlisteners; i++ {
|
||||||
|
go listener(i)
|
||||||
|
}
|
||||||
|
// wait until everyone has been served
|
||||||
|
for i := 0; i < nlisteners; i++ {
|
||||||
|
<-recv
|
||||||
|
}
|
||||||
|
close(stop)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue