View Javadoc

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