View Javadoc

1   // ========================================================================
2   // Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // All rights reserved. This program and the accompanying materials
5   // are made available under the terms of the Eclipse Public License v1.0
6   // and Apache License v2.0 which accompanies this distribution.
7   // The Eclipse Public License is available at
8   // http://www.eclipse.org/legal/epl-v10.html
9   // The Apache License v2.0 is available at
10  // http://www.opensource.org/licenses/apache2.0.php
11  // You may elect to redistribute this code under either of these licenses.
12  // ========================================================================
13  
14  package org.eclipse.jetty.testing;
15  
16  import java.net.InetAddress;
17  import java.util.Enumeration;
18  import java.util.EventListener;
19  
20  import org.eclipse.jetty.io.ByteArrayBuffer;
21  import org.eclipse.jetty.server.LocalConnector;
22  import org.eclipse.jetty.server.Server;
23  import org.eclipse.jetty.server.bio.SocketConnector;
24  import org.eclipse.jetty.server.handler.ErrorHandler;
25  import org.eclipse.jetty.server.nio.SelectChannelConnector;
26  import org.eclipse.jetty.servlet.FilterHolder;
27  import org.eclipse.jetty.servlet.ServletContextHandler;
28  import org.eclipse.jetty.servlet.ServletHolder;
29  import org.eclipse.jetty.util.Attributes;
30  
31  
32  
33  /* ------------------------------------------------------------ */
34  /** Testing support for servlets and filters.
35   *
36   * Allows a programatic setup of a context with servlets and filters for
37   * testing.  Raw HTTP requests may be sent to the context and responses received.
38   * To avoid handling raw HTTP see {@link org.eclipse.jetty.testing.HttpTester}.
39   * <pre>
40   *      ServletTester tester=new ServletTester();
41   *      tester.setContextPath("/context");
42   *      tester.addServlet(TestServlet.class, "/servlet/*");
43   *      tester.addServlet("org.eclipse.jetty.servlet.DefaultServlet", "/");
44   *      tester.start();
45   *      String response = tester.getResponses("GET /context/servlet/info HTTP/1.0\r\n\r\n");
46   * </pre>
47   *
48   * @see org.eclipse.jetty.testing.HttpTester
49   *
50   *
51   */
52  public class ServletTester
53  {
54      Server _server = new Server();
55      LocalConnector _connector = new LocalConnector();
56  //    Context _context = new Context(Context.SESSIONS|Context.SECURITY);
57      //jaspi why security if it is not set up?
58      ServletContextHandler _context = new ServletContextHandler(ServletContextHandler.SESSIONS);
59  
60      public ServletTester()
61      {
62          try
63          {
64              _server.addBean(new ErrorHandler());
65              _server.setSendServerVersion(false);
66              _server.addConnector(_connector);
67              _server.setHandler(_context);
68          }
69          catch (Error e)
70          {
71              throw e;
72          }
73          catch (RuntimeException e)
74          {
75              throw e;
76          }
77          catch (Exception e)
78          {
79              throw new RuntimeException(e);
80          }
81      }
82  
83      /* ------------------------------------------------------------ */
84      public void start() throws Exception
85      {
86          _server.start();
87      }
88  
89      /* ------------------------------------------------------------ */
90      public void stop() throws Exception
91      {
92          _server.stop();
93      }
94  
95      /* ------------------------------------------------------------ */
96      public ServletContextHandler getContext()
97      {
98          return _context;
99      }
100 
101     /* ------------------------------------------------------------ */
102     /** Get raw HTTP responses from raw HTTP requests.
103      * Multiple requests and responses may be handled, but only if
104      * persistent connections conditions apply.
105      * @param rawRequests String of raw HTTP requests
106      * @return String of raw HTTP responses
107      * @throws Exception
108      */
109     public String getResponses(String rawRequests) throws Exception
110     {
111         return _connector.getResponses(rawRequests);
112     }
113 
114     /* ------------------------------------------------------------ */
115     /** Get raw HTTP responses from raw HTTP requests.
116      * Multiple requests and responses may be handled, but only if
117      * persistent connections conditions apply.
118      * @param rawRequests String of raw HTTP requests
119      * @param connector The connector to handle the responses
120      * @return String of raw HTTP responses
121      * @throws Exception
122      */
123     public String getResponses(String rawRequests, LocalConnector connector) throws Exception
124     {
125         return connector.getResponses(rawRequests);
126     }
127 
128     /* ------------------------------------------------------------ */
129     /** Get raw HTTP responses from raw HTTP requests.
130      * Multiple requests and responses may be handled, but only if
131      * persistent connections conditions apply.
132      * @param rawRequests String of raw HTTP requests
133      * @return String of raw HTTP responses
134      * @throws Exception
135      */
136     public ByteArrayBuffer getResponses(ByteArrayBuffer rawRequests) throws Exception
137     {
138         return _connector.getResponses(rawRequests,false);
139     }
140 
141     /* ------------------------------------------------------------ */
142     /** Create a Socket connector.
143      * This methods adds a socket connector to the server
144      * @param localhost if true, only listen on local host, else listen on all interfaces.
145      * @return A URL to access the server via the socket connector.
146      * @throws Exception
147      */
148     public String createSocketConnector(boolean localhost)
149     throws Exception
150     {
151         synchronized (this)
152         {
153             SocketConnector connector = new SocketConnector();
154             if (localhost)
155                 connector.setHost("127.0.0.1");
156             _server.addConnector(connector);
157             if (_server.isStarted())
158                 connector.start();
159             else
160                 connector.open();
161 
162             return "http://127.0.0.1:"+connector.getLocalPort();
163         }
164     }
165 
166     /* ------------------------------------------------------------ */
167     /** Create a SelectChannel connector.
168      * This methods adds a select channel connector to the server
169      * @return A URL to access the server via the connector.
170      * @throws Exception
171      */
172     public String createChannelConnector(boolean localhost)
173     throws Exception
174     {
175         synchronized (this)
176         {
177             SelectChannelConnector connector = new SelectChannelConnector();
178             if (localhost)
179                 connector.setHost("127.0.0.1");
180             _server.addConnector(connector);
181             if (_server.isStarted())
182                 connector.start();
183             else
184                 connector.open();
185 
186             return "http://"+(localhost?"127.0.0.1":
187                 InetAddress.getLocalHost().getHostAddress()
188             )+":"+connector.getLocalPort();
189         }
190     }
191 
192     /* ------------------------------------------------------------ */
193     /** Create a local connector.
194      * This methods adds a local connector to the server
195      * @return The LocalConnector object
196      * @throws Exception
197      */
198     public LocalConnector createLocalConnector()
199     throws Exception
200     {
201         synchronized (this)
202         {
203             LocalConnector connector = new LocalConnector();
204             _server.addConnector(connector);
205 
206             if (_server.isStarted())
207                 connector.start();
208 
209             return connector;
210         }
211    }
212 
213     /* ------------------------------------------------------------ */
214     /**
215      * @param listener
216      * @see org.eclipse.jetty.server.handler.ContextHandler#addEventListener(java.util.EventListener)
217      */
218     public void addEventListener(EventListener listener)
219     {
220         _context.addEventListener(listener);
221     }
222 
223     /* ------------------------------------------------------------ */
224     /**
225      * @param filterClass
226      * @param pathSpec
227      * @param dispatches
228      * @return the FilterHolder
229      * @see org.eclipse.jetty.servlet.ServletContextHandler#addFilter(java.lang.Class, java.lang.String, int)
230      */
231     public FilterHolder addFilter(Class filterClass, String pathSpec, int dispatches)
232     {
233         return _context.addFilter(filterClass,pathSpec,dispatches);
234     }
235 
236     /* ------------------------------------------------------------ */
237     /**
238      * @param filterClass
239      * @param pathSpec
240      * @param dispatches
241      * @return the FilterHolder
242      * @see org.eclipse.jetty.servlet.ServletContextHandler#addFilter(java.lang.String, java.lang.String, int)
243      */
244     public FilterHolder addFilter(String filterClass, String pathSpec, int dispatches)
245     {
246         return _context.addFilter(filterClass,pathSpec,dispatches);
247     }
248 
249     /* ------------------------------------------------------------ */
250     /**
251      * @param servlet
252      * @param pathSpec
253      * @return the ServletHolder
254      * @see org.eclipse.jetty.servlet.ServletContextHandler#addServlet(java.lang.Class, java.lang.String)
255      */
256     public ServletHolder addServlet(Class servlet, String pathSpec)
257     {
258         return _context.addServlet(servlet,pathSpec);
259     }
260 
261     /* ------------------------------------------------------------ */
262     /**
263      * @param className
264      * @param pathSpec
265      * @return the ServletHolder
266      * @see org.eclipse.jetty.servlet.ServletContextHandler#addServlet(java.lang.String, java.lang.String)
267      */
268     public ServletHolder addServlet(String className, String pathSpec)
269     {
270         return _context.addServlet(className,pathSpec);
271     }
272 
273     /* ------------------------------------------------------------ */
274     /**
275      * @param name
276      * @return the Attribute object
277      * @see org.eclipse.jetty.servlet.ServletContextHandler#getAttribute(java.lang.String)
278      */
279     public Object getAttribute(String name)
280     {
281         return _context.getAttribute(name);
282     }
283 
284     /* ------------------------------------------------------------ */
285     /**
286      * @return the Attribute Names
287      * @see org.eclipse.jetty.servlet.ServletContextHandler#getAttributeNames()
288      */
289     public Enumeration getAttributeNames()
290     {
291         return _context.getAttributeNames();
292     }
293 
294     /* ------------------------------------------------------------ */
295     /**
296      * @return the attributes
297      * @see org.eclipse.jetty.servlet.ServletContextHandler#getAttributes()
298      */
299     public Attributes getAttributes()
300     {
301         return _context.getAttributes();
302     }
303 
304     /* ------------------------------------------------------------ */
305     /**
306      * @return the resource base
307      * @see org.eclipse.jetty.servlet.ServletContextHandler#getResourceBase()
308      */
309     public String getResourceBase()
310     {
311         return _context.getResourceBase();
312     }
313 
314     /* ------------------------------------------------------------ */
315     /**
316      * @param name
317      * @param value
318      * @see org.eclipse.jetty.servlet.ServletContextHandler#setAttribute(java.lang.String, java.lang.Object)
319      */
320     public void setAttribute(String name, Object value)
321     {
322         _context.setAttribute(name,value);
323     }
324 
325     /* ------------------------------------------------------------ */
326     /**
327      * @param classLoader
328      * @see org.eclipse.jetty.servlet.ServletContextHandler#setClassLoader(java.lang.ClassLoader)
329      */
330     public void setClassLoader(ClassLoader classLoader)
331     {
332         _context.setClassLoader(classLoader);
333     }
334 
335     /* ------------------------------------------------------------ */
336     /**
337      * @param contextPath
338      * @see org.eclipse.jetty.servlet.ServletContextHandler#setContextPath(java.lang.String)
339      */
340     public void setContextPath(String contextPath)
341     {
342         _context.setContextPath(contextPath);
343     }
344 
345     /* ------------------------------------------------------------ */
346     /**
347      * @param eventListeners
348      * @see org.eclipse.jetty.servlet.ServletContextHandler#setEventListeners(java.util.EventListener[])
349      */
350     public void setEventListeners(EventListener[] eventListeners)
351     {
352         _context.setEventListeners(eventListeners);
353     }
354 
355     /* ------------------------------------------------------------ */
356     /**
357      * @param resourceBase
358      * @see org.eclipse.jetty.servlet.ServletContextHandler#setResourceBase(java.lang.String)
359      */
360     public void setResourceBase(String resourceBase)
361     {
362         _context.setResourceBase(resourceBase);
363     }
364 
365 }