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