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