Home | History | Annotate | Download | only in servlet
      1 package com.google.inject.servlet;
      2 
      3 import static org.easymock.EasyMock.createMock;
      4 
      5 import com.google.inject.Guice;
      6 import com.google.inject.Scopes;
      7 import com.google.inject.Singleton;
      8 
      9 import junit.framework.TestCase;
     10 
     11 import javax.servlet.FilterConfig;
     12 import javax.servlet.ServletException;
     13 import javax.servlet.http.HttpServlet;
     14 
     15 /**
     16  * Ensures that an error is thrown if a Servlet or Filter is bound
     17  * under any scope other than singleton, explicitly.
     18  *
     19  * @author dhanji (at) gmail.com
     20  */
     21 public class InvalidScopeBindingTest extends TestCase {
     22 
     23   @Override
     24   protected void tearDown() throws Exception {
     25     GuiceFilter.reset();
     26   }
     27 
     28   public final void testServletInNonSingletonScopeThrowsServletException(){
     29     GuiceFilter guiceFilter = new GuiceFilter();
     30 
     31     Guice.createInjector(new ServletModule() {
     32       @Override
     33       protected void configureServlets() {
     34         serve("/*").with(MyNonSingletonServlet.class);
     35       }
     36     });
     37 
     38     ServletException se = null;
     39     try {
     40       guiceFilter.init(createMock(FilterConfig.class));
     41     } catch (ServletException e) {
     42       se = e;
     43     } finally {
     44       assertNotNull("Servlet exception was not thrown with wrong scope binding", se);
     45     }
     46   }
     47 
     48   public final void testFilterInNonSingletonScopeThrowsServletException(){
     49     GuiceFilter guiceFilter = new GuiceFilter();
     50 
     51     Guice.createInjector(new ServletModule() {
     52       @Override
     53       protected void configureServlets() {
     54         filter("/*").through(MyNonSingletonFilter.class);
     55       }
     56     });
     57 
     58     ServletException se = null;
     59     try {
     60       guiceFilter.init(createMock(FilterConfig.class));
     61     } catch (ServletException e) {
     62       se = e;
     63     } finally {
     64       assertNotNull("Servlet exception was not thrown with wrong scope binding", se);
     65     }
     66   }
     67 
     68   public final void testHappyCaseFilter(){
     69     GuiceFilter guiceFilter = new GuiceFilter();
     70 
     71     Guice.createInjector(new ServletModule() {
     72       @Override
     73       protected void configureServlets() {
     74         // Annotated scoping variant.
     75         filter("/*").through(MySingletonFilter.class);
     76 
     77         // Explicit scoping variant.
     78         bind(DummyFilterImpl.class).in(Scopes.SINGLETON);
     79         filter("/*").through(DummyFilterImpl.class);
     80       }
     81     });
     82 
     83     ServletException se = null;
     84     try {
     85       guiceFilter.init(createMock(FilterConfig.class));
     86     } catch (ServletException e) {
     87       se = e;
     88     } finally {
     89       assertNull("Servlet exception was thrown with correct scope binding", se);
     90     }
     91   }
     92 
     93   @RequestScoped
     94   public static class MyNonSingletonServlet extends HttpServlet { }
     95 
     96   @SessionScoped
     97   public static class MyNonSingletonFilter extends DummyFilterImpl { }
     98 
     99   @Singleton
    100   public static class MySingletonFilter extends DummyFilterImpl { }
    101 }
    102