View Javadoc

1   /**
2    * Atlassian Source Code Template.
3    * User: Bobby
4    * Date: Apr 10, 2003
5    * Time: 2:45:30 PM
6    * CVS Revision: $Revision: 1.2 $
7    * Last CVS Commit: $Date: 2006/10/09 01:01:38 $
8    * Author of last CVS Commit: $Author: bkuo $
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")); // add an event
74          request.getServletPath();
75          requestMockCtrl.setReturnValue("somepage.jsp", 2);
76          requestMockCtrl.replay();
77          mockResp.expect("sendRedirect", C.args(new IsEqual("/the/error/path.jsp"))); // verify redirect
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")); // add an event
85          request.getServletPath();
86          requestMockCtrl.setReturnValue("/the/error/path.jsp");
87          requestMockCtrl.replay();
88          mockFilterChain.expect("doFilter", C.args(new IsAnything(), new IsAnything())); // verify that doFilter is called
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"))); // verify redirect
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())); // verify that doFilter is called
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())); // verify that doFilter is called
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"); // setup URI as containing 'setup'
135         requestMockCtrl.replay();
136         mockFilterChain.expect("doFilter", C.args(new IsAnything(), new IsAnything())); // verify that doFilter is called
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"); // setup URI as ignorable
147         requestMockCtrl.replay();
148         mockFilterChain.expect("doFilter", C.args(new IsAnything(), new IsAnything())); // verify that doFilter is called
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); // setup URI as not ignorable
159         requestMockCtrl.replay();
160         mockResp.expect("sendRedirect", C.args(new IsEqual("/the/setup/path.jsp"))); // verify redirect
161 
162         filter.doFilter(request, response, filterChain);
163         verifyAll();
164     }
165 
166     /**
167      * Check that the app consistency filter is not applied twice to the same request.
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"))); // verify redirect
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())); // verify that doFilter is called
185 
186         filter.doFilter(request, response, filterChain);
187         verifyAll();
188     }
189 
190     /**
191      * Check that the app consistency filter is not applied twice to the same request.
192      */
193     public void testEmptyServletPaths() throws ServletException, IOException
194     {
195         requestMockCtrl.reset();
196         request.getServletPath();
197         requestMockCtrl.setReturnValue("", 0, 10); // don't care how many calls
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"))); // verify redirect
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 }