//======================================================================== //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. //------------------------------------------------------------------------ //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at //http://www.apache.org/licenses/LICENSE-2.0 //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. //======================================================================== import java.io.IOException; import java.net.URL; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.mortbay.io.ByteArrayBuffer; import org.mortbay.jetty.testing.HttpTester; import org.mortbay.jetty.testing.ServletTester; import org.mortbay.util.IO; public class ServletTest extends TestCase { ServletTester tester; /* ------------------------------------------------------------ */ protected void setUp() throws Exception { super.setUp(); tester=new ServletTester(); tester.setContextPath("/context"); tester.addServlet(TestServlet.class, "/servlet/*"); tester.addServlet(HelloServlet.class, "/hello/*"); tester.addServlet("org.mortbay.jetty.servlet.DefaultServlet", "/"); tester.start(); } /* ------------------------------------------------------------ */ protected void tearDown() throws Exception { tester.stop(); tester=null; super.tearDown(); } /* ------------------------------------------------------------ */ public void testServletTesterRaw() throws Exception { // Raw HTTP test requests String requests= "GET /context/servlet/info?query=foo HTTP/1.1\r\n"+ "Host: tester\r\n"+ "\r\n"+ "GET /context/hello HTTP/1.1\r\n"+ "Host: tester\r\n"+ "\r\n"; String responses = tester.getResponses(requests); String expected= "HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html; charset=iso-8859-1\r\n"+ "Content-Length: 21\r\n"+ "\r\n"+ "<h1>Test Servlet</h1>" + "HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html; charset=iso-8859-1\r\n"+ "Content-Length: 22\r\n"+ "\r\n"+ "<h1>Hello Servlet</h1>"; assertEquals(expected,responses); } /* ------------------------------------------------------------ */ public void testServletTesterClient() throws Exception { String base_url=tester.createSocketConnector(true); URL url = new URL(base_url+"/context/hello/info"); String result = IO.toString(url.openStream()); assertEquals("<h1>Hello Servlet</h1>",result); } /* ------------------------------------------------------------ */ public void testHttpTester() throws Exception { // generated and parsed test HttpTester request = new HttpTester(); HttpTester response = new HttpTester(); // test GET request.setMethod("GET"); request.setVersion("HTTP/1.0"); request.setHeader("Host","tester"); request.setURI("/context/hello/info"); response.parse(tester.getResponses(request.generate())); assertTrue(response.getMethod()==null); assertEquals(200,response.getStatus()); assertEquals("<h1>Hello Servlet</h1>",response.getContent()); // test GET with content request.setMethod("POST"); request.setContent("<pre>Some Test Content</pre>"); request.setHeader("Content-Type","text/html"); response.parse(tester.getResponses(request.generate())); assertTrue(response.getMethod()==null); assertEquals(200,response.getStatus()); assertEquals("<h1>Hello Servlet</h1><pre>Some Test Content</pre>",response.getContent()); // test redirection request.setMethod("GET"); request.setURI("/context"); request.setContent(null); response.parse(tester.getResponses(request.generate())); assertEquals(302,response.getStatus()); assertEquals("http://tester/context/",response.getHeader("location")); // test not found request.setURI("/context/xxxx"); response.parse(tester.getResponses(request.generate())); assertEquals(404,response.getStatus()); } /* ------------------------------------------------------------ */ public void testBigPost() throws Exception { // generated and parsed test HttpTester request = new HttpTester(); HttpTester response = new HttpTester(); String content = "0123456789abcdef"; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+=content; content+="!"; request.setMethod("POST"); request.setVersion("HTTP/1.1"); request.setURI("/context/hello/info"); request.setHeader("Host","tester"); request.setHeader("Content-Type","text/plain"); request.setContent(content); String r=request.generate(); r = tester.getResponses(r); response.parse(r); assertTrue(response.getMethod()==null); assertEquals(200,response.getStatus()); assertEquals("<h1>Hello Servlet</h1>"+content,response.getContent()); } /* ------------------------------------------------------------ */ public void testCharset() throws Exception { byte[] content_iso_8859_1="abcd=1234&AAA=xxx".getBytes("iso8859-1"); byte[] content_utf_8="abcd=1234&AAA=xxx".getBytes("utf-8"); byte[] content_utf_16="abcd=1234&AAA=xxx".getBytes("utf-16"); String request_iso_8859_1= "POST /context/servlet/post HTTP/1.1\r\n"+ "Host: whatever\r\n"+ "Content-Type: application/x-www-form-urlencoded\r\n"+ "Content-Length: "+content_iso_8859_1.length+"\r\n"+ "\r\n"; String request_utf_8= "POST /context/servlet/post HTTP/1.1\r\n"+ "Host: whatever\r\n"+ "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n"+ "Content-Length: "+content_utf_8.length+"\r\n"+ "\r\n"; String request_utf_16= "POST /context/servlet/post HTTP/1.1\r\n"+ "Host: whatever\r\n"+ "Content-Type: application/x-www-form-urlencoded; charset=utf-16\r\n"+ "Content-Length: "+content_utf_16.length+"\r\n"+ "Connection: close\r\n"+ "\r\n"; ByteArrayBuffer out = new ByteArrayBuffer(4096); out.put(request_iso_8859_1.getBytes("iso8859-1")); out.put(content_iso_8859_1); out.put(request_utf_8.getBytes("iso8859-1")); out.put(content_utf_8); out.put(request_utf_16.getBytes("iso8859-1")); out.put(content_utf_16); ByteArrayBuffer responses = tester.getResponses(out); String expected= "HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html; charset=iso-8859-1\r\n"+ "Content-Length: 21\r\n"+ "\r\n"+ "<h1>Test Servlet</h1>"+ "HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html; charset=iso-8859-1\r\n"+ "Content-Length: 21\r\n"+ "\r\n"+ "<h1>Test Servlet</h1>"+ "HTTP/1.1 200 OK\r\n"+ "Content-Type: text/html; charset=iso-8859-1\r\n"+ "Connection: close\r\n"+ "\r\n"+ "<h1>Test Servlet</h1>"; assertEquals(expected,responses.toString()); } /* ------------------------------------------------------------ */ public static class HelloServlet extends HttpServlet { private static final long serialVersionUID=2779906630657190712L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.getWriter().print("<h1>Hello Servlet</h1>"); if (request.getContentLength()>0) response.getWriter().write(IO.toString(request.getInputStream())); } } public static class TestServlet extends HttpServlet { private static final long serialVersionUID=2779906630657190712L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { assertEquals("/context",request.getContextPath()); assertEquals("/servlet",request.getServletPath()); assertEquals("/post",request.getPathInfo()); assertEquals(2,request.getParameterMap().size()); assertEquals("1234",request.getParameter("abcd")); assertEquals("xxx",request.getParameter("AAA")); response.setContentType("text/html"); response.setStatus(HttpServletResponse.SC_OK); response.getWriter().print("<h1>Test Servlet</h1>"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { assertEquals("/context",request.getContextPath()); assertEquals("/servlet",request.getServletPath()); assertEquals("/info",request.getPathInfo()); assertEquals("query=foo",request.getQueryString()); assertEquals(1,request.getParameterMap().size()); assertEquals(1,request.getParameterValues("query").length); assertEquals("foo",request.getParameter("query")); response.setContentType("text/html"); response.setStatus(HttpServletResponse.SC_OK); response.getWriter().print("<h1>Test Servlet</h1>"); } } }