/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved. * This code is licensed under the GPL 2.0 license, availible at the root * application directory. */ package org.geoserver.filters; import java.io.BufferedReader; import java.lang.reflect.Method; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import junit.framework.Test; import org.geoserver.test.GeoServerTestSupport; import com.mockrunner.mock.web.MockHttpServletRequest; import com.mockrunner.mock.web.MockHttpSession; import com.mockrunner.mock.web.MockServletContext; public class BufferedRequestWrapperTest extends GeoServerTestSupport{ protected final String[] testStrings = new String[]{ "Hello, this is a test", "LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLong", "" }; /** * This is a READ ONLY TEST so we can use one time setup */ public static Test suite() { return new OneTimeTestSetup(new BufferedRequestWrapperTest()); } protected HttpServletRequest makeRequest(String body){ MockHttpServletRequest request = new MockHttpServletRequest(); request.setScheme("http"); request.setServerName("localhost"); request.setContextPath("/geoserver"); request.setRequestURI("/geoserver"); request.setQueryString(""); request.setRemoteAddr("127.0.0.1"); request.setServletPath("/geoserver"); request.setMethod("POST"); request.setBodyContent(body); MockHttpSession session = new MockHttpSession(); session.setupServletContext(new MockServletContext()); request.setSession(session); request.setUserPrincipal(null); return request; } public void testGetInputStream() throws Exception{ for (int i = 0; i < testStrings.length; i++){ doInputStreamTest(testStrings[i]); } } public void testGetReader() throws Exception{ for (int i = 0; i < testStrings.length; i++){ doGetReaderTest(testStrings[i]); } } public void doInputStreamTest(String testString) throws Exception{ HttpServletRequest req = makeRequest(testString); BufferedRequestWrapper wrapper = new BufferedRequestWrapper(req, testString); ServletInputStream sis = req.getInputStream(); byte b[] = new byte[32]; int amountRead; while (( sis.readLine(b, 0, 32)) > 0){ /*clear out the request body*/ } sis = wrapper.getInputStream(); StringBuffer buff = new StringBuffer(); while ((amountRead = sis.readLine(b, 0, 32)) != 0){ buff.append(new String(b, 0, amountRead)); } assertEquals(buff.toString(), testString); //compare(req, wrapper); } public void doGetReaderTest(String testString) throws Exception{ HttpServletRequest req = makeRequest(testString); BufferedReader br = req.getReader(); String line; while ((br.readLine()) != null){ /* clear out the body */ } BufferedRequestWrapper wrapper = new BufferedRequestWrapper(req, testString); StringBuffer buff = new StringBuffer(); br = wrapper.getReader(); while ((line = br.readLine()) != null){ buff.append(line); } assertEquals(buff.toString(), testString); //compare(req, wrapper); } public static void compare(HttpServletRequest reqA, HttpServletRequest reqB){ Method[] methods = HttpServletRequest.class.getMethods(); for (int i = 0; i < methods.length; i++){ try { if (methods[i].getParameterTypes().length == 0){ Object resultA = methods[i].invoke(reqA); Object resultB = methods[i].invoke(reqB); assertEquals(resultA, resultB); } } catch (Exception e){ // don't do anything, it's fine } } } }