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