001: /**
002: * Copyright (C) 2006 Google Inc.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */package com.google.inject.servlet;
016:
017: import com.google.inject.AbstractModule;
018: import com.google.inject.CreationException;
019: import com.google.inject.Guice;
020: import com.google.inject.Injector;
021: import com.google.inject.Key;
022: import java.io.IOException;
023: import javax.servlet.FilterChain;
024: import javax.servlet.ServletException;
025: import javax.servlet.ServletRequest;
026: import javax.servlet.ServletResponse;
027: import javax.servlet.http.HttpServletRequest;
028: import javax.servlet.http.HttpSession;
029: import junit.framework.TestCase;
030: import static org.easymock.EasyMock.createMock;
031: import static org.easymock.EasyMock.eq;
032: import static org.easymock.EasyMock.expect;
033: import static org.easymock.EasyMock.isA;
034: import static org.easymock.EasyMock.replay;
035: import static org.easymock.EasyMock.verify;
036:
037: /**
038: * @author crazybob@google.com (Bob Lee)
039: */
040: public class ServletTest extends TestCase {
041:
042: public void testNewRequestObject() throws CreationException,
043: IOException, ServletException {
044: final Injector injector = createInjector();
045:
046: GuiceFilter filter = new GuiceFilter();
047:
048: final HttpServletRequest request = createMock(HttpServletRequest.class);
049:
050: String name = Key.get(InRequest.class).toString();
051: expect(request.getAttribute(name)).andReturn(null);
052: request.setAttribute(eq(name), isA(InRequest.class));
053:
054: final boolean[] invoked = new boolean[1];
055: FilterChain filterChain = new FilterChain() {
056: public void doFilter(ServletRequest servletRequest,
057: ServletResponse servletResponse) {
058: invoked[0] = true;
059: assertSame(request, servletRequest);
060: assertNotNull(injector.getInstance(InRequest.class));
061: }
062: };
063:
064: replay(request);
065:
066: filter.doFilter(request, null, filterChain);
067:
068: verify(request);
069: assertTrue(invoked[0]);
070: }
071:
072: public void testExistingRequestObject() throws CreationException,
073: IOException, ServletException {
074: final Injector injector = createInjector();
075:
076: GuiceFilter filter = new GuiceFilter();
077:
078: final HttpServletRequest request = createMock(HttpServletRequest.class);
079:
080: final InRequest inRequest = new InRequest();
081: String name = Key.get(InRequest.class).toString();
082: expect(request.getAttribute(name)).andReturn(inRequest)
083: .times(2);
084:
085: final boolean[] invoked = new boolean[1];
086: FilterChain filterChain = new FilterChain() {
087: public void doFilter(ServletRequest servletRequest,
088: ServletResponse servletResponse) {
089: invoked[0] = true;
090: assertSame(request, servletRequest);
091: assertSame(inRequest, injector
092: .getInstance(InRequest.class));
093: assertSame(inRequest, injector
094: .getInstance(InRequest.class));
095: }
096: };
097:
098: replay(request);
099:
100: filter.doFilter(request, null, filterChain);
101:
102: verify(request);
103: assertTrue(invoked[0]);
104: }
105:
106: public void testNewSessionObject() throws CreationException,
107: IOException, ServletException {
108: final Injector injector = createInjector();
109:
110: GuiceFilter filter = new GuiceFilter();
111:
112: final HttpServletRequest request = createMock(HttpServletRequest.class);
113: final HttpSession session = createMock(HttpSession.class);
114:
115: String name = Key.get(InSession.class).toString();
116:
117: expect(request.getSession()).andReturn(session);
118: expect(session.getAttribute(name)).andReturn(null);
119: session.setAttribute(eq(name), isA(InSession.class));
120:
121: final boolean[] invoked = new boolean[1];
122: FilterChain filterChain = new FilterChain() {
123: public void doFilter(ServletRequest servletRequest,
124: ServletResponse servletResponse) {
125: invoked[0] = true;
126: assertSame(request, servletRequest);
127: assertNotNull(injector.getInstance(InSession.class));
128: }
129: };
130:
131: replay(request, session);
132:
133: filter.doFilter(request, null, filterChain);
134:
135: verify(request, session);
136: assertTrue(invoked[0]);
137: }
138:
139: public void testExistingSessionObject() throws CreationException,
140: IOException, ServletException {
141: final Injector injector = createInjector();
142:
143: GuiceFilter filter = new GuiceFilter();
144:
145: final HttpServletRequest request = createMock(HttpServletRequest.class);
146: final HttpSession session = createMock(HttpSession.class);
147:
148: String name = Key.get(InSession.class).toString();
149:
150: final InSession inSession = new InSession();
151: expect(request.getSession()).andReturn(session).times(2);
152: expect(session.getAttribute(name)).andReturn(inSession)
153: .times(2);
154:
155: final boolean[] invoked = new boolean[1];
156: FilterChain filterChain = new FilterChain() {
157: public void doFilter(ServletRequest servletRequest,
158: ServletResponse servletResponse) {
159: invoked[0] = true;
160: assertSame(request, servletRequest);
161:
162: assertSame(inSession, injector
163: .getInstance(InSession.class));
164: assertSame(inSession, injector
165: .getInstance(InSession.class));
166: }
167: };
168:
169: replay(request, session);
170:
171: filter.doFilter(request, null, filterChain);
172:
173: verify(request, session);
174: assertTrue(invoked[0]);
175: }
176:
177: private Injector createInjector() throws CreationException {
178: return Guice.createInjector(new AbstractModule() {
179: protected void configure() {
180: install(new ServletModule());
181: bind(InSession.class);
182: bind(InRequest.class);
183: }
184: });
185: }
186:
187: @SessionScoped
188: static class InSession {
189: }
190:
191: @RequestScoped
192: static class InRequest {
193: }
194: }
|