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() {
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 }