64 lines
1.3 KiB
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)
|
|
}
|
|
}
|