View Javadoc

1   package com.atlassian.gzipfilter;
2   
3   import java.io.IOException;
4   import java.util.HashMap;
5   import java.util.Map;
6   
7   import javax.servlet.http.HttpServletResponse;
8   
9   import junit.framework.TestCase;
10  
11  import com.atlassian.gzipfilter.selector.GzipCompatibilitySelector;
12  import com.mockobjects.dynamic.C;
13  import com.mockobjects.dynamic.Mock;
14  import com.mockobjects.servlet.MockHttpServletResponse;
15  import org.apache.commons.lang.StringUtils;
16  import org.junit.After;
17  import org.junit.Before;
18  import org.junit.Ignore;
19  import org.junit.Test;
20  import static org.junit.Assert.assertEquals;
21  import static org.junit.Assert.assertNull;
22  import static org.junit.Assert.assertTrue;
23  
24  /**
25   * <p>This Class currently only tests that the content-encoding header is not set when a redirect/error occurs.</p>
26   * <p>todo: Write tests for most of the functionality.</p>
27   */
28  public class TestSelectingResponseWrapper
29  {
30      private Mock mockCompatibilitySelector;
31  
32      @Before
33      public void setUp() throws Exception
34      {
35          mockCompatibilitySelector = new Mock(GzipCompatibilitySelector.class);
36          mockCompatibilitySelector.matchAndReturn("shouldGzip", "notgzipped", false);
37          mockCompatibilitySelector.matchAndReturn("shouldGzip", C.ANY_ARGS, true);
38      }
39  
40      @After
41      public void tearDown() throws Exception
42      {
43          mockCompatibilitySelector = null;
44      }
45  
46      @Test
47      public void testNoZipOnSpecificContent() throws IOException
48      {
49          HeaderTrackingResponse wrappedResponse = new HeaderTrackingResponse();
50          GzipCompatibilitySelector selector = (GzipCompatibilitySelector) mockCompatibilitySelector.proxy();
51          SelectingResponseWrapper selectingResponseWrapper = new SelectingResponseWrapper(wrappedResponse, selector, "");
52  
53          selectingResponseWrapper.setContentType("notgzipped");
54          assertNull(wrappedResponse.getHeader("content-encoding"));
55          selectingResponseWrapper.sendRedirect("string");
56          selectingResponseWrapper.finishResponse();
57          assertNull(wrappedResponse.getHeader("content-encoding"));
58          assertTrue(wrappedResponse.isSendRedirectCalled());
59      }
60  
61      @Test
62      public void testNoZipOnRedirect() throws IOException
63      {
64          HeaderTrackingResponse wrappedResponse = new HeaderTrackingResponse();
65          GzipCompatibilitySelector selector = (GzipCompatibilitySelector) mockCompatibilitySelector.proxy();
66          SelectingResponseWrapper selectingResponseWrapper = new SelectingResponseWrapper(wrappedResponse, selector, "");
67  
68          selectingResponseWrapper.setContentType("ignoredIfNotNull");
69          assertNull(wrappedResponse.getHeader("content-encoding"));
70          selectingResponseWrapper.sendRedirect("string");
71          selectingResponseWrapper.finishResponse();
72          assertNull(wrappedResponse.getHeader("content-encoding"));
73          assertTrue(wrappedResponse.isSendRedirectCalled());
74      }
75  
76      @Test
77      public void testNoZipOnError() throws IOException
78      {
79          HeaderTrackingResponse wrappedResponse = new HeaderTrackingResponse();
80          GzipCompatibilitySelector selector = (GzipCompatibilitySelector) mockCompatibilitySelector.proxy();
81          SelectingResponseWrapper selectingResponseWrapper = new SelectingResponseWrapper(wrappedResponse, selector, "");
82  
83          selectingResponseWrapper.setContentType("ignoredIfNotNull");
84          assertNull(wrappedResponse.getHeader("content-encoding"));
85          selectingResponseWrapper.sendError(404);
86          selectingResponseWrapper.finishResponse();
87          assertNull(wrappedResponse.getHeader("content-encoding"));
88          assertTrue(wrappedResponse.isSendErrorCalled());
89      }
90  
91  
92      /**
93       * Tests that the response is not gzipped when the response code is {@link HttpServletResponse#SC_NO_CONTENT}
94       */
95      @Test
96      public void testNoZipOnNoContentResponse()
97      {
98          final HeaderTrackingResponse wrappedResponse = new HeaderTrackingResponse();
99          final GzipCompatibilitySelector selector = (GzipCompatibilitySelector) mockCompatibilitySelector.proxy();
100         SelectingResponseWrapper selectingResponseWrapper = new SelectingResponseWrapper(wrappedResponse, selector, "");
101         selectingResponseWrapper.setContentType("ignoredIfNotNull");
102 
103         assertNull(wrappedResponse.getHeader("content-encoding"));
104         selectingResponseWrapper.setStatus(HttpServletResponse.SC_NO_CONTENT);
105         selectingResponseWrapper.finishResponse();
106         assertNull(wrappedResponse.getHeader("content-encoding"));
107     }
108 
109     /**
110      * Tests that the response is not gzipped when the response code is {@link HttpServletResponse#SC_NOT_MODIFIED}
111      */
112     @Test
113     public void testNoZipOnNotModifiedResponse()
114     {
115         final HeaderTrackingResponse wrappedResponse = new HeaderTrackingResponse();
116         final GzipCompatibilitySelector selector = (GzipCompatibilitySelector) mockCompatibilitySelector.proxy();
117         SelectingResponseWrapper selectingResponseWrapper = new SelectingResponseWrapper(wrappedResponse, selector, "");
118         selectingResponseWrapper.setContentType("ignoredIfNotNull");
119 
120         assertNull(wrappedResponse.getHeader("content-encoding"));
121         selectingResponseWrapper.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
122         selectingResponseWrapper.finishResponse();
123         assertNull(wrappedResponse.getHeader("content-encoding"));
124     }
125 
126     @Test
127     public void testNoActivateGzipWhenContentLengthHasBeenSetAlready()
128     {
129         final HeaderTrackingResponse wrappedResponse = new HeaderTrackingResponse();
130         wrappedResponse.setHeader("Content-Length", "123");
131         final GzipCompatibilitySelector selector = (GzipCompatibilitySelector) mockCompatibilitySelector.proxy();
132         SelectingResponseWrapper selectingResponseWrapper = new SelectingResponseWrapper(wrappedResponse, selector, "");
133         selectingResponseWrapper.setContentType("ignoredIfNotNull");
134         selectingResponseWrapper.finishResponse();
135 
136         assertNull("If Content-Length header was set, gzip should not be activated",
137                 wrappedResponse.getHeader("content-encoding"));
138     }
139 
140     private static class HeaderTrackingResponse extends MockHttpServletResponse
141     {
142         private final Map headersSet = new HashMap();
143         private boolean sendRedirectCalled = false;
144         private boolean sendErrorCalled = false;
145 
146         public boolean containsHeader(String key)
147         {
148             return headersSet.containsKey(key.toLowerCase());
149         }
150 
151         public void setHeader(String s, String s1)
152         {
153             super.setHeader(s, s1);
154             headersSet.put(s.toLowerCase(), s1);
155         }
156 
157         public void addHeader(String s, String s1)
158         {
159             super.setHeader(s, s1);
160             String existingHeader = (String) headersSet.get(s.toLowerCase());
161             headersSet.put(s.toLowerCase(), existingHeader + "," + s1);
162         }
163 
164         public String getHeader(String key)
165         {
166             return (String) headersSet.get(key.toLowerCase());
167         }
168 
169         public void sendRedirect(String s) throws IOException
170         {
171             super.sendRedirect(s);
172             sendRedirectCalled = true;
173         }
174 
175         public void sendError(int anErrorCode, String anErrorMessage) throws IOException
176         {
177             super.sendError(anErrorCode, anErrorMessage);
178             sendErrorCalled = true;
179         }
180 
181         public void sendError(int anErrorCode) throws IOException
182         {
183             super.sendError(anErrorCode);
184             sendErrorCalled = true;
185         }
186 
187         public void setDateHeader(String string, long l)
188         {
189             // this is not implemented by Mocks, so just ignore, otherwise you get exceptions in the logs :)
190         }
191 
192         public boolean isSendRedirectCalled()
193         {
194             return sendRedirectCalled;
195         }
196 
197         boolean isSendErrorCalled()
198         {
199             return sendErrorCalled;
200         }
201     }
202 }