From 26f838167e2cf1ba4e762e1d9962c4ccab463b84 Mon Sep 17 00:00:00 2001 From: Deluan Date: Thu, 4 Feb 2021 15:42:08 -0500 Subject: [PATCH] Add tests to diode --- server/events/diode.go | 8 ++++++ server/events/diodo_test.go | 51 +++++++++++++++++++++++++++++++++++++ server/events/sse.go | 2 +- 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 server/events/diodo_test.go diff --git a/server/events/diode.go b/server/events/diode.go index 7c687f52..41894ab4 100644 --- a/server/events/diode.go +++ b/server/events/diode.go @@ -20,6 +20,14 @@ func (d *diode) set(data message) { d.d.Set(diodes.GenericDataType(&data)) } +func (d *diode) tryNext() (*message, bool) { + data, ok := d.d.TryNext() + if !ok { + return nil, ok + } + return (*message)(data), true +} + func (d *diode) next() *message { data := d.d.Next() return (*message)(data) diff --git a/server/events/diodo_test.go b/server/events/diodo_test.go new file mode 100644 index 00000000..144dd04d --- /dev/null +++ b/server/events/diodo_test.go @@ -0,0 +1,51 @@ +package events + +import ( + "context" + + "code.cloudfoundry.org/go-diodes" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("diode", func() { + var diode *diode + var ctx context.Context + var ctxCancel context.CancelFunc + var missed int + + BeforeEach(func() { + missed = 0 + ctx, ctxCancel = context.WithCancel(context.Background()) + diode = newDiode(ctx, 2, diodes.AlertFunc(func(m int) { missed = m })) + }) + + It("enqueues the data correctly", func() { + diode.set(message{Data: "1"}) + diode.set(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.set(message{Data: "1"}) + diode.set(message{Data: "2"}) + diode.set(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.set(message{Data: "1"}) + ctxCancel() + Expect(diode.next()).To(Equal(&message{Data: "1"})) + Expect(diode.next()).To(BeNil()) + }) +}) diff --git a/server/events/sse.go b/server/events/sse.go index 73a98544..d0b6d3a4 100644 --- a/server/events/sse.go +++ b/server/events/sse.go @@ -148,7 +148,7 @@ func (b *broker) subscribe(r *http.Request) client { address: r.RemoteAddr, userAgent: r.UserAgent(), } - c.diode = newDiode(r.Context(), 1000, diodes.AlertFunc(func(missed int) { + c.diode = newDiode(r.Context(), 1024, diodes.AlertFunc(func(missed int) { log.Trace("Dropped SSE events", "client", c.String(), "missed", missed) }))