blob: d80c33bdaab1e434ef67f5f42dd412faf66fc247 [file] [log] [blame]
/*
* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.struts2.rest;
import junit.framework.TestCase;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import static javax.servlet.http.HttpServletResponse.SC_CREATED;
import static javax.servlet.http.HttpServletResponse.SC_NOT_MODIFIED;
import static javax.servlet.http.HttpServletResponse.SC_OK;
public class DefaultHttpHeadersTest extends TestCase {
private MockHttpServletResponse mockResponse;
private MockHttpServletRequest mockRequest;
@Override
public void setUp() {
mockResponse = new MockHttpServletResponse();
mockRequest = new MockHttpServletRequest();
}
@Override
public void tearDown() {
mockRequest = null;
mockRequest = null;
}
public void testApply() {
Date now = new Date();
DefaultHttpHeaders headers = new DefaultHttpHeaders()
.lastModified(now)
.withStatus(SC_OK)
.setLocationId("44")
.withETag("asdf");
mockRequest.setRequestURI("/foo/bar.xhtml");
headers.apply(mockRequest, mockResponse, new Object());
assertEquals(SC_CREATED, mockResponse.getStatus());
assertEquals("http://localhost:80/foo/bar/44.xhtml", mockResponse.getHeader("Location"));
assertEquals("asdf", mockResponse.getHeader("ETag"));
assertEquals(now.getTime(), mockResponse.getHeader("Last-Modified"));
}
public void testApplyNoLocationExtension() {
DefaultHttpHeaders headers = new DefaultHttpHeaders()
.setLocationId("44");
mockRequest.setRequestURI("/foo/bar");
headers.apply(mockRequest, mockResponse, new Object());
assertEquals("http://localhost:80/foo/bar/44", mockResponse.getHeader("Location"));
assertEquals(SC_CREATED, mockResponse.getStatus());
}
public void testApplyFullLocation() {
DefaultHttpHeaders headers = new DefaultHttpHeaders()
.setLocation("http://localhost/bar/44");
mockRequest.setRequestURI("/foo/bar");
headers.apply(mockRequest, mockResponse, new Object());
assertEquals("http://localhost/bar/44", mockResponse.getHeader("Location"));
assertEquals(SC_CREATED, mockResponse.getStatus());
}
public void testAutoETag() {
DefaultHttpHeaders headers = new DefaultHttpHeaders();
headers.apply(mockRequest, mockResponse, new Object() {
@Override
public int hashCode() {
return 123;
}
});
assertEquals("123", mockResponse.getHeader("ETag"));
}
public void testNoCache() {
DefaultHttpHeaders headers = new DefaultHttpHeaders()
.disableCaching();
headers.apply(mockRequest, mockResponse, new Object());
assertEquals("no-cache", mockResponse.getHeader("Cache-Control"));
}
public void testConditionalGetForJustETag() {
DefaultHttpHeaders headers = new DefaultHttpHeaders()
.withETag("asdf");
mockRequest.addHeader("If-None-Match", "asdf");
headers.apply(mockRequest, mockResponse, new Object());
assertEquals(SC_NOT_MODIFIED, mockResponse.getStatus());
assertEquals("asdf", mockResponse.getHeader("ETag"));
}
public void testConditionalGetForJustETagNotOK() {
DefaultHttpHeaders headers = new DefaultHttpHeaders()
.withETag("asdf")
.withStatus(SC_BAD_REQUEST);
mockRequest.addHeader("If-None-Match", "asdf");
headers.apply(mockRequest, mockResponse, new Object());
assertEquals(SC_BAD_REQUEST, mockResponse.getStatus());
assertEquals("asdf", mockResponse.getHeader("ETag"));
}
public void testConditionalGetForJustLastModified() {
Date now = new Date();
DefaultHttpHeaders headers = new DefaultHttpHeaders()
.lastModified(now);
mockRequest.addHeader("If-Modified-Since", getGMTDateFormat().format(now));
headers.apply(mockRequest, mockResponse, new Object());
assertEquals(SC_NOT_MODIFIED, mockResponse.getStatus());
}
public void testConditionalGetForJustLastModifiedDifferent() {
Date now = new Date();
DefaultHttpHeaders headers = new DefaultHttpHeaders()
.lastModified(now);
mockRequest.addHeader("If-Modified-Since", String.valueOf(new Date(2323L).getTime()));
headers.apply(mockRequest, mockResponse, new Object());
assertEquals(SC_OK, mockResponse.getStatus());
}
public void testLastModifiedSince() {
Date now = new Date();
DefaultHttpHeaders headers = new DefaultHttpHeaders().lastModified(now);
mockRequest.addHeader("If-Modified-Since", getGMTDateFormat().format(now));
headers.apply(mockRequest, mockResponse, new Object());
assertEquals(SC_NOT_MODIFIED, mockResponse.getStatus());
}
public void testLastModifiedSinceIsOlder() {
Date now = new Date();
DefaultHttpHeaders headers = new DefaultHttpHeaders().lastModified(now);
mockRequest.addHeader("If-Modified-Since", getGMTDateFormat().format(new Date(now.getTime() - 1000 * 60 * 60)));
headers.apply(mockRequest, mockResponse, new Object());
assertEquals(SC_NOT_MODIFIED, mockResponse.getStatus());
}
public void testConditionalGetForLastModifiedAndETag() {
Date now = new Date();
DefaultHttpHeaders headers = new DefaultHttpHeaders()
.lastModified(now)
.withETag("asdf");
mockRequest.addHeader("If-None-Match", "asdf");
mockRequest.addHeader("If-Modified-Since", getGMTDateFormat().format(now));
headers.apply(mockRequest, mockResponse, new Object());
assertEquals(SC_NOT_MODIFIED, mockResponse.getStatus());
}
public void testConditionalGetForLastModifiedAndETagButNoCache() {
Date now = new Date();
DefaultHttpHeaders headers = new DefaultHttpHeaders()
.lastModified(now)
.withETag("asdf")
.disableCaching();
mockRequest.addHeader("If-None-Match", "asdf");
mockRequest.addHeader("If-Modified-Since", String.valueOf(now.getTime()));
headers.apply(mockRequest, mockResponse, new Object());
assertEquals(SC_OK, mockResponse.getStatus());
}
public void testConditionalGetForLastModifiedAndETagWithBadETag() {
Date now = new Date();
DefaultHttpHeaders headers = new DefaultHttpHeaders()
.lastModified(now)
.withETag("fdsa");
mockRequest.addHeader("If-None-Match", "asdfds");
mockRequest.addHeader("If-Modified-Since", String.valueOf(now.getTime()));
headers.apply(mockRequest, mockResponse, new Object());
assertEquals(SC_OK, mockResponse.getStatus());
}
public void testApplyOptions() {
String methods = "OPTIONS, GET, POST, PUT";
String allow = "Allow";
mockResponse.addHeader(allow, methods);
DefaultHttpHeaders httpHeaders = new DefaultHttpHeaders();
httpHeaders.apply(mockRequest, mockResponse, this);
httpHeaders.disableCaching().withStatus(SC_OK);
assertEquals(methods, mockResponse.getHeader(allow));
assertEquals(SC_OK, mockResponse.getStatus());
}
private SimpleDateFormat getGMTDateFormat() {
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("GMT"));
return format;
}
}