1 // 2 // ======================================================================== 3 // Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. 4 // ------------------------------------------------------------------------ 5 // All rights reserved. This program and the accompanying materials 6 // are made available under the terms of the Eclipse Public License v1.0 7 // and Apache License v2.0 which accompanies this distribution. 8 // 9 // The Eclipse Public License is available at 10 // http://www.eclipse.org/legal/epl-v10.html 11 // 12 // The Apache License v2.0 is available at 13 // http://www.opensource.org/licenses/apache2.0.php 14 // 15 // You may elect to redistribute this code under either of these licenses. 16 // ======================================================================== 17 // 18 19 package org.eclipse.jetty.testing; 20 21 import java.net.InetAddress; 22 import java.util.Enumeration; 23 import java.util.EventListener; 24 25 import org.eclipse.jetty.io.ByteArrayBuffer; 26 import org.eclipse.jetty.server.LocalConnector; 27 import org.eclipse.jetty.server.Server; 28 import org.eclipse.jetty.server.bio.SocketConnector; 29 import org.eclipse.jetty.server.handler.ErrorHandler; 30 import org.eclipse.jetty.server.nio.SelectChannelConnector; 31 import org.eclipse.jetty.servlet.FilterHolder; 32 import org.eclipse.jetty.servlet.ServletContextHandler; 33 import org.eclipse.jetty.servlet.ServletHolder; 34 import org.eclipse.jetty.util.Attributes; 35 36 37 38 /* ------------------------------------------------------------ */ 39 /** Testing support for servlets and filters. 40 * 41 * Allows a programatic setup of a context with servlets and filters for 42 * testing. Raw HTTP requests may be sent to the context and responses received. 43 * To avoid handling raw HTTP see {@link org.eclipse.jetty.testing.HttpTester}. 44 * <pre> 45 * ServletTester tester=new ServletTester(); 46 * tester.setContextPath("/context"); 47 * tester.addServlet(TestServlet.class, "/servlet/*"); 48 * tester.addServlet("org.eclipse.jetty.servlet.DefaultServlet", "/"); 49 * tester.start(); 50 * String response = tester.getResponses("GET /context/servlet/info HTTP/1.0\r\n\r\n"); 51 * </pre> 52 * 53 * @see org.eclipse.jetty.testing.HttpTester 54 * 55 * 56 */ 57 public class ServletTester 58 { 59 Server _server = new Server(); 60 LocalConnector _connector = new LocalConnector(); 61 // Context _context = new Context(Context.SESSIONS|Context.SECURITY); 62 //jaspi why security if it is not set up? 63 ServletContextHandler _context = new ServletContextHandler(ServletContextHandler.SESSIONS); 64 65 public ServletTester() 66 { 67 try 68 { 69 _server.addBean(new ErrorHandler()); 70 _server.setSendServerVersion(false); 71 _server.addConnector(_connector); 72 _server.setHandler(_context); 73 } 74 catch (Error e) 75 { 76 throw e; 77 } 78 catch (RuntimeException e) 79 { 80 throw e; 81 } 82 catch (Exception e) 83 { 84 throw new RuntimeException(e); 85 } 86 } 87 88 /* ------------------------------------------------------------ */ 89 public void dump() 90 { 91 _server.dump(); 92 } 93 94 /* ------------------------------------------------------------ */ 95 public void start() throws Exception 96 { 97 _server.start(); 98 } 99 100 /* ------------------------------------------------------------ */ 101 public void join() throws Exception 102 { 103 _server.join(); 104 } 105 106 /* ------------------------------------------------------------ */ 107 public void stop() throws Exception 108 { 109 _server.stop(); 110 } 111 112 /* ------------------------------------------------------------ */ 113 public ServletContextHandler getContext() 114 { 115 return _context; 116 } 117 118 /* ------------------------------------------------------------ */ 119 /** Get raw HTTP responses from raw HTTP requests. 120 * Multiple requests and responses may be handled, but only if 121 * persistent connections conditions apply. 122 * @param rawRequests String of raw HTTP requests 123 * @return String of raw HTTP responses 124 * @throws Exception 125 */ 126 public String getResponses(String rawRequests) throws Exception 127 { 128 return _connector.getResponses(rawRequests); 129 } 130 131 /* ------------------------------------------------------------ */ 132 /** Get raw HTTP responses from raw HTTP requests. 133 * Multiple requests and responses may be handled, but only if 134 * persistent connections conditions apply. 135 * @param rawRequests String of raw HTTP requests 136 * @param connector The connector to handle the responses 137 * @return String of raw HTTP responses 138 * @throws Exception 139 */ 140 public String getResponses(String rawRequests, LocalConnector connector) throws Exception 141 { 142 return connector.getResponses(rawRequests); 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 * @return String of raw HTTP responses 151 * @throws Exception 152 */ 153 public ByteArrayBuffer getResponses(ByteArrayBuffer rawRequests) throws Exception 154 { 155 return _connector.getResponses(rawRequests,false); 156 } 157 158 /* ------------------------------------------------------------ */ 159 /** Create a Socket connector. 160 * This methods adds a socket connector to the server 161 * @param localhost if true, only listen on local host, else listen on all interfaces. 162 * @return A URL to access the server via the socket connector. 163 * @throws Exception 164 */ 165 public String createSocketConnector(boolean localhost) 166 throws Exception 167 { 168 synchronized (this) 169 { 170 SocketConnector connector = new SocketConnector(); 171 if (localhost) 172 connector.setHost("127.0.0.1"); 173 _server.addConnector(connector); 174 if (_server.isStarted()) 175 connector.start(); 176 else 177 connector.open(); 178 179 return "http://127.0.0.1:"+connector.getLocalPort(); 180 } 181 } 182 183 /* ------------------------------------------------------------ */ 184 /** Create a SelectChannel connector. 185 * This methods adds a select channel connector to the server 186 * @return A URL to access the server via the connector. 187 * @throws Exception 188 */ 189 public String createChannelConnector(boolean localhost) 190 throws Exception 191 { 192 synchronized (this) 193 { 194 SelectChannelConnector connector = new SelectChannelConnector(); 195 if (localhost) 196 connector.setHost("127.0.0.1"); 197 _server.addConnector(connector); 198 if (_server.isStarted()) 199 connector.start(); 200 else 201 connector.open(); 202 203 return "http://"+(localhost?"127.0.0.1": 204 InetAddress.getLocalHost().getHostAddress() 205 )+":"+connector.getLocalPort(); 206 } 207 } 208 209 /* ------------------------------------------------------------ */ 210 /** Create a local connector. 211 * This methods adds a local connector to the server 212 * @return The LocalConnector object 213 * @throws Exception 214 */ 215 public LocalConnector createLocalConnector() 216 throws Exception 217 { 218 synchronized (this) 219 { 220 LocalConnector connector = new LocalConnector(); 221 _server.addConnector(connector); 222 223 if (_server.isStarted()) 224 connector.start(); 225 226 return connector; 227 } 228 } 229 230 /* ------------------------------------------------------------ */ 231 /** 232 * @param listener 233 * @see org.eclipse.jetty.server.handler.ContextHandler#addEventListener(java.util.EventListener) 234 */ 235 public void addEventListener(EventListener listener) 236 { 237 _context.addEventListener(listener); 238 } 239 240 /* ------------------------------------------------------------ */ 241 /** 242 * @param filterClass 243 * @param pathSpec 244 * @param dispatches 245 * @return the FilterHolder 246 * @see org.eclipse.jetty.servlet.ServletContextHandler#addFilter(java.lang.Class, java.lang.String, int) 247 */ 248 public FilterHolder addFilter(Class filterClass, String pathSpec, int dispatches) 249 { 250 return _context.addFilter(filterClass,pathSpec,dispatches); 251 } 252 253 /* ------------------------------------------------------------ */ 254 /** 255 * @param filterClass 256 * @param pathSpec 257 * @param dispatches 258 * @return the FilterHolder 259 * @see org.eclipse.jetty.servlet.ServletContextHandler#addFilter(java.lang.String, java.lang.String, int) 260 */ 261 public FilterHolder addFilter(String filterClass, String pathSpec, int dispatches) 262 { 263 return _context.addFilter(filterClass,pathSpec,dispatches); 264 } 265 266 /* ------------------------------------------------------------ */ 267 /** 268 * @param servlet 269 * @param pathSpec 270 * @return the ServletHolder 271 * @see org.eclipse.jetty.servlet.ServletContextHandler#addServlet(java.lang.Class, java.lang.String) 272 */ 273 public ServletHolder addServlet(Class servlet, String pathSpec) 274 { 275 return _context.addServlet(servlet,pathSpec); 276 } 277 278 /* ------------------------------------------------------------ */ 279 /** 280 * @param className 281 * @param pathSpec 282 * @return the ServletHolder 283 * @see org.eclipse.jetty.servlet.ServletContextHandler#addServlet(java.lang.String, java.lang.String) 284 */ 285 public ServletHolder addServlet(String className, String pathSpec) 286 { 287 return _context.addServlet(className,pathSpec); 288 } 289 290 /* ------------------------------------------------------------ */ 291 /** 292 * @param name 293 * @return the Attribute object 294 * @see org.eclipse.jetty.servlet.ServletContextHandler#getAttribute(java.lang.String) 295 */ 296 public Object getAttribute(String name) 297 { 298 return _context.getAttribute(name); 299 } 300 301 /* ------------------------------------------------------------ */ 302 /** 303 * @return the Attribute Names 304 * @see org.eclipse.jetty.servlet.ServletContextHandler#getAttributeNames() 305 */ 306 public Enumeration getAttributeNames() 307 { 308 return _context.getAttributeNames(); 309 } 310 311 /* ------------------------------------------------------------ */ 312 /** 313 * @return the attributes 314 * @see org.eclipse.jetty.servlet.ServletContextHandler#getAttributes() 315 */ 316 public Attributes getAttributes() 317 { 318 return _context.getAttributes(); 319 } 320 321 /* ------------------------------------------------------------ */ 322 /** 323 * @return the resource base 324 * @see org.eclipse.jetty.servlet.ServletContextHandler#getResourceBase() 325 */ 326 public String getResourceBase() 327 { 328 return _context.getResourceBase(); 329 } 330 331 /* ------------------------------------------------------------ */ 332 /** 333 * @param name 334 * @param value 335 * @see org.eclipse.jetty.servlet.ServletContextHandler#setAttribute(java.lang.String, java.lang.Object) 336 */ 337 public void setAttribute(String name, Object value) 338 { 339 _context.setAttribute(name,value); 340 } 341 342 /* ------------------------------------------------------------ */ 343 /** 344 * @param classLoader 345 * @see org.eclipse.jetty.servlet.ServletContextHandler#setClassLoader(java.lang.ClassLoader) 346 */ 347 public void setClassLoader(ClassLoader classLoader) 348 { 349 _context.setClassLoader(classLoader); 350 } 351 352 /* ------------------------------------------------------------ */ 353 /** 354 * @param contextPath 355 * @see org.eclipse.jetty.servlet.ServletContextHandler#setContextPath(java.lang.String) 356 */ 357 public void setContextPath(String contextPath) 358 { 359 _context.setContextPath(contextPath); 360 } 361 362 /* ------------------------------------------------------------ */ 363 /** 364 * @param eventListeners 365 * @see org.eclipse.jetty.servlet.ServletContextHandler#setEventListeners(java.util.EventListener[]) 366 */ 367 public void setEventListeners(EventListener[] eventListeners) 368 { 369 _context.setEventListeners(eventListeners); 370 } 371 372 /* ------------------------------------------------------------ */ 373 /** 374 * @param resourceBase 375 * @see org.eclipse.jetty.servlet.ServletContextHandler#setResourceBase(java.lang.String) 376 */ 377 public void setResourceBase(String resourceBase) 378 { 379 _context.setResourceBase(resourceBase); 380 } 381 382 }