diff options
author | Felix Lange <fjl@twurst.com> | 2017-01-26 18:57:31 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2017-02-03 19:37:49 +0800 |
commit | 1bed9b3fea9939581b03cae9d6b4984ced456748 (patch) | |
tree | b1cb7cbd1acb6cc9b07c8931a24d89f5e74c89de /event/feed_test.go | |
parent | a2b4abd89adf0404b43fcd19766bac37009032a5 (diff) | |
download | go-tangerine-1bed9b3fea9939581b03cae9d6b4984ced456748.tar.gz go-tangerine-1bed9b3fea9939581b03cae9d6b4984ced456748.tar.zst go-tangerine-1bed9b3fea9939581b03cae9d6b4984ced456748.zip |
event: address review issues (multiple commits)
event: address Feed review issues
event: clarify role of NewSubscription function
event: more Feed review fixes
* take sendLock after dropping f.mu
* add constant for number of special cases
event: fix subscribing/unsubscribing while Send is blocked
Diffstat (limited to 'event/feed_test.go')
-rw-r--r-- | event/feed_test.go | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/event/feed_test.go b/event/feed_test.go index 4f897c162..a82c10303 100644 --- a/event/feed_test.go +++ b/event/feed_test.go @@ -167,6 +167,74 @@ func TestFeedSubscribeSameChannel(t *testing.T) { done.Wait() } +func TestFeedSubscribeBlockedPost(t *testing.T) { + var ( + feed Feed + nsends = 2000 + ch1 = make(chan int) + ch2 = make(chan int) + wg sync.WaitGroup + ) + defer wg.Wait() + + feed.Subscribe(ch1) + wg.Add(nsends) + for i := 0; i < nsends; i++ { + go func() { + feed.Send(99) + wg.Done() + }() + } + + sub2 := feed.Subscribe(ch2) + defer sub2.Unsubscribe() + + // We're done when ch1 has received N times. + // The number of receives on ch2 depends on scheduling. + for i := 0; i < nsends; { + select { + case <-ch1: + i++ + case <-ch2: + } + } +} + +func TestFeedUnsubscribeBlockedPost(t *testing.T) { + var ( + feed Feed + nsends = 200 + chans = make([]chan int, 2000) + subs = make([]Subscription, len(chans)) + bchan = make(chan int) + bsub = feed.Subscribe(bchan) + wg sync.WaitGroup + ) + for i := range chans { + chans[i] = make(chan int, nsends) + } + + // Queue up some Sends. None of these can make progress while bchan isn't read. + wg.Add(nsends) + for i := 0; i < nsends; i++ { + go func() { + feed.Send(99) + wg.Done() + }() + } + // Subscribe the other channels. + for i, ch := range chans { + subs[i] = feed.Subscribe(ch) + } + // Unsubscribe them again. + for _, sub := range subs { + sub.Unsubscribe() + } + // Unblock the Sends. + bsub.Unsubscribe() + wg.Wait() +} + func TestFeedUnsubscribeFromInbox(t *testing.T) { var ( feed Feed |