63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
package diodes_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/navidrome/navidrome/tests"
|
|
. "github.com/navidrome/navidrome/utils/diodes"
|
|
. "github.com/onsi/ginkgo/v2"
|
|
. "github.com/onsi/gomega"
|
|
)
|
|
|
|
func TestDiodes(t *testing.T) {
|
|
tests.Init(t, false)
|
|
RegisterFailHandler(Fail)
|
|
RunSpecs(t, "Diodes Suite")
|
|
}
|
|
|
|
var _ = Describe("Diode", func() {
|
|
type message struct {
|
|
data string
|
|
}
|
|
var diode *Diode[message]
|
|
var ctx context.Context
|
|
var ctxCancel context.CancelFunc
|
|
var missed int
|
|
|
|
BeforeEach(func() {
|
|
missed = 0
|
|
ctx, ctxCancel = context.WithCancel(context.Background())
|
|
diode = New[message](ctx, 2, AlertFunc(func(m int) { missed = m }))
|
|
})
|
|
|
|
It("enqueues the data correctly", func() {
|
|
diode.Put(message{data: "1"})
|
|
diode.Put(message{data: "2"})
|
|
Expect(diode.Next()).To(Equal(&message{data: "1"}))
|
|
Expect(diode.Next()).To(Equal(&message{data: "2"}))
|
|
Expect(missed).To(BeZero())
|
|
})
|
|
|
|
It("drops messages when Diode is full", func() {
|
|
diode.Put(message{data: "1"})
|
|
diode.Put(message{data: "2"})
|
|
diode.Put(message{data: "3"})
|
|
next, ok := diode.TryNext()
|
|
Expect(ok).To(BeTrue())
|
|
Expect(next).To(Equal(&message{data: "3"}))
|
|
|
|
_, ok = diode.TryNext()
|
|
Expect(ok).To(BeFalse())
|
|
|
|
Expect(missed).To(Equal(2))
|
|
})
|
|
|
|
It("returns nil when Diode is empty and the context is canceled", func() {
|
|
diode.Put(message{data: "1"})
|
|
ctxCancel()
|
|
Expect(diode.Next()).To(Equal(&message{data: "1"}))
|
|
Expect(diode.Next()).To(BeNil())
|
|
})
|
|
})
|