View Javadoc

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