View Javadoc
1   package com.atlassian.plugin.servlet;
2   
3   import junit.framework.TestCase;
4   import org.mockito.ArgumentCaptor;
5   import org.mockito.Mock;
6   
7   import javax.servlet.http.HttpServletRequest;
8   import javax.servlet.http.HttpServletResponse;
9   
10  import static org.mockito.Mockito.eq;
11  import static org.mockito.Mockito.mock;
12  import static org.mockito.Mockito.verify;
13  import static org.mockito.Mockito.verifyNoMoreInteractions;
14  import static org.mockito.Mockito.when;
15  
16  public class TestResourceDownloadUtils extends TestCase {
17      private static final long ONE_YEAR = 60L * 60L * 24L * 365L;
18      private static final long ONE_YEAR_MS = ONE_YEAR * 1000;
19      private static final String CACHE_CONTROL = "Cache-Control";
20  
21      @Mock
22      private HttpServletRequest mockRequest;
23  
24      @Mock
25      private HttpServletResponse mockResponse;
26  
27      public void setUp() {
28          mockRequest = mock(HttpServletRequest.class);
29          mockResponse = mock(HttpServletResponse.class);
30      }
31  
32      public void testAddPublicCachingHeaders() {
33          when(mockRequest.getParameter(eq("cache"))).thenReturn("true");
34  
35          // This is part of a ghetto assert for time. We could freeze time if we were using jodatime.
36          long expectedTime = aboutNowPlusAYear();
37  
38          ResourceDownloadUtils.addPublicCachingHeaders(mockRequest, mockResponse);
39  
40          ArgumentCaptor<Long> argument = ArgumentCaptor.forClass(Long.class);
41          verify(mockResponse).setDateHeader(eq("Expires"), argument.capture());
42          assertTrue("Set expires header beyond one year from now", expectedTime <= argument.getValue());
43  
44          verify(mockResponse).setHeader(CACHE_CONTROL, "max-age=" + ONE_YEAR);
45      }
46  
47      public void testAddCachingHeadersWithCacheControls() {
48          when(mockRequest.getParameter(eq("cache"))).thenReturn("true");
49  
50          // This is part of a ghetto assert for time. We could freeze time if we were using jodatime.
51          long expectedTime = aboutNowPlusAYear();
52  
53          ResourceDownloadUtils.addCachingHeaders(mockRequest, mockResponse, "private", "foo");
54  
55          ArgumentCaptor<Long> argument = ArgumentCaptor.forClass(Long.class);
56          verify(mockResponse).setDateHeader(eq("Expires"), argument.capture());
57          assertTrue("Set expires header beyond one year from now", expectedTime <= argument.getValue());
58  
59          verify(mockResponse).setHeader(CACHE_CONTROL, "max-age=" + ONE_YEAR);
60          verify(mockResponse).addHeader(CACHE_CONTROL, "private");
61          verify(mockResponse).addHeader(CACHE_CONTROL, "foo");
62      }
63  
64      public void testNoCachingHeadersWhenCachingDisabled() {
65          when(mockRequest.getParameter(eq("cache"))).thenReturn("false");
66  
67          ResourceDownloadUtils.addPublicCachingHeaders(mockRequest, mockResponse);
68  
69          verifyNoMoreInteractions(mockResponse);
70      }
71  
72      private static long aboutNowPlusAYear() {
73          return System.currentTimeMillis() + ONE_YEAR_MS;
74      }
75  }