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 }