From 0eff425bc7e3d6137ea3c59ad7436eafe5ef55d2 Mon Sep 17 00:00:00 2001 From: Silas Davis Date: Mon, 23 Oct 2017 18:51:49 +0100 Subject: [PATCH] fix zeroed buffer getting flushed to the empty event --- events/event_cache.go | 12 ++++-------- events/event_cache_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 events/event_cache_test.go diff --git a/events/event_cache.go b/events/event_cache.go index 905f1096a..f508e873d 100644 --- a/events/event_cache.go +++ b/events/event_cache.go @@ -1,9 +1,5 @@ package events -const ( - eventsBufferSize = 1000 -) - // An EventCache buffers events for a Fireable // All events are cached. Filtering happens on Flush type EventCache struct { @@ -14,8 +10,7 @@ type EventCache struct { // Create a new EventCache with an EventSwitch as backend func NewEventCache(evsw Fireable) *EventCache { return &EventCache{ - evsw: evsw, - events: make([]eventInfo, eventsBufferSize), + evsw: evsw, } } @@ -27,7 +22,7 @@ type eventInfo struct { // Cache an event to be fired upon finality. func (evc *EventCache) FireEvent(event string, data EventData) { - // append to list + // append to list (go will grow our backing array exponentially) evc.events = append(evc.events, eventInfo{event, data}) } @@ -37,5 +32,6 @@ func (evc *EventCache) Flush() { for _, ei := range evc.events { evc.evsw.FireEvent(ei.event, ei.data) } - evc.events = make([]eventInfo, eventsBufferSize) + // Clear the buffer, since we only add to it with append it's safe to just set it to nil and maybe safe an allocation + evc.events = nil } diff --git a/events/event_cache_test.go b/events/event_cache_test.go new file mode 100644 index 000000000..ab321da3a --- /dev/null +++ b/events/event_cache_test.go @@ -0,0 +1,35 @@ +package events + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestEventCache_Flush(t *testing.T) { + evsw := NewEventSwitch() + evsw.Start() + evsw.AddListenerForEvent("nothingness", "", func(data EventData) { + // Check we are not initialising an empty buffer full of zeroed eventInfos in the EventCache + require.FailNow(t, "We should never receive a message on this switch since none are fired") + }) + evc := NewEventCache(evsw) + evc.Flush() + // Check after reset + evc.Flush() + fail := true + pass := false + evsw.AddListenerForEvent("somethingness", "something", func(data EventData) { + if fail { + require.FailNow(t, "Shouldn't see a message until flushed") + } + pass = true + }) + evc.FireEvent("something", struct{ int }{1}) + evc.FireEvent("something", struct{ int }{2}) + evc.FireEvent("something", struct{ int }{3}) + fail = false + evc.Flush() + assert.True(t, pass) +}