From da627b843fe81fa0fe52a046c1be8595630e9ae7 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Tue, 24 Mar 2009 21:07:27 +0000 Subject: jetty @ eclipse initial commit git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@8 7e9141cc-0065-0410-87d8-b60c137991c4 --- jetty-servlet-tester/pom.xml | 23 + .../java/org/eclipse/jetty/testing/HttpTester.java | 504 +++++++++++++++++++++ .../org/eclipse/jetty/testing/ServletTester.java | 358 +++++++++++++++ .../org/eclipse/jetty/testing/HttpTesterTest.java | 42 ++ .../org/eclipse/jetty/testing/ServletTest.java | 288 ++++++++++++ 5 files changed, 1215 insertions(+) create mode 100644 jetty-servlet-tester/pom.xml create mode 100644 jetty-servlet-tester/src/main/java/org/eclipse/jetty/testing/HttpTester.java create mode 100644 jetty-servlet-tester/src/main/java/org/eclipse/jetty/testing/ServletTester.java create mode 100644 jetty-servlet-tester/src/test/java/org/eclipse/jetty/testing/HttpTesterTest.java create mode 100644 jetty-servlet-tester/src/test/java/org/eclipse/jetty/testing/ServletTest.java (limited to 'jetty-servlet-tester') diff --git a/jetty-servlet-tester/pom.xml b/jetty-servlet-tester/pom.xml new file mode 100644 index 0000000000..1a6f9cd0e8 --- /dev/null +++ b/jetty-servlet-tester/pom.xml @@ -0,0 +1,23 @@ + + + org.eclipse.jetty + jetty-project + 7.0.0.incubation0-SNAPSHOT + + 4.0.0 + jetty-servlet-tester + jar + Jetty :: Servlet Tester + + + org.eclipse.jetty + jetty-webapp + ${project.version} + + + junit + junit + test + + + diff --git a/jetty-servlet-tester/src/main/java/org/eclipse/jetty/testing/HttpTester.java b/jetty-servlet-tester/src/main/java/org/eclipse/jetty/testing/HttpTester.java new file mode 100644 index 0000000000..94fbd9c180 --- /dev/null +++ b/jetty-servlet-tester/src/main/java/org/eclipse/jetty/testing/HttpTester.java @@ -0,0 +1,504 @@ +// ======================================================================== +// Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== + +package org.eclipse.jetty.testing; + +import java.io.IOException; +import java.util.Enumeration; + +import javax.servlet.http.Cookie; + +import org.eclipse.jetty.http.HttpFields; +import org.eclipse.jetty.http.HttpGenerator; +import org.eclipse.jetty.http.HttpHeaders; +import org.eclipse.jetty.http.HttpParser; +import org.eclipse.jetty.http.HttpVersions; +import org.eclipse.jetty.http.MimeTypes; +import org.eclipse.jetty.io.Buffer; +import org.eclipse.jetty.io.ByteArrayBuffer; +import org.eclipse.jetty.io.SimpleBuffers; +import org.eclipse.jetty.io.View; +import org.eclipse.jetty.io.bio.StringEndPoint; +import org.eclipse.jetty.util.ByteArrayOutputStream2; + +/* ------------------------------------------------------------ */ +/** Test support class. + * Assist with parsing and generating HTTP requests and responses. + * + *
+ *      HttpTester tester = new HttpTester();
+ *      
+ *      tester.parse(
+ *          "GET /uri HTTP/1.1\r\n"+
+ *          "Host: fakehost\r\n"+
+ *          "Content-Length: 10\r\n" +
+ *          "\r\n");
+ *     
+ *      System.err.println(tester.getMethod());
+ *      System.err.println(tester.getURI());
+ *      System.err.println(tester.getVersion());
+ *      System.err.println(tester.getHeader("Host"));
+ *      System.err.println(tester.getContent());
+ * 
+ * + * + * @see org.eclipse.jetty.testing.ServletTester + */ +public class HttpTester +{ + protected HttpFields _fields=new HttpFields(); + protected String _method; + protected String _uri; + protected String _version; + protected int _status; + protected String _reason; + protected ByteArrayOutputStream2 _parsedContent; + protected byte[] _genContent; + + private String _charset, _defaultCharset; + private Buffer _contentType; + + public HttpTester() + { + this("UTF-8"); + } + + public HttpTester(String charset) + { + _defaultCharset = charset; + } + + public void reset() + { + _fields.clear(); + _method=null; + _uri=null; + _version=null; + _status=0; + _reason=null; + _parsedContent=null; + _genContent=null; + } + + private String getString(Buffer buffer) + { + return getString(buffer.asArray()); + } + + private String getString(byte[] b) + { + if(_charset==null) + return new String(b); + try + { + return new String(b, _charset); + } + catch(Exception e) + { + return new String(b); + } + } + + private byte[] getByteArray(String str) + { + if(_charset==null) + return str.getBytes(); + try + { + return str.getBytes(_charset); + } + catch(Exception e) + { + return str.getBytes(); + } + } + + /* ------------------------------------------------------------ */ + /** + * Parse one HTTP request or response + * @param rawHTTP Raw HTTP to parse + * @return Any unparsed data in the rawHTTP (eg pipelined requests) + * @throws IOException + */ + public String parse(String rawHTTP) throws IOException + { + _charset = _defaultCharset; + ByteArrayBuffer buf = new ByteArrayBuffer(getByteArray(rawHTTP)); + View view = new View(buf); + HttpParser parser = new HttpParser(view,new PH()); + parser.parse(); + return getString(view.asArray()); + } + + /* ------------------------------------------------------------ */ + public String generate() throws IOException + { + _charset = _defaultCharset; + _contentType = _fields.get(HttpHeaders.CONTENT_TYPE_BUFFER); + if(_contentType!=null) + { + String charset = MimeTypes.getCharsetFromContentType(_contentType); + if(charset!=null) + _charset = charset; + } + Buffer bb=new ByteArrayBuffer(32*1024 + (_genContent!=null?_genContent.length:0)); + Buffer sb=new ByteArrayBuffer(4*1024); + StringEndPoint endp = new StringEndPoint(_charset); + HttpGenerator generator = new HttpGenerator(new SimpleBuffers(new Buffer[]{sb,bb}),endp, sb.capacity(), bb.capacity()); + + if (_method!=null) + { + generator.setRequest(getMethod(),getURI()); + if (_version==null) + generator.setVersion(HttpVersions.HTTP_1_1_ORDINAL); + else + generator.setVersion(HttpVersions.CACHE.getOrdinal(HttpVersions.CACHE.lookup(_version))); + generator.completeHeader(_fields,false); + if (_genContent!=null) + generator.addContent(new View(new ByteArrayBuffer(_genContent)),false); + else if (_parsedContent!=null) + generator.addContent(new ByteArrayBuffer(_parsedContent.toByteArray()),false); + } + + generator.complete(); + generator.flushBuffer(); + return endp.getOutput(); + } + + /* ------------------------------------------------------------ */ + /** + * @return the method + */ + public String getMethod() + { + return _method; + } + + /* ------------------------------------------------------------ */ + /** + * @param method the method to set + */ + public void setMethod(String method) + { + _method=method; + } + + /* ------------------------------------------------------------ */ + /** + * @return the reason + */ + public String getReason() + { + return _reason; + } + + /* ------------------------------------------------------------ */ + /** + * @param reason the reason to set + */ + public void setReason(String reason) + { + _reason=reason; + } + + /* ------------------------------------------------------------ */ + /** + * @return the status + */ + public int getStatus() + { + return _status; + } + + /* ------------------------------------------------------------ */ + /** + * @param status the status to set + */ + public void setStatus(int status) + { + _status=status; + } + + /* ------------------------------------------------------------ */ + /** + * @return the uri + */ + public String getURI() + { + return _uri; + } + + /* ------------------------------------------------------------ */ + /** + * @param uri the uri to set + */ + public void setURI(String uri) + { + _uri=uri; + } + + /* ------------------------------------------------------------ */ + /** + * @return the version + */ + public String getVersion() + { + return _version; + } + + /* ------------------------------------------------------------ */ + /** + * @param version the version to set + */ + public void setVersion(String version) + { + _version=version; + } + + /* ------------------------------------------------------------ */ + public String getContentType() + { + return getString(_contentType); + } + + /* ------------------------------------------------------------ */ + public String getCharacterEncoding() + { + return _charset; + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @param value + * @throws IllegalArgumentException + * @see org.eclipse.jetty.http.HttpFields#add(java.lang.String, java.lang.String) + */ + public void addHeader(String name, String value) throws IllegalArgumentException + { + _fields.add(name,value); + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @param date + * @see org.eclipse.jetty.http.HttpFields#addDateField(java.lang.String, long) + */ + public void addDateHeader(String name, long date) + { + _fields.addDateField(name,date); + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @param value + * @see org.eclipse.jetty.http.HttpFields#addLongField(java.lang.String, long) + */ + public void addLongHeader(String name, long value) + { + _fields.addLongField(name,value); + } + + /* ------------------------------------------------------------ */ + /** + * @param cookie + * @see org.eclipse.jetty.http.HttpFields#addSetCookie(javax.servlet.http.Cookie) + */ + public void addSetCookie(Cookie cookie) + { + _fields.addSetCookie( + cookie.getName(), + cookie.getValue(), + cookie.getDomain(), + cookie.getPath(), + cookie.getMaxAge(), + cookie.getComment(), + cookie.getSecure(), + cookie.isHttpOnly(), + cookie.getVersion()); + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @return + * @see org.eclipse.jetty.http.HttpFields#getDateField(java.lang.String) + */ + public long getDateHeader(String name) + { + return _fields.getDateField(name); + } + + /* ------------------------------------------------------------ */ + /** + * @return + * @see org.eclipse.jetty.http.HttpFields#getFieldNames() + */ + public Enumeration getHeaderNames() + { + return _fields.getFieldNames(); + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @return + * @throws NumberFormatException + * @see org.eclipse.jetty.http.HttpFields#getLongField(java.lang.String) + */ + public long getLongHeader(String name) throws NumberFormatException + { + return _fields.getLongField(name); + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @return + * @see org.eclipse.jetty.http.HttpFields#getStringField(java.lang.String) + */ + public String getHeader(String name) + { + return _fields.getStringField(name); + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @return + * @see org.eclipse.jetty.http.HttpFields#getValues(java.lang.String) + */ + public Enumeration getHeaderValues(String name) + { + return _fields.getValues(name); + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @param value + * @see org.eclipse.jetty.http.HttpFields#put(java.lang.String, java.lang.String) + */ + public void setHeader(String name, String value) + { + _fields.put(name,value); + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @param date + * @see org.eclipse.jetty.http.HttpFields#putDateField(java.lang.String, long) + */ + public void setDateHeader(String name, long date) + { + _fields.putDateField(name,date); + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @param value + * @see org.eclipse.jetty.http.HttpFields#putLongField(java.lang.String, long) + */ + public void setLongHeader(String name, long value) + { + _fields.putLongField(name,value); + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @see org.eclipse.jetty.http.HttpFields#remove(java.lang.String) + */ + public void removeHeader(String name) + { + _fields.remove(name); + } + + /* ------------------------------------------------------------ */ + public String getContent() + { + if (_parsedContent!=null) + return getString(_parsedContent.toByteArray()); + if (_genContent!=null) + return getString(_genContent); + return null; + } + + /* ------------------------------------------------------------ */ + public void setContent(String content) + { + _parsedContent=null; + if (content!=null) + { + _genContent=getByteArray(content); + setLongHeader(HttpHeaders.CONTENT_LENGTH,_genContent.length); + } + else + { + removeHeader(HttpHeaders.CONTENT_LENGTH); + _genContent=null; + } + } + + /* ------------------------------------------------------------ */ + private class PH extends HttpParser.EventHandler + { + public void startRequest(Buffer method, Buffer url, Buffer version) throws IOException + { + reset(); + _method=getString(method); + _uri=getString(url); + _version=getString(version); + } + + public void startResponse(Buffer version, int status, Buffer reason) throws IOException + { + reset(); + _version=getString(version); + _status=status; + _reason=getString(reason); + } + + public void parsedHeader(Buffer name, Buffer value) throws IOException + { + _fields.add(name,value); + } + + public void headerComplete() throws IOException + { + _contentType = _fields.get(HttpHeaders.CONTENT_TYPE_BUFFER); + if(_contentType!=null) + { + String charset = MimeTypes.getCharsetFromContentType(_contentType); + if(charset!=null) + _charset = charset; + } + } + + public void messageComplete(long contextLength) throws IOException + { + } + + public void content(Buffer ref) throws IOException + { + if (_parsedContent==null) + _parsedContent=new ByteArrayOutputStream2(); + _parsedContent.write(ref.asArray()); + } + } + +} diff --git a/jetty-servlet-tester/src/main/java/org/eclipse/jetty/testing/ServletTester.java b/jetty-servlet-tester/src/main/java/org/eclipse/jetty/testing/ServletTester.java new file mode 100644 index 0000000000..4cc262f90a --- /dev/null +++ b/jetty-servlet-tester/src/main/java/org/eclipse/jetty/testing/ServletTester.java @@ -0,0 +1,358 @@ +// ======================================================================== +// Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== + +package org.eclipse.jetty.testing; + +import java.util.Enumeration; +import java.util.EventListener; + +import org.eclipse.jetty.io.ByteArrayBuffer; +import org.eclipse.jetty.server.LocalConnector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.bio.SocketConnector; +import org.eclipse.jetty.servlet.FilterHolder; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.util.Attributes; + + + +/* ------------------------------------------------------------ */ +/** Testing support for servlets and filters. + * + * Allows a programatic setup of a context with servlets and filters for + * testing. Raw HTTP requests may be sent to the context and responses received. + * To avoid handling raw HTTP see {@link org.eclipse.jetty.testing.HttpTester}. + *
+ *      ServletTester tester=new ServletTester();
+ *      tester.setContextPath("/context");
+ *      tester.addServlet(TestServlet.class, "/servlet/*");
+ *      tester.addServlet("org.eclipse.jetty.servlet.DefaultServlet", "/");
+ *      tester.start();
+ *      String response = tester.getResponses("GET /context/servlet/info HTTP/1.0\r\n\r\n");
+ * 
+ * + * @see org.eclipse.jetty.testing.HttpTester + * + * + */ +public class ServletTester +{ + Server _server = new Server(); + LocalConnector _connector = new LocalConnector(); +// Context _context = new Context(Context.SESSIONS|Context.SECURITY); + //jaspi why security if it is not set up? + ServletContextHandler _context = new ServletContextHandler(ServletContextHandler.SESSIONS); + + public ServletTester() + { + try + { + _server.setSendServerVersion(false); + _server.addConnector(_connector); + _server.addHandler(_context); + } + catch (Error e) + { + throw e; + } + catch (RuntimeException e) + { + throw e; + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + + /* ------------------------------------------------------------ */ + public void start() throws Exception + { + _server.start(); + } + + /* ------------------------------------------------------------ */ + public void stop() throws Exception + { + _server.stop(); + } + + /* ------------------------------------------------------------ */ + public ServletContextHandler getContext() + { + return _context; + } + + /* ------------------------------------------------------------ */ + /** Get raw HTTP responses from raw HTTP requests. + * Multiple requests and responses may be handled, but only if + * persistent connections conditions apply. + * @param rawRequests String of raw HTTP requests + * @return String of raw HTTP responses + * @throws Exception + */ + public String getResponses(String rawRequests) throws Exception + { + _connector.reopen(); + String responses = _connector.getResponses(rawRequests); + return responses; + } + + /* ------------------------------------------------------------ */ + /** Get raw HTTP responses from raw HTTP requests. + * Multiple requests and responses may be handled, but only if + * persistent connections conditions apply. + * @param rawRequests String of raw HTTP requests + * @param connector The connector to handle the responses + * @return String of raw HTTP responses + * @throws Exception + */ + public String getResponses(String rawRequests, LocalConnector connector) throws Exception + { + connector.reopen(); + String responses = connector.getResponses(rawRequests); + return responses; + } + + /* ------------------------------------------------------------ */ + /** Get raw HTTP responses from raw HTTP requests. + * Multiple requests and responses may be handled, but only if + * persistent connections conditions apply. + * @param rawRequests String of raw HTTP requests + * @return String of raw HTTP responses + * @throws Exception + */ + public ByteArrayBuffer getResponses(ByteArrayBuffer rawRequests) throws Exception + { + _connector.reopen(); + ByteArrayBuffer responses = _connector.getResponses(rawRequests,false); + return responses; + } + + /* ------------------------------------------------------------ */ + /** Get raw HTTP responses from raw HTTP requests. + * Multiple requests and responses may be handled, but only if + * persistent connections conditions apply. + * @param rawRequests String of raw HTTP requests + * @param connector The connector to handle the responses + * @return String of raw HTTP responses + * @throws Exception + */ + public ByteArrayBuffer getResponses(ByteArrayBuffer rawRequests, LocalConnector connector) throws Exception + { + connector.reopen(); + ByteArrayBuffer responses = connector.getResponses(rawRequests,false); + return responses; + } + + /* ------------------------------------------------------------ */ + /** Create a Socket connector. + * This methods adds a socket connector to the server + * @param locahost if true, only listen on local host, else listen on all interfaces. + * @return A URL to access the server via the socket connector. + * @throws Exception + */ + public String createSocketConnector(boolean localhost) + throws Exception + { + synchronized (this) + { + SocketConnector connector = new SocketConnector(); + if (localhost) + connector.setHost("127.0.0.1"); + _server.addConnector(connector); + if (_server.isStarted()) + connector.start(); + else + connector.open(); + + return "http://127.0.0.1:"+connector.getLocalPort(); + } + } + + /* ------------------------------------------------------------ */ + /** Create a Socket connector. + * This methods adds a socket connector to the server + * @param locahost if true, only listen on local host, else listen on all interfaces. + * @return A URL to access the server via the socket connector. + * @throws Exception + */ + public LocalConnector createLocalConnector() + throws Exception + { + synchronized (this) + { + LocalConnector connector = new LocalConnector(); + _server.addConnector(connector); + + if (_server.isStarted()) + connector.start(); + + return connector; + } + } + + /* ------------------------------------------------------------ */ + /** + * @param listener + * @see org.eclipse.jetty.handler.ContextHandler#addEventListener(java.util.EventListener) + */ + public void addEventListener(EventListener listener) + { + _context.addEventListener(listener); + } + + /* ------------------------------------------------------------ */ + /** + * @param filterClass + * @param pathSpec + * @param dispatches + * @return + * @see org.eclipse.jetty.servlet.Scope#addFilter(java.lang.Class, java.lang.String, int) + */ + public FilterHolder addFilter(Class filterClass, String pathSpec, int dispatches) + { + return _context.addFilter(filterClass,pathSpec,dispatches); + } + + /* ------------------------------------------------------------ */ + /** + * @param filterClass + * @param pathSpec + * @param dispatches + * @return + * @see org.eclipse.jetty.servlet.Scope#addFilter(java.lang.String, java.lang.String, int) + */ + public FilterHolder addFilter(String filterClass, String pathSpec, int dispatches) + { + return _context.addFilter(filterClass,pathSpec,dispatches); + } + + /* ------------------------------------------------------------ */ + /** + * @param servlet + * @param pathSpec + * @return + * @see org.eclipse.jetty.servlet.Scope#addServlet(java.lang.Class, java.lang.String) + */ + public ServletHolder addServlet(Class servlet, String pathSpec) + { + return _context.addServlet(servlet,pathSpec); + } + + /* ------------------------------------------------------------ */ + /** + * @param className + * @param pathSpec + * @return + * @see org.eclipse.jetty.servlet.Scope#addServlet(java.lang.String, java.lang.String) + */ + public ServletHolder addServlet(String className, String pathSpec) + { + return _context.addServlet(className,pathSpec); + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @return + * @see org.eclipse.jetty.handler.ContextHandler#getAttribute(java.lang.String) + */ + public Object getAttribute(String name) + { + return _context.getAttribute(name); + } + + /* ------------------------------------------------------------ */ + /** + * @return + * @see org.eclipse.jetty.handler.ContextHandler#getAttributeNames() + */ + public Enumeration getAttributeNames() + { + return _context.getAttributeNames(); + } + + /* ------------------------------------------------------------ */ + /** + * @return + * @see org.eclipse.jetty.handler.ContextHandler#getAttributes() + */ + public Attributes getAttributes() + { + return _context.getAttributes(); + } + + /* ------------------------------------------------------------ */ + /** + * @return + * @see org.eclipse.jetty.handler.ContextHandler#getResourceBase() + */ + public String getResourceBase() + { + return _context.getResourceBase(); + } + + /* ------------------------------------------------------------ */ + /** + * @param name + * @param value + * @see org.eclipse.jetty.handler.ContextHandler#setAttribute(java.lang.String, java.lang.Object) + */ + public void setAttribute(String name, Object value) + { + _context.setAttribute(name,value); + } + + /* ------------------------------------------------------------ */ + /** + * @param classLoader + * @see org.eclipse.jetty.handler.ContextHandler#setClassLoader(java.lang.ClassLoader) + */ + public void setClassLoader(ClassLoader classLoader) + { + _context.setClassLoader(classLoader); + } + + /* ------------------------------------------------------------ */ + /** + * @param contextPath + * @see org.eclipse.jetty.handler.ContextHandler#setContextPath(java.lang.String) + */ + public void setContextPath(String contextPath) + { + _context.setContextPath(contextPath); + } + + /* ------------------------------------------------------------ */ + /** + * @param eventListeners + * @see org.eclipse.jetty.handler.ContextHandler#setEventListeners(java.util.EventListener[]) + */ + public void setEventListeners(EventListener[] eventListeners) + { + _context.setEventListeners(eventListeners); + } + + /* ------------------------------------------------------------ */ + /** + * @param resourceBase + * @see org.eclipse.jetty.handler.ContextHandler#setResourceBase(java.lang.String) + */ + public void setResourceBase(String resourceBase) + { + _context.setResourceBase(resourceBase); + } + +} diff --git a/jetty-servlet-tester/src/test/java/org/eclipse/jetty/testing/HttpTesterTest.java b/jetty-servlet-tester/src/test/java/org/eclipse/jetty/testing/HttpTesterTest.java new file mode 100644 index 0000000000..4ae2f29130 --- /dev/null +++ b/jetty-servlet-tester/src/test/java/org/eclipse/jetty/testing/HttpTesterTest.java @@ -0,0 +1,42 @@ +// ======================================================================== +// Copyright (c) 2007-2009 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== + +package org.eclipse.jetty.testing; + +import junit.framework.TestCase; + +public class HttpTesterTest extends TestCase +{ + + public void testCharset() throws Exception + { + HttpTester tester = new HttpTester(); + tester.parse( + "POST /uri© HTTP/1.1\r\n"+ + "Host: fakehost\r\n"+ + "Content-Length: 11\r\n" + + "Content-Type: text/plain; charset=utf-8\r\n" + + "\r\n" + + "123456789©"); + System.err.println(tester.getMethod()); + System.err.println(tester.getURI()); + System.err.println(tester.getVersion()); + System.err.println(tester.getHeader("Host")); + System.err.println(tester.getContentType()); + System.err.println(tester.getCharacterEncoding()); + System.err.println(tester.getContent()); + assertEquals(tester.getContent(), "123456789©"); + System.err.println(tester.generate()); + } + +} diff --git a/jetty-servlet-tester/src/test/java/org/eclipse/jetty/testing/ServletTest.java b/jetty-servlet-tester/src/test/java/org/eclipse/jetty/testing/ServletTest.java new file mode 100644 index 0000000000..6446ec12e3 --- /dev/null +++ b/jetty-servlet-tester/src/test/java/org/eclipse/jetty/testing/ServletTest.java @@ -0,0 +1,288 @@ +package org.eclipse.jetty.testing; +// ======================================================================== +// Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== + + + +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.eclipse.jetty.io.ByteArrayBuffer; +import org.eclipse.jetty.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.eclipse.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"+ + "

Test Servlet

" + + + "HTTP/1.1 200 OK\r\n"+ + "Content-Type: text/html;charset=ISO-8859-1\r\n"+ + "Content-Length: 22\r\n"+ + "\r\n"+ + "

Hello Servlet

"; + + 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("

Hello Servlet

",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("

Hello Servlet

",response.getContent()); + + // test GET with content + request.setMethod("POST"); + request.setContent("
Some Test Content
"); + request.setHeader("Content-Type","text/html"); + response.parse(tester.getResponses(request.generate())); + assertTrue(response.getMethod()==null); + assertEquals(200,response.getStatus()); + assertEquals("

Hello Servlet

Some Test Content
",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("

Hello Servlet

"+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"+ + "

Test Servlet

"+ + "HTTP/1.1 200 OK\r\n"+ + "Content-Type: text/html;charset=ISO-8859-1\r\n"+ + "Content-Length: 21\r\n"+ + "\r\n"+ + "

Test Servlet

"+ + "HTTP/1.1 200 OK\r\n"+ + "Content-Type: text/html;charset=ISO-8859-1\r\n"+ + "Connection: close\r\n"+ + "\r\n"+ + "

Test Servlet

"; + + 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("

Hello Servlet

"); + 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("

Test Servlet

"); + } + + 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("

Test Servlet

"); + } + } +} -- cgit v1.2.3