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