1 package com.atlassian.johnson.filters;
2
3 import com.atlassian.johnson.JohnsonEventContainer;
4 import com.atlassian.johnson.event.Event;
5 import com.atlassian.johnson.event.EventLevel;
6 import com.atlassian.johnson.event.EventType;
7 import junit.framework.TestCase;
8 import org.easymock.MockControl;
9
10 import javax.servlet.http.HttpServletResponse;
11 import java.io.ByteArrayOutputStream;
12 import java.io.IOException;
13 import java.io.PrintWriter;
14 import edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicBoolean;
15
16
17
18
19 public class TestJohnson503Filter extends TestCase
20 {
21
22 private static final EventType DEFAULT_EVENT_TYPE = new EventType("event-type", "event-type-desc");
23
24 public void testHandleErrorWithNullContainer() throws IOException
25 {
26 Johnson503Filter johnson503Filter = new Johnson503Filter();
27 final AtomicBoolean flushCalled = new AtomicBoolean(false);
28 PrintWriter writer = new PrintWriter(new ByteArrayOutputStream())
29 {
30 public void flush()
31 {
32 flushCalled.set(true);
33 }
34 };
35 MockControl responseMockCtrl = MockControl.createStrictControl(HttpServletResponse.class);
36
37 HttpServletResponse response = (HttpServletResponse) responseMockCtrl.getMock();
38 response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
39 responseMockCtrl.setVoidCallable();
40 response.getWriter();
41 responseMockCtrl.setReturnValue(writer);
42 responseMockCtrl.replay();
43
44 johnson503Filter.handleError(null, null, response);
45 responseMockCtrl.verify();
46 assertTrue(flushCalled.get());
47 }
48
49 public void testHandleErrorWithEmptyContainer() throws IOException
50 {
51 Johnson503Filter johnson503Filter = new Johnson503Filter();
52 final AtomicBoolean flushCalled = new AtomicBoolean(false);
53 PrintWriter writer = new PrintWriter(new ByteArrayOutputStream())
54 {
55 public void flush()
56 {
57 flushCalled.set(true);
58 }
59 };
60 MockControl responseMockCtrl = MockControl.createStrictControl(HttpServletResponse.class);
61
62 HttpServletResponse response = (HttpServletResponse) responseMockCtrl.getMock();
63 response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
64 responseMockCtrl.setVoidCallable();
65 response.getWriter();
66 responseMockCtrl.setReturnValue(writer);
67 responseMockCtrl.replay();
68
69 johnson503Filter.handleError(createContainer(), null, response);
70 responseMockCtrl.verify();
71 assertTrue(flushCalled.get());
72 }
73
74 public void testHandleErrorWithWarningOnly() throws IOException
75 {
76 Johnson503Filter johnson503Filter = new Johnson503Filter();
77 final AtomicBoolean flushCalled = new AtomicBoolean(false);
78 PrintWriter writer = new PrintWriter(new ByteArrayOutputStream())
79 {
80 public void flush()
81 {
82 flushCalled.set(true);
83 }
84 };
85 MockControl responseMockCtrl = MockControl.createStrictControl(HttpServletResponse.class);
86
87 HttpServletResponse response = (HttpServletResponse) responseMockCtrl.getMock();
88 response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
89 responseMockCtrl.setVoidCallable();
90 response.setHeader("Retry-After", "30");
91 responseMockCtrl.setVoidCallable();
92 response.getWriter();
93 responseMockCtrl.setReturnValue(writer);
94 responseMockCtrl.replay();
95
96 johnson503Filter.handleError(createContainer(EventLevel.WARNING), null, response);
97 responseMockCtrl.verify();
98 assertTrue(flushCalled.get());
99 }
100
101 public void testHandleErrorWithErrorOnly() throws IOException
102 {
103 Johnson503Filter johnson503Filter = new Johnson503Filter();
104 final AtomicBoolean flushCalled = new AtomicBoolean(false);
105 PrintWriter writer = new PrintWriter(new ByteArrayOutputStream())
106 {
107 public void flush()
108 {
109 flushCalled.set(true);
110 }
111 };
112 MockControl responseMockCtrl = MockControl.createStrictControl(HttpServletResponse.class);
113
114 HttpServletResponse response = (HttpServletResponse) responseMockCtrl.getMock();
115 response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
116 responseMockCtrl.setVoidCallable();
117 response.getWriter();
118 responseMockCtrl.setReturnValue(writer);
119 responseMockCtrl.replay();
120
121 johnson503Filter.handleError(createContainer(EventLevel.ERROR), null, response);
122 responseMockCtrl.verify();
123 assertTrue(flushCalled.get());
124 }
125 public void testHandleErrorWithCustomLevel() throws IOException
126 {
127 Johnson503Filter johnson503Filter = new Johnson503Filter();
128 final AtomicBoolean flushCalled = new AtomicBoolean(false);
129 PrintWriter writer = new PrintWriter(new ByteArrayOutputStream())
130 {
131 public void flush()
132 {
133 flushCalled.set(true);
134 }
135 };
136 MockControl responseMockCtrl = MockControl.createStrictControl(HttpServletResponse.class);
137
138 HttpServletResponse response = (HttpServletResponse) responseMockCtrl.getMock();
139 response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
140 responseMockCtrl.setVoidCallable();
141 response.getWriter();
142 responseMockCtrl.setReturnValue(writer);
143 responseMockCtrl.replay();
144
145 johnson503Filter.handleError(createContainer("my-level"), null, response);
146 responseMockCtrl.verify();
147 assertTrue(flushCalled.get());
148 }
149
150 public void testHandleErrorWithErrorAndWarningOnly() throws IOException
151 {
152 Johnson503Filter johnson503Filter = new Johnson503Filter();
153 final AtomicBoolean flushCalled = new AtomicBoolean(false);
154 PrintWriter writer = new PrintWriter(new ByteArrayOutputStream())
155 {
156 public void flush()
157 {
158 flushCalled.set(true);
159 }
160 };
161 MockControl responseMockCtrl = MockControl.createStrictControl(HttpServletResponse.class);
162
163 HttpServletResponse response = (HttpServletResponse) responseMockCtrl.getMock();
164 response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
165 responseMockCtrl.setVoidCallable();
166 response.getWriter();
167 responseMockCtrl.setReturnValue(writer);
168 responseMockCtrl.replay();
169
170 johnson503Filter.handleError(createContainer(EventLevel.ERROR, EventLevel.WARNING), null, response);
171 responseMockCtrl.verify();
172 assertTrue(flushCalled.get());
173 }
174
175 public void testHandleNotSetup() throws IOException
176 {
177 Johnson503Filter johnson503Filter = new Johnson503Filter();
178 final AtomicBoolean flushCalled = new AtomicBoolean(false);
179 PrintWriter writer = new PrintWriter(new ByteArrayOutputStream())
180 {
181 public void flush()
182 {
183 flushCalled.set(true);
184 }
185 };
186 MockControl responseMockCtrl = MockControl.createStrictControl(HttpServletResponse.class);
187
188 HttpServletResponse response = (HttpServletResponse) responseMockCtrl.getMock();
189 response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
190 responseMockCtrl.setVoidCallable();
191 response.getWriter();
192 responseMockCtrl.setReturnValue(writer);
193 responseMockCtrl.replay();
194
195 johnson503Filter.handleNotSetup(null, response);
196 responseMockCtrl.verify();
197 assertTrue(flushCalled.get());
198 }
199
200 private JohnsonEventContainer createContainer(final String... eventLevels) {
201 final JohnsonEventContainer container = new JohnsonEventContainer();
202 for (String eventLevel : eventLevels) {
203 container.addEvent(createEvent(createEventLevel(eventLevel)));
204 }
205 return container;
206 }
207
208 private Event createEvent(final EventLevel eventLevel) {
209 return new Event(DEFAULT_EVENT_TYPE,"event-desc", eventLevel);
210 }
211
212 private EventLevel createEventLevel(final String eventLevel) {
213 return new EventLevel(eventLevel, "event-level-desc");
214 }
215
216 }