go-util/sync/gate_test.go

64 lines
1.3 KiB
Go

package usync
import "time"
import "errors"
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")
}
}
func TestGateCloseIdempotent(test *testing.T) {
gate := NewGate[int]()
err := gate.Close()
if err != nil { test.Fatal(err) }
err = gate.Close()
if !errors.Is(err, ErrAlreadyClosed) {
test.Fatal("wrong error: ", err)
}
}