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
26
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
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
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
190 }
191
192 public boolean isSendRedirectCalled()
193 {
194 return sendRedirectCalled;
195 }
196
197 boolean isSendErrorCalled()
198 {
199 return sendErrorCalled;
200 }
201 }
202 }