1 /* 2 * Copyright (C) 2010 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.inject.servlet; 18 19 import com.google.common.collect.Lists; 20 import com.google.inject.Binding; 21 import com.google.inject.CreationException; 22 import com.google.inject.Guice; 23 import com.google.inject.Injector; 24 import com.google.inject.spi.DefaultBindingTargetVisitor; 25 import com.google.inject.spi.Elements; 26 import java.util.List; 27 import junit.framework.TestCase; 28 29 /** 30 * Tests for ServletModule, to ensure it captures bindings correctly. 31 * 32 * @author sameb@google.com (Sam Berlin) 33 */ 34 public class ServletModuleTest extends TestCase { 35 testServletModuleCallOutsideConfigure()36 public void testServletModuleCallOutsideConfigure() { 37 try { 38 new ServletModule() { 39 { 40 serve("/*").with(DummyServlet.class); 41 } 42 }; 43 fail(); 44 } catch (IllegalStateException e) { 45 // Expected. 46 } 47 } 48 testServletModuleReuse()49 public void testServletModuleReuse() { 50 Module module = new Module(); 51 Elements.getElements(module); // use the module once (to, say, introspect bindings) 52 Injector injector = Guice.createInjector(module); // use it again. 53 54 Visitor visitor = new Visitor(); 55 // Validate only a single servlet binding & a single filter binding exist. 56 for (Binding<?> binding : injector.getAllBindings().values()) { 57 binding.acceptTargetVisitor(visitor); 58 } 59 assertEquals( 60 "wrong linked servlets: " + visitor.linkedServlets, 0, visitor.linkedServlets.size()); 61 assertEquals("wrong linked filters: " + visitor.linkedFilters, 0, visitor.linkedFilters.size()); 62 assertEquals( 63 "wrong instance servlets: " + visitor.instanceServlets, 1, visitor.instanceServlets.size()); 64 assertEquals( 65 "wrong instance filters: " + visitor.instanceFilters, 1, visitor.instanceFilters.size()); 66 } 67 testServletModule_badPattern()68 public void testServletModule_badPattern() { 69 try { 70 Guice.createInjector( 71 new ServletModule() { 72 @Override 73 protected void configureServlets() { 74 serve("/%2E/*").with(new DummyServlet()); 75 serveRegex("/(foo|bar/").with(new DummyServlet()); 76 filter("/%2E/*").through(new DummyFilterImpl()); 77 filterRegex("/(foo|bar/").through(new DummyFilterImpl()); 78 } 79 }); 80 fail(); 81 } catch (CreationException e) { 82 assertEquals(4, e.getErrorMessages().size()); 83 } 84 } 85 86 private static class Module extends ServletModule { 87 @Override configureServlets()88 protected void configureServlets() { 89 serve("/sam/*").with(new DummyServlet()); 90 filter("/tara/*").through(new DummyFilterImpl()); 91 } 92 } 93 94 private static class Visitor extends DefaultBindingTargetVisitor<Object, Void> 95 implements ServletModuleTargetVisitor<Object, Void> { 96 List<LinkedFilterBinding> linkedFilters = Lists.newArrayList(); 97 List<LinkedServletBinding> linkedServlets = Lists.newArrayList(); 98 List<InstanceFilterBinding> instanceFilters = Lists.newArrayList(); 99 List<InstanceServletBinding> instanceServlets = Lists.newArrayList(); 100 101 @Override visit(LinkedFilterBinding binding)102 public Void visit(LinkedFilterBinding binding) { 103 linkedFilters.add(binding); 104 return null; 105 } 106 107 @Override visit(InstanceFilterBinding binding)108 public Void visit(InstanceFilterBinding binding) { 109 instanceFilters.add(binding); 110 return null; 111 } 112 113 @Override visit(LinkedServletBinding binding)114 public Void visit(LinkedServletBinding binding) { 115 linkedServlets.add(binding); 116 return null; 117 } 118 119 @Override visit(InstanceServletBinding binding)120 public Void visit(InstanceServletBinding binding) { 121 instanceServlets.add(binding); 122 return null; 123 } 124 } 125 } 126