Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jetty-servlet-tester')
-rw-r--r--jetty-servlet-tester/pom.xml23
-rw-r--r--jetty-servlet-tester/src/main/java/org/eclipse/jetty/testing/HttpTester.java504
-rw-r--r--jetty-servlet-tester/src/main/java/org/eclipse/jetty/testing/ServletTester.java358
-rw-r--r--jetty-servlet-tester/src/test/java/org/eclipse/jetty/testing/HttpTesterTest.java42
-rw-r--r--jetty-servlet-tester/src/test/java/org/eclipse/jetty/testing/ServletTest.java288
5 files changed, 1215 insertions, 0 deletions
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 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-project</artifactId>
+ <version>7.0.0.incubation0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>jetty-servlet-tester</artifactId>
+ <packaging>jar</packaging>
+ <name>Jetty :: Servlet Tester</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-webapp</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
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.
+ *
+ * <pre>
+ * 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());
+ * </pre>
+ *
+ *
+ * @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}.
+ * <pre>
+ * 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");
+ * </pre>
+ *
+ * @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"+
+ "<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>");
+ }
+ }
+}

Back to the top