View Javadoc
1   package org.junit.runner.notification;
2   
3   import static org.hamcrest.CoreMatchers.instanceOf;
4   import static org.hamcrest.core.Is.is;
5   import static org.junit.Assert.assertNotNull;
6   import static org.junit.Assert.assertSame;
7   import static org.junit.Assert.assertThat;
8   
9   import java.util.concurrent.atomic.AtomicInteger;
10  
11  import org.junit.Test;
12  import org.junit.runner.Description;
13  import org.junit.runner.Result;
14  
15  public class RunNotifierTest {
16      private final RunNotifier fNotifier = new RunNotifier();
17  
18      @Test
19      public void notifiesSecondListenerIfFirstThrowsException() {
20          FailureListener failureListener = new FailureListener();
21          fNotifier.addListener(new CorruptListener());
22          fNotifier.addListener(failureListener);
23          fNotifier.fireTestFailure(new Failure(null, null));
24          assertNotNull("The FailureListener registered no failure.",
25                  failureListener.failure);
26      }
27  
28      @Test
29      public void hasNoProblemsWithFailingListeners() { // see issues 209 and 395
30          fNotifier.addListener(new CorruptListener());
31          fNotifier.addListener(new FailureListener());
32          fNotifier.addListener(new CorruptListener());
33          fNotifier.fireTestRunFinished(new Result());
34      }
35  
36      private static class CorruptListener extends RunListener {
37          @Override
38          public void testRunFinished(Result result) throws Exception {
39              throw new RuntimeException();
40          }
41  
42          @Override
43          public void testFailure(Failure failure) throws Exception {
44              throw new RuntimeException();
45          }
46      }
47      
48      @Test
49      public void addAndRemoveWithNonThreadSafeListener() {
50          CountingListener listener = new CountingListener();
51          assertThat(listener.fTestStarted.get(), is(0));
52          fNotifier.addListener(listener);
53          fNotifier.fireTestStarted(null);
54          assertThat(listener.fTestStarted.get(), is(1));
55          fNotifier.removeListener(listener);
56          fNotifier.fireTestStarted(null);
57          assertThat(listener.fTestStarted.get(), is(1));
58      }
59  
60      @Test
61      public void addFirstAndRemoveWithNonThreadSafeListener() {
62          CountingListener listener = new CountingListener();
63          assertThat(listener.fTestStarted.get(), is(0));
64          fNotifier.addFirstListener(listener);
65          fNotifier.fireTestStarted(null);
66          assertThat(listener.fTestStarted.get(), is(1));
67          fNotifier.removeListener(listener);
68          fNotifier.fireTestStarted(null);
69          assertThat(listener.fTestStarted.get(), is(1));
70      }
71      
72      @Test
73      public void addAndRemoveWithThreadSafeListener() {
74          ThreadSafeListener listener = new ThreadSafeListener();
75          assertThat(listener.fTestStarted.get(), is(0));
76          fNotifier.addListener(listener);
77          fNotifier.fireTestStarted(null);
78          assertThat(listener.fTestStarted.get(), is(1));
79          fNotifier.removeListener(listener);
80          fNotifier.fireTestStarted(null);
81          assertThat(listener.fTestStarted.get(), is(1));
82      }
83  
84      @Test
85      public void addFirstAndRemoveWithThreadSafeListener() {
86          ThreadSafeListener listener = new ThreadSafeListener();
87          assertThat(listener.fTestStarted.get(), is(0));
88          fNotifier.addFirstListener(listener);
89          fNotifier.fireTestStarted(null);
90          assertThat(listener.fTestStarted.get(), is(1));
91          fNotifier.removeListener(listener);
92          fNotifier.fireTestStarted(null);
93          assertThat(listener.fTestStarted.get(), is(1));
94      }
95  
96      @Test
97      public void wrapIfNotThreadSafeShouldNotWrapThreadSafeListeners() {
98          ThreadSafeListener listener = new ThreadSafeListener();;
99          assertSame(listener, new RunNotifier().wrapIfNotThreadSafe(listener));
100     }
101 
102     @Test
103     public void wrapIfNotThreadSafeShouldWrapNonThreadSafeListeners() {
104         CountingListener listener = new CountingListener();
105         RunListener wrappedListener = new RunNotifier().wrapIfNotThreadSafe(listener);
106         assertThat(wrappedListener, instanceOf(SynchronizedRunListener.class));
107     }
108 
109     private static class FailureListener extends RunListener {
110         private Failure failure;
111 
112         @Override
113         public void testFailure(Failure failure) throws Exception {
114             this.failure = failure;
115         }
116     }
117     
118     private static class CountingListener extends RunListener {
119         final AtomicInteger fTestStarted = new AtomicInteger(0);
120 
121         @Override
122         public void testStarted(Description description) throws Exception {
123             fTestStarted.incrementAndGet();
124         }
125     }
126     
127     @RunListener.ThreadSafe
128     private static class ThreadSafeListener extends CountingListener {
129     }
130 
131 }