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 dump()
85      {
86          _server.dump();
87      }
88  
89      /* ------------------------------------------------------------ */
90      public void start() throws Exception
91      {
92          _server.start();
93      }
94  
95      /* ------------------------------------------------------------ */
96      public void stop() throws Exception
97      {
98          _server.stop();
99      }
100 
101     /* ------------------------------------------------------------ */
102     public ServletContextHandler getContext()
103     {
104         return _context;
105     }
106 
107     /* ------------------------------------------------------------ */
108     /** Get raw HTTP responses from raw HTTP requests.
109      * Multiple requests and responses may be handled, but only if
110      * persistent connections conditions apply.
111      * @param rawRequests String of raw HTTP requests
112      * @return String of raw HTTP responses
113      * @throws Exception
114      */
115     public String getResponses(String rawRequests) throws Exception
116     {
117         return _connector.getResponses(rawRequests);
118     }
119 
120     /* ------------------------------------------------------------ */
121     /** Get raw HTTP responses from raw HTTP requests.
122      * Multiple requests and responses may be handled, but only if
123      * persistent connections conditions apply.
124      * @param rawRequests String of raw HTTP requests
125      * @param connector The connector to handle the responses
126      * @return String of raw HTTP responses
127      * @throws Exception
128      */
129     public String getResponses(String rawRequests, LocalConnector connector) throws Exception
130     {
131         return connector.getResponses(rawRequests);
132     }
133 
134     /* ------------------------------------------------------------ */
135     /** Get raw HTTP responses from raw HTTP requests.
136      * Multiple requests and responses may be handled, but only if
137      * persistent connections conditions apply.
138      * @param rawRequests String of raw HTTP requests
139      * @return String of raw HTTP responses
140      * @throws Exception
141      */
142     public ByteArrayBuffer getResponses(ByteArrayBuffer rawRequests) throws Exception
143     {
144         return _connector.getResponses(rawRequests,false);
145     }
146 
147     /* ------------------------------------------------------------ */
148     /** Create a Socket connector.
149      * This methods adds a socket connector to the server
150      * @param localhost if true, only listen on local host, else listen on all interfaces.
151      * @return A URL to access the server via the socket connector.
152      * @throws Exception
153      */
154     public String createSocketConnector(boolean localhost)
155     throws Exception
156     {
157         synchronized (this)
158         {
159             SocketConnector connector = new SocketConnector();
160             if (localhost)
161                 connector.setHost("127.0.0.1");
162             _server.addConnector(connector);
163             if (_server.isStarted())
164                 connector.start();
165             else
166                 connector.open();
167 
168             return "http://127.0.0.1:"+connector.getLocalPort();
169         }
170     }
171 
172     /* ------------------------------------------------------------ */
173     /** Create a SelectChannel connector.
174      * This methods adds a select channel connector to the server
175      * @return A URL to access the server via the connector.
176      * @throws Exception
177      */
178     public String createChannelConnector(boolean localhost)
179     throws Exception
180     {
181         synchronized (this)
182         {
183             SelectChannelConnector connector = new SelectChannelConnector();
184             if (localhost)
185                 connector.setHost("127.0.0.1");
186             _server.addConnector(connector);
187             if (_server.isStarted())
188                 connector.start();
189             else
190                 connector.open();
191 
192             return "http://"+(localhost?"127.0.0.1":
193                 InetAddress.getLocalHost().getHostAddress()
194             )+":"+connector.getLocalPort();
195         }
196     }
197 
198     /* ------------------------------------------------------------ */
199     /** Create a local connector.
200      * This methods adds a local connector to the server
201      * @return The LocalConnector object
202      * @throws Exception
203      */
204     public LocalConnector createLocalConnector()
205     throws Exception
206     {
207         synchronized (this)
208         {
209             LocalConnector connector = new LocalConnector();
210             _server.addConnector(connector);
211 
212             if (_server.isStarted())
213                 connector.start();
214 
215             return connector;
216         }
217    }
218 
219     /* ------------------------------------------------------------ */
220     /**
221      * @param listener
222      * @see org.eclipse.jetty.server.handler.ContextHandler#addEventListener(java.util.EventListener)
223      */
224     public void addEventListener(EventListener listener)
225     {
226         _context.addEventListener(listener);
227     }
228 
229     /* ------------------------------------------------------------ */
230     /**
231      * @param filterClass
232      * @param pathSpec
233      * @param dispatches
234      * @return the FilterHolder
235      * @see org.eclipse.jetty.servlet.ServletContextHandler#addFilter(java.lang.Class, java.lang.String, int)
236      */
237     public FilterHolder addFilter(Class filterClass, String pathSpec, int dispatches)
238     {
239         return _context.addFilter(filterClass,pathSpec,dispatches);
240     }
241 
242     /* ------------------------------------------------------------ */
243     /**
244      * @param filterClass
245      * @param pathSpec
246      * @param dispatches
247      * @return the FilterHolder
248      * @see org.eclipse.jetty.servlet.ServletContextHandler#addFilter(java.lang.String, java.lang.String, int)
249      */
250     public FilterHolder addFilter(String filterClass, String pathSpec, int dispatches)
251     {
252         return _context.addFilter(filterClass,pathSpec,dispatches);
253     }
254 
255     /* ------------------------------------------------------------ */
256     /**
257      * @param servlet
258      * @param pathSpec
259      * @return the ServletHolder
260      * @see org.eclipse.jetty.servlet.ServletContextHandler#addServlet(java.lang.Class, java.lang.String)
261      */
262     public ServletHolder addServlet(Class servlet, String pathSpec)
263     {
264         return _context.addServlet(servlet,pathSpec);
265     }
266 
267     /* ------------------------------------------------------------ */
268     /**
269      * @param className
270      * @param pathSpec
271      * @return the ServletHolder
272      * @see org.eclipse.jetty.servlet.ServletContextHandler#addServlet(java.lang.String, java.lang.String)
273      */
274     public ServletHolder addServlet(String className, String pathSpec)
275     {
276         return _context.addServlet(className,pathSpec);
277     }
278 
279     /* ------------------------------------------------------------ */
280     /**
281      * @param name
282      * @return the Attribute object
283      * @see org.eclipse.jetty.servlet.ServletContextHandler#getAttribute(java.lang.String)
284      */
285     public Object getAttribute(String name)
286     {
287         return _context.getAttribute(name);
288     }
289 
290     /* ------------------------------------------------------------ */
291     /**
292      * @return the Attribute Names
293      * @see org.eclipse.jetty.servlet.ServletContextHandler#getAttributeNames()
294      */
295     public Enumeration getAttributeNames()
296     {
297         return _context.getAttributeNames();
298     }
299 
300     /* ------------------------------------------------------------ */
301     /**
302      * @return the attributes
303      * @see org.eclipse.jetty.servlet.ServletContextHandler#getAttributes()
304      */
305     public Attributes getAttributes()
306     {
307         return _context.getAttributes();
308     }
309 
310     /* ------------------------------------------------------------ */
311     /**
312      * @return the resource base
313      * @see org.eclipse.jetty.servlet.ServletContextHandler#getResourceBase()
314      */
315     public String getResourceBase()
316     {
317         return _context.getResourceBase();
318     }
319 
320     /* ------------------------------------------------------------ */
321     /**
322      * @param name
323      * @param value
324      * @see org.eclipse.jetty.servlet.ServletContextHandler#setAttribute(java.lang.String, java.lang.Object)
325      */
326     public void setAttribute(String name, Object value)
327     {
328         _context.setAttribute(name,value);
329     }
330 
331     /* ------------------------------------------------------------ */
332     /**
333      * @param classLoader
334      * @see org.eclipse.jetty.servlet.ServletContextHandler#setClassLoader(java.lang.ClassLoader)
335      */
336     public void setClassLoader(ClassLoader classLoader)
337     {
338         _context.setClassLoader(classLoader);
339     }
340 
341     /* ------------------------------------------------------------ */
342     /**
343      * @param contextPath
344      * @see org.eclipse.jetty.servlet.ServletContextHandler#setContextPath(java.lang.String)
345      */
346     public void setContextPath(String contextPath)
347     {
348         _context.setContextPath(contextPath);
349     }
350 
351     /* ------------------------------------------------------------ */
352     /**
353      * @param eventListeners
354      * @see org.eclipse.jetty.servlet.ServletContextHandler#setEventListeners(java.util.EventListener[])
355      */
356     public void setEventListeners(EventListener[] eventListeners)
357     {
358         _context.setEventListeners(eventListeners);
359     }
360 
361     /* ------------------------------------------------------------ */
362     /**
363      * @param resourceBase
364      * @see org.eclipse.jetty.servlet.ServletContextHandler#setResourceBase(java.lang.String)
365      */
366     public void setResourceBase(String resourceBase)
367     {
368         _context.setResourceBase(resourceBase);
369     }
370 
371 }