From a816ff0babff42d13a50ab09679cd34cf871d5ae Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Mon, 27 Feb 2017 14:52:48 +0100 Subject: [PATCH] Add test --- Makefile | 9 +++ README.md | 177 ++++++++++++++++++++++++++++++++++++++++++++++++- events.go | 3 + events_test.go | 46 +++++++++++++ 4 files changed, 233 insertions(+), 2 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..295001f8d --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +.PHONY: docs +REPO:=github.com/tendermint/go-events + +docs: + @go get github.com/davecheney/godoc2md + godoc2md $(REPO) > README.md + +test: + go test -v ./... diff --git a/README.md b/README.md index 737cbaaec..c435e7283 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,175 @@ -# go-events -PubSub in Go with event caching. + + +# events +`import "github.com/tendermint/go-events"` + +* [Overview](#pkg-overview) +* [Index](#pkg-index) + +## Overview +Pub-Sub in go with event caching + + + + +## Index +* [type EventCache](#EventCache) + * [func NewEventCache(evsw Fireable) *EventCache](#NewEventCache) + * [func (evc *EventCache) FireEvent(event string, data EventData)](#EventCache.FireEvent) + * [func (evc *EventCache) Flush()](#EventCache.Flush) +* [type EventCallback](#EventCallback) +* [type EventData](#EventData) +* [type EventSwitch](#EventSwitch) + * [func NewEventSwitch() EventSwitch](#NewEventSwitch) +* [type Eventable](#Eventable) +* [type Fireable](#Fireable) + + +#### Package files +[event_cache.go](/src/github.com/tendermint/go-events/event_cache.go) [events.go](/src/github.com/tendermint/go-events/events.go) [log.go](/src/github.com/tendermint/go-events/log.go) + + + + + + +## type [EventCache](/src/target/event_cache.go?s=152:215#L1) +``` go +type EventCache struct { + // contains filtered or unexported fields +} +``` +An EventCache buffers events for a Fireable +All events are cached. Filtering happens on Flush + + + + + + + +### func [NewEventCache](/src/target/event_cache.go?s=275:320#L5) +``` go +func NewEventCache(evsw Fireable) *EventCache +``` +Create a new EventCache with an EventSwitch as backend + + + + + +### func (\*EventCache) [FireEvent](/src/target/event_cache.go?s=534:596#L19) +``` go +func (evc *EventCache) FireEvent(event string, data EventData) +``` +Cache an event to be fired upon finality. + + + + +### func (\*EventCache) [Flush](/src/target/event_cache.go?s=773:803#L26) +``` go +func (evc *EventCache) Flush() +``` +Fire events by running evsw.FireEvent on all cached events. Blocks. +Clears cached events + + + + +## type [EventCallback](/src/target/events.go?s=4182:4221#L175) +``` go +type EventCallback func(data EventData) +``` + + + + + + + + + +## type [EventData](/src/target/events.go?s=236:287#L4) +``` go +type EventData interface { +} +``` +Generic event data can be typed and registered with tendermint/go-wire +via concrete implementation of this interface + + + + + + + + + + +## type [EventSwitch](/src/target/events.go?s=553:760#L19) +``` go +type EventSwitch interface { + Service + Fireable + + AddListenerForEvent(listenerID, event string, cb EventCallback) + RemoveListenerForEvent(event string, listenerID string) + RemoveListener(listenerID string) +} +``` + + + + + + +### func [NewEventSwitch](/src/target/events.go?s=902:935#L36) +``` go +func NewEventSwitch() EventSwitch +``` + + + + +## type [Eventable](/src/target/events.go?s=371:433#L10) +``` go +type Eventable interface { + SetEventSwitch(evsw EventSwitch) +} +``` +reactors and other modules should export +this interface to become eventable + + + + + + + + + + +## type [Fireable](/src/target/events.go?s=483:551#L15) +``` go +type Fireable interface { + FireEvent(event string, data EventData) +} +``` +an event switch or cache implements fireable + + + + + + + + + + + + + + +- - - +Generated by [godoc2md](http://godoc.org/github.com/davecheney/godoc2md) diff --git a/events.go b/events.go index 15cbfd5b4..e613a8e04 100644 --- a/events.go +++ b/events.go @@ -1,3 +1,6 @@ +/* +Pub-Sub in go with event caching +*/ package events import ( diff --git a/events_test.go b/events_test.go index 8766a57d2..c1b48b16f 100644 --- a/events_test.go +++ b/events_test.go @@ -5,6 +5,8 @@ import ( "math/rand" "testing" "time" + + "github.com/stretchr/testify/assert" ) // TestAddListenerForEventFireOnce sets up an EventSwitch, subscribes a single @@ -207,6 +209,50 @@ func TestAddAndRemoveListener(t *testing.T) { } } +// TestRemoveListener does basic tests on adding and removing +func TestRemoveListener(t *testing.T) { + evsw := NewEventSwitch() + started, err := evsw.Start() + if started == false || err != nil { + t.Errorf("Failed to start EventSwitch, error: %v", err) + } + count := 10 + sum1, sum2 := 0, 0 + // add some listeners and make sure they work + evsw.AddListenerForEvent("listener", "event1", + func(data EventData) { + sum1 += 1 + }) + evsw.AddListenerForEvent("listener", "event2", + func(data EventData) { + sum2 += 1 + }) + for i := 0; i < count; i++ { + evsw.FireEvent("event1", true) + evsw.FireEvent("event2", true) + } + assert.Equal(t, count, sum1) + assert.Equal(t, count, sum2) + + // remove one by event and make sure it is gone + evsw.RemoveListenerForEvent("event2", "listener") + for i := 0; i < count; i++ { + evsw.FireEvent("event1", true) + evsw.FireEvent("event2", true) + } + assert.Equal(t, count*2, sum1) + assert.Equal(t, count, sum2) + + // remove the listener entirely and make sure both gone + evsw.RemoveListener("listener") + for i := 0; i < count; i++ { + evsw.FireEvent("event1", true) + evsw.FireEvent("event2", true) + } + assert.Equal(t, count*2, sum1) + assert.Equal(t, count, sum2) +} + // TestAddAndRemoveListenersAsync sets up an EventSwitch, subscribes two // listeners to three events, and fires a thousand integers for each event. // These two listeners serve as the baseline validation while other listeners