package uws.service; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.BufferedReader; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.Principal; import java.util.Collection; import java.util.Enumeration; import java.util.Locale; import java.util.Map; import javax.servlet.AsyncContext; import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.http.Part; import org.junit.Before; import org.junit.Test; public class TestUWSUrl { public static final class TestHttpServletRequest implements HttpServletRequest { private final String scheme; private final String serverName; private final int serverPort; private final String contextPath; private final String pathInfo; private final String requestURI; private final StringBuffer requestURL; private final String servletPath; public TestHttpServletRequest(StringBuffer requestURL, String requestURI, String scheme, String serverName, int serverPort, String contextPath, String servletPath, String pathInfo){ this.scheme = scheme; this.serverName = serverName; this.serverPort = serverPort; this.contextPath = contextPath; this.pathInfo = pathInfo; this.requestURI = requestURI; this.requestURL = requestURL; this.servletPath = servletPath; } @Override public String getScheme(){ return scheme; } @Override public String getServerName(){ return serverName; } @Override public int getServerPort(){ return serverPort; } @Override public String getPathInfo(){ return pathInfo; } @Override public String getRequestURI(){ return requestURI; } @Override public StringBuffer getRequestURL(){ return requestURL; } @Override public String getContextPath(){ return contextPath; } @Override public String getServletPath(){ return servletPath; } @Override public AsyncContext getAsyncContext(){ return null; } @Override public Object getAttribute(String arg0){ return null; } @Override public Enumeration<String> getAttributeNames(){ return null; } @Override public String getCharacterEncoding(){ return null; } @Override public int getContentLength(){ return 0; } @Override public String getContentType(){ return null; } @Override public DispatcherType getDispatcherType(){ return null; } @Override public ServletInputStream getInputStream() throws IOException{ return null; } @Override public String getLocalAddr(){ return null; } @Override public String getLocalName(){ return null; } @Override public int getLocalPort(){ return 0; } @Override public Locale getLocale(){ return null; } @Override public Enumeration<Locale> getLocales(){ return null; } @Override public String getParameter(String arg0){ return null; } @Override public Map<String,String[]> getParameterMap(){ return null; } @Override public Enumeration<String> getParameterNames(){ return null; } @Override public String[] getParameterValues(String arg0){ return null; } @Override public String getProtocol(){ return null; } @Override public BufferedReader getReader() throws IOException{ return null; } @Override public String getRealPath(String arg0){ return null; } @Override public String getRemoteAddr(){ return null; } @Override public String getRemoteHost(){ return null; } @Override public int getRemotePort(){ return 0; } @Override public RequestDispatcher getRequestDispatcher(String arg0){ return null; } @Override public ServletContext getServletContext(){ return null; } @Override public boolean isAsyncStarted(){ return false; } @Override public boolean isAsyncSupported(){ return false; } @Override public boolean isSecure(){ return false; } @Override public void removeAttribute(String arg0){ } @Override public void setAttribute(String arg0, Object arg1){ } @Override public void setCharacterEncoding(String arg0) throws UnsupportedEncodingException{ } @Override public AsyncContext startAsync(){ return null; } @Override public AsyncContext startAsync(ServletRequest arg0, ServletResponse arg1){ return null; } @Override public boolean authenticate(HttpServletResponse arg0) throws IOException, ServletException{ return false; } @Override public String getAuthType(){ return null; } @Override public Cookie[] getCookies(){ return null; } @Override public long getDateHeader(String arg0){ return 0; } @Override public String getHeader(String arg0){ return null; } @Override public Enumeration<String> getHeaderNames(){ return null; } @Override public Enumeration<String> getHeaders(String arg0){ return null; } @Override public int getIntHeader(String arg0){ return 0; } @Override public String getMethod(){ return null; } @Override public Part getPart(String arg0) throws IOException, IllegalStateException, ServletException{ return null; } @Override public Collection<Part> getParts() throws IOException, IllegalStateException, ServletException{ return null; } @Override public String getPathTranslated(){ return null; } @Override public String getQueryString(){ return null; } @Override public String getRemoteUser(){ return null; } @Override public String getRequestedSessionId(){ return null; } @Override public HttpSession getSession(){ return null; } @Override public HttpSession getSession(boolean arg0){ return null; } @Override public Principal getUserPrincipal(){ return null; } @Override public boolean isRequestedSessionIdFromCookie(){ return false; } @Override public boolean isRequestedSessionIdFromURL(){ return false; } @Override public boolean isRequestedSessionIdFromUrl(){ return false; } @Override public boolean isRequestedSessionIdValid(){ return false; } @Override public boolean isUserInRole(String arg0){ return false; } @Override public void login(String arg0, String arg1) throws ServletException{} @Override public void logout() throws ServletException{} } private HttpServletRequest requestFromRoot2root; private HttpServletRequest requestFromRoot2async; private HttpServletRequest requestFromPath2root; private HttpServletRequest requestFromPath2async; private HttpServletRequest requestWithServletPathNull; @Before public void setUp() throws Exception{ requestFromRoot2root = new TestHttpServletRequest(new StringBuffer("http://localhost:8080/tapTest/"), "/tapTest/", "http", "localhost", 8080, "/tapTest", "", "/"); requestFromRoot2async = new TestHttpServletRequest(new StringBuffer("http://localhost:8080/tapTest/async"), "/tapTest/async", "http", "localhost", 8080, "/tapTest", "", "/async"); requestFromPath2root = new TestHttpServletRequest(new StringBuffer("http://localhost:8080/tapTest/path/"), "/tapTest/path/", "http", "localhost", 8080, "/tapTest", "/path", "/"); requestFromPath2async = new TestHttpServletRequest(new StringBuffer("http://localhost:8080/tapTest/path/async"), "/tapTest/path/async", "http", "localhost", 8080, "/tapTest", "/path", "/async"); requestWithServletPathNull = new TestHttpServletRequest(new StringBuffer("http://localhost:8080/tapTest/"), "/tapTest/", "http", "localhost", 8080, "/tapTest", null, "/"); } @Test public void testExtractBaseURI(){ // CASE 1: http://localhost:8080/tapTest/path with url-pattern = /path/* try{ UWSUrl uu = new UWSUrl(requestFromPath2root); assertEquals("/path", uu.getBaseURI()); assertEquals("", uu.getUwsURI()); assertEquals("http://localhost:8080/tapTest/path/", uu.toString()); }catch(Exception e){ e.printStackTrace(System.err); fail("This HTTP request is perfectly correct: " + requestFromPath2root.getRequestURL()); } // CASE 2: http://localhost:8080/tapTest/path/async with url-pattern = /path/* try{ UWSUrl uu = new UWSUrl(requestFromPath2async); assertEquals("/path", uu.getBaseURI()); assertEquals("/async", uu.getUwsURI()); assertEquals("http://localhost:8080/tapTest/path/async", uu.toString()); }catch(Exception e){ e.printStackTrace(System.err); fail("This HTTP request is perfectly correct: " + requestFromPath2async.getRequestURL()); } // CASE 3: http://localhost:8080/tapTest with url-pattern = /* try{ UWSUrl uu = new UWSUrl(requestFromRoot2root); assertEquals("", uu.getBaseURI()); assertEquals("", uu.getUwsURI()); assertEquals("http://localhost:8080/tapTest/", uu.toString()); }catch(Exception e){ e.printStackTrace(System.err); fail("This HTTP request is perfectly correct: " + requestFromRoot2root.getRequestURL()); } // CASE 4: http://localhost:8080/tapTest/async with url-pattern = /* try{ UWSUrl uu = new UWSUrl(requestFromRoot2async); assertEquals("", uu.getBaseURI()); assertEquals("/async", uu.getUwsURI()); assertEquals("http://localhost:8080/tapTest/async", uu.toString()); }catch(Exception e){ e.printStackTrace(System.err); fail("This HTTP request is perfectly correct: " + requestFromRoot2async.getRequestURL()); } // CASE 5: http://localhost:8080/tapTest/path/async with url-pattern = /path/* try{ new UWSUrl(requestWithServletPathNull); fail("RequestURL with no servlet path: this test should have failed!"); }catch(Exception e){ assertTrue(e instanceof NullPointerException); assertEquals(e.getMessage(), "The extracted base UWS URI is NULL!"); } } @Test public void testLoadHttpServletRequest(){ // CASE 1a: http://localhost:8080/tapTest/path with url-pattern = /path/* try{ UWSUrl uu = new UWSUrl(requestFromPath2root); uu.load(requestFromPath2root); assertEquals("", uu.getUwsURI()); assertEquals("http://localhost:8080/tapTest/path/async/123456A", uu.jobSummary("async", "123456A").toString()); }catch(Exception e){ e.printStackTrace(System.err); fail("This HTTP request is perfectly correct: " + requestFromPath2root.getRequestURL()); } // CASE 1b: Idem while loading http://localhost:8080/tapTest/path/async try{ UWSUrl uu = new UWSUrl(requestFromPath2root); uu.load(requestFromPath2async); assertEquals("/async", uu.getUwsURI()); assertEquals("http://localhost:8080/tapTest/path/async/123456A", uu.jobSummary("async", "123456A").toString()); }catch(Exception e){ e.printStackTrace(System.err); fail("This HTTP request is perfectly correct: " + requestFromPath2async.getRequestURL()); } // CASE 2a: http://localhost:8080/tapTest/path/async with url-pattern = /path/* try{ UWSUrl uu = new UWSUrl(requestFromPath2async); uu.load(requestFromPath2async); assertEquals("/async", uu.getUwsURI()); assertEquals("http://localhost:8080/tapTest/path/async/123456A", uu.jobSummary("async", "123456A").toString()); }catch(Exception e){ e.printStackTrace(System.err); fail("This HTTP request is perfectly correct: " + requestFromPath2async.getRequestURL()); } // CASE 2b: Idem while loading http://localhost:8080/tapTest/path try{ UWSUrl uu = new UWSUrl(requestFromPath2async); uu.load(requestFromPath2root); assertEquals("", uu.getUwsURI()); assertEquals("http://localhost:8080/tapTest/path/async/123456A", uu.jobSummary("async", "123456A").toString()); }catch(Exception e){ e.printStackTrace(System.err); fail("This HTTP request is perfectly correct: " + requestFromPath2root.getRequestURL()); } // CASE 3a: http://localhost:8080/tapTest with url-pattern = /* try{ UWSUrl uu = new UWSUrl(requestFromRoot2root); uu.load(requestFromRoot2root); assertEquals("", uu.getUwsURI()); assertEquals("http://localhost:8080/tapTest/async/123456A", uu.jobSummary("async", "123456A").toString()); }catch(NullPointerException e){ fail("This HTTP request is perfectly correct: " + requestFromRoot2root.getRequestURL()); } // CASE 3b: Idem while loading http://localhost:8080/tapTest/async try{ UWSUrl uu = new UWSUrl(requestFromRoot2root); uu.load(requestFromRoot2async); assertEquals("/async", uu.getUwsURI()); assertEquals("http://localhost:8080/tapTest/async/123456A", uu.jobSummary("async", "123456A").toString()); }catch(Exception e){ e.printStackTrace(System.err); fail("This HTTP request is perfectly correct: " + requestFromRoot2async.getRequestURL()); } // CASE 4a: http://localhost:8080/tapTest/async with url-pattern = /* try{ UWSUrl uu = new UWSUrl(requestFromRoot2async); uu.load(requestFromRoot2async); assertEquals("/async", uu.getUwsURI()); assertEquals("http://localhost:8080/tapTest/async/123456A", uu.jobSummary("async", "123456A").toString()); }catch(Exception e){ e.printStackTrace(System.err); fail("This HTTP request is perfectly correct: " + requestFromRoot2async.getRequestURL()); } // CASE 4b: Idem while loading http://localhost:8080/tapTest try{ UWSUrl uu = new UWSUrl(requestFromRoot2async); uu.load(requestFromRoot2root); assertEquals("", uu.getUwsURI()); assertEquals("http://localhost:8080/tapTest/async/123456A", uu.jobSummary("async", "123456A").toString()); }catch(Exception e){ e.printStackTrace(System.err); fail("This HTTP request is perfectly correct: " + requestFromRoot2root.getRequestURL()); } // SPECIAL CASE 1: Creation with http://localhost:8080/tapTest[/async] (/*) but loading with http://localhost:8080/tapTest/path[/async] (/path/*): try{ UWSUrl uu = new UWSUrl(requestFromRoot2async); uu.load(requestFromPath2async); assertFalse(uu.getUwsURI().equals("")); }catch(Exception e){ e.printStackTrace(System.err); fail("This HTTP request is perfectly correct: " + requestFromRoot2root.getRequestURL()); } } }