/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.shiro.guice.web; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.name.Names; import org.apache.shiro.util.PatternMatcher; import org.apache.shiro.web.util.WebUtils; import org.easymock.IMocksControl; import org.junit.Test; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.LinkedHashMap; import java.util.Map; import static org.easymock.EasyMock.*; import static org.junit.Assert.assertNull; /** * Note that this test is highly dependent on the implementation of SimpleFilterChain. There's really no way around that * that I can see. We determine that the resolver has created it correctly by observing it's behavior. */ public class SimpleFilterChainResolverTest { @Test public void testGetChain() throws Exception { // test that it uses the pattern matcher - check // test that the FIRST chain found is the one that gets returned - check // test that the chain returned actually contains the filters returned by the injector - check // test that the keys specified for the chain are requested from the injector - check // test that filters are looked up lazily - check IMocksControl ctrl = createStrictControl(); Injector injector = ctrl.createMock(Injector.class); Map<String, Key<? extends Filter>[]> chainMap = new LinkedHashMap<String, Key<? extends Filter>[]>(); final String chainOne = "one"; final String chainTwo = "two"; final String chainThree = "three"; final Key<? extends Filter> key1a = Key.get(Filter.class, Names.named("key1a")); final Key<? extends Filter> key1b = Key.get(Filter.class, Names.named("key1b")); final Key<? extends Filter> key2a = Key.get(Filter.class, Names.named("key2a")); final Key<? extends Filter> key2b = Key.get(Filter.class, Names.named("key2b")); final Key<? extends Filter> key3a = Key.get(Filter.class, Names.named("key3a")); final Key<? extends Filter> key3b = Key.get(Filter.class, Names.named("key3b")); chainMap.put(chainOne, new Key[]{key1a, key1b}); chainMap.put(chainTwo, new Key[]{key2a, key2b}); chainMap.put(chainThree, new Key[]{key3a, key3b}); PatternMatcher patternMatcher = ctrl.createMock(PatternMatcher.class); ServletRequest request = ctrl.createMock(HttpServletRequest.class); ServletResponse response = ctrl.createMock(HttpServletResponse.class); FilterChain originalChain = ctrl.createMock(FilterChain.class); expect(request.getAttribute(WebUtils.INCLUDE_CONTEXT_PATH_ATTRIBUTE)).andReturn("/context"); expect(request.getAttribute(WebUtils.INCLUDE_REQUEST_URI_ATTRIBUTE)).andReturn("/mychain"); expect(request.getCharacterEncoding()).andStubReturn(null); expect(patternMatcher.matches(chainOne, "/mychain")).andReturn(false); expect(patternMatcher.matches(chainTwo, "/mychain")).andReturn(true); Filter filter2a = ctrl.createMock(Filter.class); Filter filter2b = ctrl.createMock(Filter.class); expect((Filter)injector.getInstance(key2a)).andReturn(filter2a); filter2a.doFilter(same(request), same(response), anyObject(FilterChain.class)); expect((Filter)injector.getInstance(key2b)).andReturn(filter2b); filter2b.doFilter(same(request), same(response), anyObject(FilterChain.class)); originalChain.doFilter(request, response); ctrl.replay(); SimpleFilterChainResolver underTest = new SimpleFilterChainResolver(chainMap, injector, patternMatcher); FilterChain got = underTest.getChain(request, response, originalChain); got.doFilter(request, response); got.doFilter(request, response); got.doFilter(request, response); ctrl.verify(); ctrl.reset(); expect(request.getAttribute(WebUtils.INCLUDE_CONTEXT_PATH_ATTRIBUTE)).andReturn("/context"); expect(request.getAttribute(WebUtils.INCLUDE_REQUEST_URI_ATTRIBUTE)).andReturn("/nochain"); expect(request.getCharacterEncoding()).andStubReturn(null); expect(patternMatcher.matches(chainOne, "/nochain")).andReturn(false); expect(patternMatcher.matches(chainTwo, "/nochain")).andReturn(false); expect(patternMatcher.matches(chainThree, "/nochain")).andReturn(false); ctrl.replay(); assertNull("Expected no chain to match, did not get a null value in return.", underTest.getChain(request, response, originalChain)); ctrl.verify(); } }