1 /*
2  * Copyright (C) 2007 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.eventbus;
18 
19 import com.google.common.collect.Lists;
20 
21 import junit.framework.TestCase;
22 
23 import java.util.List;
24 
25 /**
26  * Validate that {@link EventBus} behaves carefully when listeners publish
27  * their own events.
28  *
29  * @author Jesse Wilson
30  */
31 public class ReentrantEventsTest extends TestCase {
32 
33   static final String FIRST = "one";
34   static final Double SECOND = 2.0d;
35 
36   final EventBus bus = new EventBus();
37 
testNoReentrantEvents()38   public void testNoReentrantEvents() {
39     ReentrantEventsHater hater = new ReentrantEventsHater();
40     bus.register(hater);
41 
42     bus.post(FIRST);
43 
44     assertEquals("ReentrantEventHater expected 2 events",
45         Lists.<Object>newArrayList(FIRST, SECOND), hater.eventsReceived);
46   }
47 
48   public class ReentrantEventsHater {
49     boolean ready = true;
50     List<Object> eventsReceived = Lists.newArrayList();
51 
52     @Subscribe
listenForStrings(String event)53     public void listenForStrings(String event) {
54       eventsReceived.add(event);
55       ready = false;
56       try {
57         bus.post(SECOND);
58       } finally {
59         ready = true;
60       }
61     }
62 
63     @Subscribe
listenForDoubles(Double event)64     public void listenForDoubles(Double event) {
65       assertTrue("I received an event when I wasn't ready!", ready);
66       eventsReceived.add(event);
67     }
68   }
69 
testEventOrderingIsPredictable()70   public void testEventOrderingIsPredictable() {
71     EventProcessor processor = new EventProcessor();
72     bus.register(processor);
73 
74     EventRecorder recorder = new EventRecorder();
75     bus.register(recorder);
76 
77     bus.post(FIRST);
78 
79     assertEquals("EventRecorder expected events in order",
80         Lists.<Object>newArrayList(FIRST, SECOND), recorder.eventsReceived);
81   }
82 
83   public class EventProcessor {
listenForStrings(String event)84     @Subscribe public void listenForStrings(String event) {
85       bus.post(SECOND);
86     }
87   }
88 
89   public class EventRecorder {
90     List<Object> eventsReceived = Lists.newArrayList();
listenForEverything(Object event)91     @Subscribe public void listenForEverything(Object event) {
92       eventsReceived.add(event);
93     }
94   }
95 }
96