go-util/sync/gate_test.go

53 lines
1.0 KiB
Go

package usync
import "time"
import "testing"
func TestGate(test *testing.T) {
gate := NewGate[int]()
go func() {
for number := range 21 {
test.Log("send", number)
gate.Send(number)
}
test.Log("send done")
}()
for correct := range 21 {
got := <- gate.Receive()
test.Log("RECV", correct, got)
if correct != got {
test.Fatal("RECV not equal")
}
}
test.Log("RECV done")
}
func TestGateCloseEarly(test *testing.T) {
gate := NewGate[int]()
sendDone := make(chan struct { })
go func() {
for number := range 21 {
test.Log("send", number)
gate.Send(number)
}
test.Log("send done")
close(sendDone)
}()
for correct := range 15 {
got := <- gate.Receive()
test.Log("RECV", correct, got)
if correct != got {
test.Fatal("RECV not equal")
}
}
test.Log("RECV done, closing gate... DOOR STUCK!! PLS I BEG OF YOU!!")
gate.Close()
test.Log("RECV closed gate yay :)))")
timeout := time.NewTimer(time.Second * 4)
select {
case <- sendDone:
case <- timeout.C:
test.Fatal("timed out waiting for sender goroutine to stop")
}
}