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 }