1
2
3
4
5
6
7
8
9
10
11 package com.atlassian.johnson.filters;
12
13 import com.atlassian.johnson.JohnsonEventContainer;
14 import com.atlassian.johnson.config.JohnsonConfig;
15 import com.atlassian.johnson.event.Event;
16 import com.atlassian.johnson.event.EventType;
17 import com.mockobjects.constraint.IsAnything;
18 import com.mockobjects.constraint.IsEqual;
19 import com.mockobjects.dynamic.C;
20 import com.mockobjects.dynamic.Mock;
21 import junit.framework.TestCase;
22 import mock.MockSetupConfig;
23 import org.easymock.MockControl;
24
25 import javax.servlet.FilterChain;
26 import javax.servlet.FilterConfig;
27 import javax.servlet.ServletContext;
28 import javax.servlet.ServletException;
29 import javax.servlet.http.HttpServletRequest;
30 import javax.servlet.http.HttpServletResponse;
31 import java.io.IOException;
32 import java.util.Arrays;
33
34 public class TestJohnsonFilter extends TestCase
35 {
36 JohnsonFilter filter;
37 private Mock mockResp;
38 private Mock mockFilterChain;
39 private Mock mockFilterConfig;
40 private Mock mockServletContext;
41 private MockControl requestMockCtrl;
42 private JohnsonEventContainer container;
43 HttpServletRequest request;
44 HttpServletResponse response;
45 FilterChain filterChain;
46
47 public TestJohnsonFilter(String s)
48 {
49 super(s);
50 }
51
52 protected void setUp() throws Exception
53 {
54 super.setUp();
55
56 MockSetupConfig.IS_SETUP = false;
57 JohnsonConfig.setInstance(new JohnsonConfig("test-johnson-config.xml"));
58 filter = new JohnsonFilter();
59 container = new JohnsonEventContainer();
60 request = getRequest();
61 response = getResponse();
62 filterChain = getFilterChain();
63 }
64
65 protected void tearDown() throws Exception
66 {
67 JohnsonConfig.setInstance(null);
68 super.tearDown();
69 }
70
71 public void testErrorNotIgnorableURI() throws Exception
72 {
73 container.addEvent(new Event(EventType.get("database"), "foo"));
74 request.getServletPath();
75 requestMockCtrl.setReturnValue("somepage.jsp", 2);
76 requestMockCtrl.replay();
77 mockResp.expect("sendRedirect", C.args(new IsEqual("/the/error/path.jsp")));
78 filter.doFilter(request, response, filterChain);
79 verifyAll();
80 }
81
82 public void testErrorsIgnorableUri() throws Exception
83 {
84 container.addEvent(new Event(EventType.get("export"), "foo"));
85 request.getServletPath();
86 requestMockCtrl.setReturnValue("/the/error/path.jsp");
87 requestMockCtrl.replay();
88 mockFilterChain.expect("doFilter", C.args(new IsAnything(), new IsAnything()));
89
90 filter.doFilter(request, response, filterChain);
91 verifyAll();
92 }
93
94 public void testNoErrorsAndNotSetup() throws Exception
95 {
96 MockSetupConfig.IS_SETUP = false;
97 request.getServletPath();
98 requestMockCtrl.setReturnValue("somepage.jsp", 2);
99 requestMockCtrl.replay();
100 mockResp.expect("sendRedirect", C.args(new IsEqual("/the/setup/path.jsp")));
101
102 filter.doFilter(request, response, filterChain);
103 verifyAll();
104 }
105
106 public void testNoErrorsSetup() throws Exception
107 {
108 MockSetupConfig.IS_SETUP = true;
109 request.getServletPath();
110 requestMockCtrl.setReturnValue("somepage.jsp");
111 requestMockCtrl.replay();
112 mockFilterChain.expect("doFilter", C.args(new IsAnything(), new IsAnything()));
113
114 filter.doFilter(request, response, filterChain);
115 verifyAll();
116 }
117
118 public void testNoErrorsSetupButSetupURI() throws Exception
119 {
120 MockSetupConfig.IS_SETUP = true;
121 request.getServletPath();
122 requestMockCtrl.setReturnValue("/setuppage.jsp");
123 requestMockCtrl.replay();
124 mockFilterChain.expect("doFilter", C.args(new IsAnything(), new IsAnything()));
125
126 filter.doFilter(request, response, filterChain);
127 verifyAll();
128 }
129
130 public void testNoErrorsNotSetupButSetupURI() throws Exception
131 {
132 MockSetupConfig.IS_SETUP = false;
133 request.getServletPath();
134 requestMockCtrl.setReturnValue("/setup.jsp");
135 requestMockCtrl.replay();
136 mockFilterChain.expect("doFilter", C.args(new IsAnything(), new IsAnything()));
137
138 filter.doFilter(request, response, filterChain);
139 verifyAll();
140 }
141
142 public void testNoErrorsNotSetupIgnorableURI() throws Exception
143 {
144 MockSetupConfig.IS_SETUP = false;
145 request.getServletPath();
146 requestMockCtrl.setReturnValue("/ignore/path/1.jsp");
147 requestMockCtrl.replay();
148 mockFilterChain.expect("doFilter", C.args(new IsAnything(), new IsAnything()));
149
150 filter.doFilter(request, response, filterChain);
151 verifyAll();
152 }
153
154 public void testNoErrorsNotSetupNotIgnorableURI() throws Exception
155 {
156 MockSetupConfig.IS_SETUP = false;
157 request.getServletPath();
158 requestMockCtrl.setReturnValue("/somepage.jsp", 2);
159 requestMockCtrl.replay();
160 mockResp.expect("sendRedirect", C.args(new IsEqual("/the/setup/path.jsp")));
161
162 filter.doFilter(request, response, filterChain);
163 verifyAll();
164 }
165
166
167
168
169 public void testNotAppliedTwice() throws ServletException, IOException
170 {
171 request.getServletPath();
172 requestMockCtrl.setReturnValue("/somepage.jsp", 2);
173 requestMockCtrl.replay();
174 mockResp.expect("sendRedirect", C.args(new IsEqual("/the/setup/path.jsp")));
175
176 filter.doFilter(request, response, filterChain);
177 verifyAll();
178
179 requestMockCtrl.reset();
180 request.getAttribute(JohnsonFilter.ALREADY_FILTERED);
181 requestMockCtrl.setReturnValue(Boolean.TRUE);
182 requestMockCtrl.replay();
183
184 mockFilterChain.expect("doFilter", C.args(new IsAnything(), new IsAnything()));
185
186 filter.doFilter(request, response, filterChain);
187 verifyAll();
188 }
189
190
191
192
193 public void testEmptyServletPaths() throws ServletException, IOException
194 {
195 requestMockCtrl.reset();
196 request.getServletPath();
197 requestMockCtrl.setReturnValue("", 0, 10);
198 request.getContextPath();
199 requestMockCtrl.setReturnValue("", 0, 10);
200 request.getRequestURI();
201 requestMockCtrl.setReturnValue("/requestpage.jsp", 0, 10);
202 request.getPathInfo();
203 requestMockCtrl.setReturnValue(null, 0, 10);
204 requestMockCtrl.replay();
205 mockResp.expect("sendRedirect", C.args(new IsEqual("/the/setup/path.jsp")));
206
207 filter.doFilter(request, response, filterChain);
208 verifyAll();
209 }
210
211 public void testGetStringForEvents() {
212 JohnsonFilter filter = new JohnsonFilter();
213 EventType type = new EventType("mytype", "mydesc");
214 Event[] eventsArr = new Event[]{new Event(type, "Error 1"), new Event(type, "Error 2")};
215 String stringForEvents = filter.getStringForEvents(Arrays.asList(eventsArr));
216 assertEquals("Error 1\nError 2", stringForEvents);
217 }
218
219 private FilterChain getFilterChain() throws ServletException
220 {
221 mockFilterChain = new Mock(FilterChain.class);
222 FilterChain filterChain = (FilterChain) mockFilterChain.proxy();
223
224 mockFilterConfig = new Mock(FilterConfig.class);
225 FilterConfig filterConfig = (FilterConfig) mockFilterConfig.proxy();
226
227 mockServletContext = new Mock(ServletContext.class);
228 ServletContext servletContext = (ServletContext) mockServletContext.proxy();
229
230 mockFilterConfig.expectAndReturn("getServletContext", servletContext);
231 container = new JohnsonEventContainer();
232 mockServletContext.matchAndReturn("getAttribute", C.args(new IsEqual(JohnsonEventContainer.SERVLET_CONTEXT_KEY)), container);
233
234 filter.init(filterConfig);
235 return filterChain;
236 }
237
238 private HttpServletResponse getResponse()
239 {
240 mockResp = new Mock(HttpServletResponse.class);
241 HttpServletResponse response = (HttpServletResponse) mockResp.proxy();
242 return response;
243 }
244
245 private HttpServletRequest getRequest()
246 {
247 requestMockCtrl = MockControl.createNiceControl(HttpServletRequest.class);
248
249 HttpServletRequest request = (HttpServletRequest) requestMockCtrl.getMock();
250 request.getAttribute(JohnsonFilter.ALREADY_FILTERED);
251 requestMockCtrl.expectAndReturn(JohnsonFilter.ALREADY_FILTERED, null);
252 request.setAttribute(JohnsonFilter.ALREADY_FILTERED, Boolean.TRUE);
253 requestMockCtrl.setVoidCallable();
254 request.getContextPath();
255 requestMockCtrl.setReturnValue("", 0, 1);
256
257 return request;
258 }
259
260 private void verifyAll()
261 {
262 requestMockCtrl.verify();
263 mockResp.verify();
264 mockFilterChain.verify();
265 mockFilterConfig.verify();
266 mockServletContext.verify();
267 }
268
269 }