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