• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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