package com.vaadin.server;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import java.net.MalformedURLException;
import java.net.URL;
import javax.servlet.http.HttpServletRequest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class TestAbstractApplicationServletStaticFilesLocation {
VaadinServlet servlet;
// private Method getStaticFilesLocationMethod;
@Before
public void setUp() throws Exception {
servlet = new VaadinServlet();
servlet.init(new MockServletConfig());
}
@Test
public void testWidgetSetLocation() throws Exception {
String location;
/* SERVLETS */
// http://dummy.host:8080/contextpath/servlet
// should return . (relative url resolving to /contextpath)
location = testLocation("http://dummy.host:8080", "/contextpath",
"/servlet", "");
Assert.assertEquals(".", location);
// http://dummy.host:8080/contextpath/servlet/
// should return ./.. (relative url resolving to /contextpath)
location = testLocation("http://dummy.host:8080", "/contextpath",
"/servlet", "/");
Assert.assertEquals("./..", location);
// http://dummy.host:8080/servlet
// should return "."
location = testLocation("http://dummy.host:8080", "", "/servlet", "");
Assert.assertEquals(".", location);
// http://dummy.host/contextpath/servlet/extra/stuff
// should return ./../.. (relative url resolving to /contextpath)
location = testLocation("http://dummy.host", "/contextpath", "/servlet",
"/extra/stuff");
Assert.assertEquals("./../..", location);
// http://dummy.host/context/path/servlet/extra/stuff
// should return ./../.. (relative url resolving to /context/path)
location = testLocation("http://dummy.host", "/context/path",
"/servlet", "/extra/stuff");
Assert.assertEquals("./../..", location);
/* Include requests */
// Include request support dropped with support for portlet1
// Might reconsider when JSP integration support is implemented
// location = testIncludedLocation("http://my.portlet.server", "/user",
// "/tmpservletlocation1", "");
// assertEquals("Wrong widgetset location", "/user", location);
}
private String testLocation(String base, String contextPath,
String servletPath, String pathInfo) throws Exception {
HttpServletRequest request = createNonIncludeRequest(base, contextPath,
servletPath, pathInfo);
// Set request into replay mode
replay(request);
String location = servlet.getService()
.getStaticFileLocation(servlet.createVaadinRequest(request));
return location;
}
private String testIncludedLocation(String base, String portletContextPath,
String servletPath, String pathInfo) throws Exception {
HttpServletRequest request = createIncludeRequest(base,
portletContextPath, servletPath, pathInfo);
// Set request into replay mode
replay(request);
String location = servlet.getService()
.getStaticFileLocation(servlet.createVaadinRequest(request));
return location;
}
private HttpServletRequest createIncludeRequest(String base,
String realContextPath, String realServletPath, String pathInfo)
throws Exception {
HttpServletRequest request = createRequest(base, "", "", pathInfo);
expect(request.getAttribute("javax.servlet.include.context_path"))
.andReturn(realContextPath).anyTimes();
expect(request.getAttribute("javax.servlet.include.servlet_path"))
.andReturn(realServletPath).anyTimes();
return request;
}
private HttpServletRequest createNonIncludeRequest(String base,
String realContextPath, String realServletPath, String pathInfo)
throws Exception {
HttpServletRequest request = createRequest(base, realContextPath,
realServletPath, pathInfo);
expect(request.getAttribute("javax.servlet.include.context_path"))
.andReturn(null).anyTimes();
expect(request.getAttribute("javax.servlet.include.servlet_path"))
.andReturn(null).anyTimes();
return request;
}
/**
* Creates a HttpServletRequest mock using the supplied parameters.
*
* @param base
* The base url, e.g. http://localhost:8080
* @param contextPath
* The context path where the application is deployed, e.g.
* /mycontext
* @param servletPath
* The servlet path to the servlet we are testing, e.g. /myapp
* @param pathInfo
* Any text following the servlet path in the request, not
* including query parameters, e.g. /UIDL/
* @return A mock HttpServletRequest object useful for testing
* @throws MalformedURLException
*/
private HttpServletRequest createRequest(String base, String contextPath,
String servletPath, String pathInfo) throws MalformedURLException {
URL url = new URL(base + contextPath + pathInfo);
HttpServletRequest request = createMock(HttpServletRequest.class);
expect(request.isSecure())
.andReturn(url.getProtocol().equalsIgnoreCase("https"))
.anyTimes();
expect(request.getServerName()).andReturn(url.getHost()).anyTimes();
expect(request.getServerPort()).andReturn(url.getPort()).anyTimes();
expect(request.getRequestURI()).andReturn(url.getPath()).anyTimes();
expect(request.getContextPath()).andReturn(contextPath).anyTimes();
expect(request.getPathInfo()).andReturn(pathInfo).anyTimes();
expect(request.getServletPath()).andReturn(servletPath).anyTimes();
return request;
}
}