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 }