1 package com.atlassian.johnson.filters;
2
3 import com.atlassian.johnson.DefaultJohnsonEventContainer;
4 import com.atlassian.johnson.Johnson;
5 import com.atlassian.johnson.JohnsonEventContainer;
6 import com.atlassian.johnson.event.Event;
7 import com.atlassian.johnson.event.EventType;
8 import com.atlassian.johnson.test.SimpleSetupConfig;
9 import org.easymock.EasyMockSupport;
10 import org.junit.AfterClass;
11 import org.junit.Before;
12 import org.junit.BeforeClass;
13 import org.junit.Test;
14
15 import javax.servlet.FilterChain;
16 import javax.servlet.FilterConfig;
17 import javax.servlet.ServletContext;
18 import javax.servlet.ServletException;
19 import javax.servlet.http.HttpServletRequest;
20 import javax.servlet.http.HttpServletResponse;
21 import java.io.IOException;
22 import java.util.Arrays;
23
24 import static org.easymock.EasyMock.*;
25 import static org.junit.Assert.assertEquals;
26
27 public class JohnsonFilterTest extends EasyMockSupport
28 {
29 public static final String ALREADY_FILTERED = JohnsonFilter.class.getName() + "_already_filtered";
30
31 private JohnsonEventContainer container;
32 private JohnsonFilter filter;
33 private FilterChain filterChain;
34 private HttpServletRequest request;
35 private HttpServletResponse response;
36
37 @AfterClass
38 public static void clearConfig()
39 {
40 Johnson.terminate();
41 }
42
43 @BeforeClass
44 public static void setConfig()
45 {
46 Johnson.initialize("test-johnson-config.xml");
47 }
48
49 @Before
50 public void setUp() throws Exception
51 {
52 SimpleSetupConfig.IS_SETUP = false;
53
54 filter = new JohnsonFilter();
55 container = new DefaultJohnsonEventContainer();
56 request = getRequest();
57 response = getResponse();
58 filterChain = getFilterChain();
59 }
60
61 @Test
62 public void testErrorNotIgnorableURI() throws Exception
63 {
64 container.addEvent(new Event(EventType.get("database"), "foo"));
65 expect(request.getServletPath()).andReturn("somepage.jsp").times(2);
66 response.sendRedirect(eq("/the/error/path.jsp"));
67
68 replayAll();
69 filter.doFilter(request, response, filterChain);
70 verifyAll();
71 }
72
73 @Test
74 public void testErrorsIgnorableUri() throws Exception
75 {
76 container.addEvent(new Event(EventType.get("export"), "foo"));
77 expect(request.getServletPath()).andReturn("/the/error/path.jsp");
78 filterChain.doFilter(same(request), same(response));
79
80 replayAll();
81 filter.doFilter(request, response, filterChain);
82 verifyAll();
83 }
84
85 @Test
86 public void testNoErrorsAndNotSetup() throws Exception
87 {
88 expect(request.getServletPath()).andReturn("somepage.jsp").times(2);
89 response.sendRedirect(eq("/the/setup/path.jsp"));
90
91 replayAll();
92 filter.doFilter(request, response, filterChain);
93 verifyAll();
94 }
95
96 @Test
97 public void testNoErrorsSetup() throws Exception
98 {
99 SimpleSetupConfig.IS_SETUP = true;
100
101 expect(request.getServletPath()).andReturn("somepage.jsp");
102 filterChain.doFilter(same(request), same(response));
103
104 replayAll();
105 filter.doFilter(request, response, filterChain);
106 verifyAll();
107 }
108
109 @Test
110 public void testNoErrorsSetupButSetupURI() throws Exception
111 {
112 SimpleSetupConfig.IS_SETUP = true;
113
114 expect(request.getServletPath()).andReturn("/setuppage.jsp");
115 filterChain.doFilter(same(request), same(response));
116
117 replayAll();
118 filter.doFilter(request, response, filterChain);
119 verifyAll();
120 }
121
122 @Test
123 public void testNoErrorsNotSetupButSetupURI() throws Exception
124 {
125 expect(request.getServletPath()).andReturn("/setup.jsp");
126 filterChain.doFilter(same(request), same(response));
127
128 replayAll();
129 filter.doFilter(request, response, filterChain);
130 verifyAll();
131 }
132
133 @Test
134 public void testNoErrorsNotSetupIgnorableURI() throws Exception
135 {
136 expect(request.getServletPath()).andReturn("/ignore/path/1.jsp");
137 filterChain.doFilter(same(request), same(response));
138
139 replayAll();
140 filter.doFilter(request, response, filterChain);
141 verifyAll();
142 }
143
144 @Test
145 public void testNoErrorsNotSetupNotIgnorableURI() throws Exception
146 {
147 expect(request.getServletPath()).andReturn("/somepage.jsp").times(2);
148 response.sendRedirect(eq("/the/setup/path.jsp"));
149
150 replayAll();
151 filter.doFilter(request, response, filterChain);
152 verifyAll();
153 }
154
155 @Test
156 public void testNotAppliedTwice() throws ServletException, IOException
157 {
158 expect(request.getServletPath()).andReturn("/somepage.jsp").times(2);
159 response.sendRedirect(eq("/the/setup/path.jsp"));
160
161 replayAll();
162 filter.doFilter(request, response, filterChain);
163 verifyAll();
164
165 reset(request);
166 expect(request.getAttribute(eq(ALREADY_FILTERED))).andReturn(Boolean.TRUE);
167
168 reset(filterChain);
169 filterChain.doFilter(same(request), same(response));
170
171 replay(filterChain, request);
172 filter.doFilter(request, response, filterChain);
173 verify(filterChain, request);
174 }
175
176 @Test
177 public void testEmptyServletPaths() throws ServletException, IOException
178 {
179 expect(request.getServletPath()).andStubReturn("");
180 expect(request.getContextPath()).andStubReturn("");
181 expect(request.getRequestURI()).andStubReturn("/requestpage.jsp");
182 expect(request.getPathInfo()).andStubReturn(null);
183 response.sendRedirect(eq("/the/setup/path.jsp"));
184
185 replayAll();
186 filter.doFilter(request, response, filterChain);
187 verifyAll();
188 }
189
190 @Test
191 public void testGetStringForEvents()
192 {
193 JohnsonFilter filter = new JohnsonFilter();
194 EventType type = new EventType("mytype", "mydesc");
195 Event[] eventsArr = new Event[]{new Event(type, "Error 1"), new Event(type, "Error 2")};
196 String stringForEvents = filter.getStringForEvents(Arrays.asList(eventsArr));
197 assertEquals("Error 1\nError 2", stringForEvents);
198 }
199
200 private FilterChain getFilterChain() throws ServletException
201 {
202 container = new DefaultJohnsonEventContainer();
203
204 ServletContext servletContext = createNiceMock(ServletContext.class);
205 expect(servletContext.getAttribute(same(Johnson.EVENT_CONTAINER_ATTRIBUTE))).andStubReturn(container);
206
207 FilterChain filterChain = createNiceMock(FilterChain.class);
208
209 FilterConfig filterConfig = createNiceMock(FilterConfig.class);
210 expect(filterConfig.getServletContext()).andStubReturn(servletContext);
211
212 filter.init(filterConfig);
213 return filterChain;
214 }
215
216 private HttpServletResponse getResponse()
217 {
218 return createStrictMock(HttpServletResponse.class);
219 }
220
221 private HttpServletRequest getRequest()
222 {
223 HttpServletRequest request = createStrictMock(HttpServletRequest.class);
224 expect(request.getContextPath()).andStubReturn("");
225 expect(request.getAttribute(eq(ALREADY_FILTERED))).andReturn(null);
226 request.setAttribute(eq(ALREADY_FILTERED), eq(Boolean.TRUE));
227
228 return request;
229 }
230 }