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 }