diff --git a/sync/gate_test.go b/sync/gate_test.go new file mode 100644 index 0000000..da41a73 --- /dev/null +++ b/sync/gate_test.go @@ -0,0 +1,52 @@ +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") + } +}