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 }