// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.servlet; import javax.servlet.UnavailableException; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.util.MultiException; import org.eclipse.jetty.util.log.StacklessLogging; import org.junit.Assert; import org.junit.Test; public class ServletHolderTest { @Test public void testTransitiveCompareTo() throws Exception { // example of jsp-file referenced in web.xml final ServletHolder one = new ServletHolder(); one.setInitOrder(-1); one.setName("Login"); one.setClassName(null); // example of pre-compiled jsp final ServletHolder two = new ServletHolder(); two.setInitOrder(-1); two.setName("org.my.package.jsp.WEB_002dINF.pages.precompiled_002dpage_jsp"); two.setClassName("org.my.package.jsp.WEB_002dINF.pages.precompiled_002dpage_jsp"); // example of servlet referenced in web.xml final ServletHolder three = new ServletHolder(); three.setInitOrder(-1); three.setName("Download"); three.setClassName("org.my.package.web.DownloadServlet"); // verify compareTo transitivity Assert.assertTrue(one.compareTo(two) < 0); Assert.assertTrue(two.compareTo(three) < 0); Assert.assertTrue(one.compareTo(three) < 0); } @Test public void testJspFileNameToClassName() throws Exception { ServletHolder h = new ServletHolder(); h.setName("test"); Assert.assertEquals(null, h.getClassNameForJsp(null)); Assert.assertEquals(null, h.getClassNameForJsp("")); Assert.assertEquals(null, h.getClassNameForJsp("/blah/")); Assert.assertEquals(null, h.getClassNameForJsp("//blah///")); Assert.assertEquals(null, h.getClassNameForJsp("/a/b/c/blah/")); Assert.assertEquals("org.apache.jsp.a.b.c.blah", h.getClassNameForJsp("/a/b/c/blah")); Assert.assertEquals("org.apache.jsp.blah_jsp", h.getClassNameForJsp("/blah.jsp")); Assert.assertEquals("org.apache.jsp.blah_jsp", h.getClassNameForJsp("//blah.jsp")); Assert.assertEquals("org.apache.jsp.blah_jsp", h.getClassNameForJsp("blah.jsp")); Assert.assertEquals("org.apache.jsp.a.b.c.blah_jsp", h.getClassNameForJsp("/a/b/c/blah.jsp")); Assert.assertEquals("org.apache.jsp.a.b.c.blah_jsp", h.getClassNameForJsp("a/b/c/blah.jsp")); } @Test public void testNoClassName() throws Exception { try (StacklessLogging stackless = new StacklessLogging(ServletHandler.class, ContextHandler.class, ServletContextHandler.class)) { ServletContextHandler context = new ServletContextHandler(); ServletHandler handler = context.getServletHandler(); ServletHolder holder = new ServletHolder(); holder.setName("foo"); holder.setForcedPath("/blah/"); handler.addServlet(holder); handler.start(); Assert.fail("No class in ServletHolder"); } catch (UnavailableException e) { Assert.assertTrue(e.getMessage().contains("foo")); } catch (MultiException e) { MultiException m = (MultiException)e; Assert.assertTrue(m.getCause().getMessage().contains("foo")); } } @Test public void testUnloadableClassName() throws Exception { try (StacklessLogging stackless = new StacklessLogging(BaseHolder.class, ServletHandler.class, ContextHandler.class, ServletContextHandler.class)) { ServletContextHandler context = new ServletContextHandler(); ServletHandler handler = context.getServletHandler(); ServletHolder holder = new ServletHolder(); holder.setName("foo"); holder.setClassName("a.b.c.class"); handler.addServlet(holder); handler.start(); Assert.fail("Unloadable class"); } catch (UnavailableException e) { Assert.assertTrue(e.getMessage().contains("foo")); } catch (MultiException e) { MultiException m = (MultiException)e; Assert.assertTrue(m.getCause().getMessage().contains("foo")); } } }