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