package net.sf.jsptest.compiler.jsp20; import java.io.IOException; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.jsp.JspFactory; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; import junit.framework.TestCase; import net.sf.jsptest.compiler.api.JspExecution; import net.sf.jsptest.compiler.jsp20.mock.MockJspWriter; /** * @author Lasse Koskela */ public class TestJspImpl extends TestCase { public static class FakeServlet extends javax.servlet.http.HttpServlet { protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { JspFactory _jspxFactory = JspFactory.getDefaultFactory(); resp.setContentType("text/html"); PageContext pageContext = _jspxFactory.getPageContext(this, req, resp, null, true, 8192, true); JspWriter out = pageContext.getOut(); // this is the way Jasper's JspServlet obtains the session HttpSession session = pageContext.getSession(); out.println("httpMethod=" + req.getMethod()); Enumeration names = req.getAttributeNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); out.print(name); out.print("="); out.println(req.getAttribute(name)); } Enumeration names2 = session.getAttributeNames(); while (names2.hasMoreElements()) { String name = (String) names2.nextElement(); out.print(name); out.print("="); out.println(session.getAttribute(name)); } out.println(); out.flush(); out.close(); } } protected String responseOutput; private JspImpl jspImpl; private Map requestAttributes; private Map sessionAttributes; private Map<String, String[]> requestParameters; private MockJspWriter mockJspWriter; protected void setUp() throws Exception { requestAttributes = new HashMap(); sessionAttributes = new HashMap(); requestParameters = new HashMap<String, String[]>(); requestAttributes.put("REQATTR", "REQVALUE"); sessionAttributes.put("SESATTR", "SESVALUE"); jspImpl = new JspImpl(FakeServlet.class) { protected MockJspWriter configureJspFactory(ServletContext httpContext, HttpServletRequest httpRequest, HttpSession httpSession) { mockJspWriter = super.configureJspFactory(httpContext, httpRequest, httpSession); return mockJspWriter; } }; } public void testHttpMethodIsPassedToTheServletInstance() throws Exception { simulateRequest("GET"); assertOutputContains("httpMethod=GET"); simulateRequest("POST"); assertOutputContains("httpMethod=POST"); } public void testRequestAttributesArePassedToTheServletInstance() throws Exception { simulateRequest(); assertOutputContains("REQATTR=REQVALUE"); } public void testSessionAttributesArePassedToTheServletInstance() throws Exception { simulateRequest(); assertOutputContains("SESATTR=SESVALUE"); } private void simulateRequest() { simulateRequest("GET"); } private void simulateRequest(String method) { JspExecution execution = jspImpl.request(method, requestAttributes, requestParameters, sessionAttributes); responseOutput = execution.getRenderedResponse(); } private void assertOutputContains(String string) throws IOException { String output = mockJspWriter.getContents(); assertTrue("Output did not contain '" + string + "':"+System.getProperty("line.separator")+"[" + output + "]", output .indexOf(string) != -1); } }