/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.esl.servlet.http; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import static org.junit.Assert.*; public class HttpServletRequestWrapperTest { private HttpServletRequestWrapper secureTestObj; private HttpServletRequestWrapper unsecureTestObj; @Before public void startUp() { MockHttpServletRequest testReq = new MockHttpServletRequest(); testReq.addParameter( "a", "1" ); testReq.addParameter( "a", "1b" ); testReq.addParameter( "b", "2a" ); testReq.addParameter( "c", "3" ); testReq.addParameter( "c", "3b" ); testReq.addParameter( "c", "3c" ); testReq.setContentType( "text/html" ); testReq.setRemotePort( 1234 ); testReq.setRemoteUser( "jsi" ); testReq.setRemoteHost( "bender.enonic.com" ); testReq.setServerName( "intra.enonic.com" ); testReq.setServerPort( 8080 ); testReq.setSecure( false ); testReq.setServletPath( "/servlet/DateServlet" ); testReq.setContextPath( "/dateapp" ); testReq.setRequestURI( "/dateapp/servlet/DateServlet" ); // Må settes eksplisitt, fordi Mock objektet ikke genererer denne. Map<String, String[]> params = new HashMap<String, String[]>(); params.put( "b", new String[]{"2b", "2c", "2d"} ); params.put( "d", new String[]{"4"} ); params.put( "e", new String[]{"5a", "5b", "5c", "5d", "5e", "5f"} ); unsecureTestObj = new HttpServletRequestWrapper( testReq, params ); testReq = new MockHttpServletRequest(); testReq.setServerName( "localhost" ); testReq.setServerPort( 4848 ); testReq.setSecure( true ); testReq.setServletPath( "/servlet/TimeServlet" ); testReq.setContextPath( "/timeapp" ); testReq.setRequestURI( "/timeapp/servlet/TimeServlet" ); // Må settes eksplisitt, fordi Mock objektet ikke genererer denne. secureTestObj = new HttpServletRequestWrapper( testReq, params ); } @Test public void testGetParameter() { String aTestNo = unsecureTestObj.getParameter( "a" ); unsecureTestObj.setInherit( true ); String aTestYes = unsecureTestObj.getParameter( "a" ); assertNull( "a should be null when not inherited", aTestNo ); assertNotNull( "a should not be null when inherited", aTestYes ); } @Test public void testGetParameterMap() { Map<String, String[]> notInheritedMap = unsecureTestObj.getParameterMap(); unsecureTestObj.setInherit( true ); Map<String, String[]> inheritedMap = unsecureTestObj.getParameterMap(); assertEquals( "There should be 3 keys when not inherited", 3, notInheritedMap.keySet().size() ); assertEquals( "There should be 5 keys when inherited", 5, inheritedMap.keySet().size() ); assertEquals( "The 'e' parameter should have the same value in both maps", notInheritedMap.get( "e" ), inheritedMap.get( "e" ) ); assertNull( "a only exists when inherited.", notInheritedMap.get( "a" ) ); assertNotNull( "a should exist when inherited", inheritedMap.get( "a" ) ); } @Test public void testGetParameterNames() { Enumeration<String> notInheritedEnum = unsecureTestObj.getParameterNames(); unsecureTestObj.setInherit( true ); Enumeration<String> inheritedEnum = unsecureTestObj.getParameterNames(); ArrayList<String> notInheritedArray = convertEnumToArrayList( notInheritedEnum ); ArrayList<String> inheritedArray = convertEnumToArrayList( inheritedEnum ); assertEquals( "The not inherited list should have 3 elements", 3, notInheritedArray.size() ); assertEquals( "The inherited list should have 5 elements", 5, inheritedArray.size() ); assertTrue( "There should not be any 'a' among the not inherited params.", !notInheritedArray.contains( "a" ) ); assertTrue( "There should be any 'a' among the not inherited params.", inheritedArray.contains( "a" ) ); } @Test public void testSetGetParameterValues() { String[] notInheritedValues = unsecureTestObj.getParameterValues( "a" ); unsecureTestObj.setInherit( true ); String[] inheritedValues = unsecureTestObj.getParameterValues( "a" ); unsecureTestObj.setParameterValues( "a", new String[]{"1.0a", "1.0b", "1.1", "1.2"} ); String[] overWrittenInheritedValues = unsecureTestObj.getParameterValues( "a" ); unsecureTestObj.setInherit( false ); String[] overWrittenInheritedValues2 = unsecureTestObj.getParameterValues( "a" ); assertNull( "Before inheriting, 'a' should be null", notInheritedValues ); assertEquals( "After inheriting, a[0] should be '1'", "1", inheritedValues[0] ); assertEquals( "After inheriting, a[1] should be '1b'", "1b", inheritedValues[1] ); assertEquals( "After overwriting, a[1] should be '1.0b'", "1.0b", overWrittenInheritedValues[1] ); assertEquals( "After overwriting, a[3] should be '1.2'", "1.2", overWrittenInheritedValues[3] ); assertEquals( "After overwriting, a[1] should be '1.0b' even when not inheriting", "1.0b", overWrittenInheritedValues2[1] ); assertEquals( "After overwriting, a[3] should be '1.2' even when not inheriting", "1.2", overWrittenInheritedValues2[3] ); } @Test public void testGetQueryString() { String queryString = unsecureTestObj.getQueryString(); unsecureTestObj.setInherit( true ); String queryStringInherited = unsecureTestObj.getQueryString(); assertTrue( "Incorrect query string: " + queryString, queryString.indexOf( "b=2b&b=2c&b=2d" ) >= 0 ); assertTrue( "Incorrect query string: " + queryString, queryString.indexOf( "d=4" ) >= 0 ); assertTrue( "Incorrect query string: " + queryString, queryString.indexOf( "a=1b" ) == -1 ); assertTrue( "Incorrect query string: " + queryString, queryString.indexOf( "c=3c" ) == -1 ); assertTrue( "Incorrect inherited query string: " + queryStringInherited, queryStringInherited.indexOf( "a=1b" ) >= 0 ); assertTrue( "Incorrect inherited query string: " + queryStringInherited, queryStringInherited.indexOf( "b=2a" ) == -1 ); assertTrue( "Incorrect inherited query string: " + queryStringInherited, queryStringInherited.indexOf( "b=2b" ) >= 0 ); assertTrue( "Incorrect inherited query string: " + queryStringInherited, queryStringInherited.indexOf( "c=3c" ) >= 0 ); assertTrue( "Incorrect inherited query string: " + queryStringInherited, queryStringInherited.indexOf( "e=5d&e=5e&e=5f" ) >= 0 ); } @Test public void testGetRequestURI() { String secureURI = secureTestObj.getRequestURI(); String unsecureURI = unsecureTestObj.getRequestURI(); secureTestObj.setServletPath( "/servlet/PageServlet" ); unsecureTestObj.setServletPath( "servlet/LineServlet" ); String secureURI2 = secureTestObj.getRequestURI(); String unsecureURI2 = unsecureTestObj.getRequestURI(); assertEquals( "Incorrect secure URI", "/timeapp/servlet/TimeServlet", secureURI ); assertEquals( "Incorrect unsecure URI", "/dateapp/servlet/DateServlet", unsecureURI ); assertEquals( "Incorrect locally modified secure URI", "/timeapp/servlet/PageServlet", secureURI2 ); assertEquals( "Incorrect locally modified unsecure URI", "/dateapp/servlet/LineServlet", unsecureURI2 ); } @Test public void testGetRequestURL() { String secureURL = secureTestObj.getRequestURL().toString(); String unsecureURL = unsecureTestObj.getRequestURL().toString(); assertEquals( "Incorrect secure URL", "https://localhost:4848/timeapp/servlet/TimeServlet", secureURL ); assertEquals( "Incorrect unsecure URL", "http://intra.enonic.com:8080/dateapp/servlet/DateServlet", unsecureURL ); } @Test public void testServletPath() { String requestServletPath = unsecureTestObj.getServletPath(); unsecureTestObj.setServletPath( "local/apache2/htdocs/" ); String localServletPath = unsecureTestObj.getServletPath(); unsecureTestObj.setServletPath( "/local/tomcat/apps/enonic/" ); String localServletPath2 = unsecureTestObj.getServletPath(); unsecureTestObj.setServletPath( null ); String requestServletPath2 = unsecureTestObj.getServletPath(); assertEquals( "Incorrect servlet path", "/servlet/DateServlet", requestServletPath ); assertEquals( "Servlet path error", requestServletPath, requestServletPath2 ); assertEquals( "Incorrect servlet path", "/local/apache2/htdocs/", localServletPath ); assertEquals( "Incorrect servlet path", "/local/tomcat/apps/enonic/", localServletPath2 ); } @Test public void testWrappedCalls() { assertEquals( "Incorrect contentType", "text/html", unsecureTestObj.getContentType() ); assertEquals( "Incorrect remote port", 1234, unsecureTestObj.getRemotePort() ); assertEquals( "Incorrect remote host", "bender.enonic.com", unsecureTestObj.getRemoteHost() ); assertEquals( "Incorrect remote user", "jsi", unsecureTestObj.getRemoteUser() ); } private static <T> ArrayList<T> convertEnumToArrayList( Enumeration<T> e ) { ArrayList<T> res = new ArrayList<T>(); while ( e.hasMoreElements() ) { res.add( e.nextElement() ); } return res; } }