/* | |
* 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; | |
import com.google.inject.*; | |
import com.google.inject.name.Names; | |
import com.google.inject.spi.Message; | |
import com.google.inject.spi.TypeEncounter; | |
import org.apache.shiro.guice.aop.ShiroAopModule; | |
import org.apache.shiro.guice.web.ShiroWebModule; | |
import org.apache.shiro.SecurityUtils; | |
import org.apache.shiro.aop.DefaultAnnotationResolver; | |
import org.apache.shiro.crypto.BlowfishCipherService; | |
import org.easymock.Capture; | |
import org.easymock.IMocksControl; | |
import org.junit.Test; | |
import java.util.Collections; | |
import java.util.Map; | |
import static org.easymock.EasyMock.*; | |
import static org.junit.Assert.*; | |
/** | |
* Test Cases:: | |
* Test package matching | |
* injects on classes in shiro package and sub packages | |
* excludes classes in shiro-guice package and sub packages | |
* Test that properties are set properly | |
* ensure optional | |
* ensure property names are correct | |
* ensure "named" properties require a name, and unnamed do not | |
*/ | |
public class BeanTypeListenerTest { | |
@Test | |
public void testUnmatchedPackage() throws Exception { | |
assertFalse(BeanTypeListener.MATCHER.matches(TypeLiteral.get(GuiceEnvironment.class))); | |
assertFalse(BeanTypeListener.MATCHER.matches(TypeLiteral.get(ShiroWebModule.class))); | |
assertFalse(BeanTypeListener.MATCHER.matches(TypeLiteral.get(ShiroAopModule.class))); | |
} | |
@Test | |
public void testMatchedPackage() throws Exception { | |
assertTrue(BeanTypeListener.MATCHER.matches(TypeLiteral.get(SecurityUtils.class))); | |
assertTrue(BeanTypeListener.MATCHER.matches(TypeLiteral.get(DefaultAnnotationResolver.class))); | |
assertTrue(BeanTypeListener.MATCHER.matches(TypeLiteral.get(BlowfishCipherService.class))); | |
} | |
@Test | |
public void testPropertySetting() throws Exception { | |
IMocksControl control = createControl(); | |
TypeEncounter<SomeInjectableBean> encounter = control.createMock(TypeEncounter.class); | |
Provider<Injector> injectorProvider = control.createMock(Provider.class); | |
Injector injector = control.createMock(Injector.class); | |
expect(encounter.getProvider(Injector.class)).andReturn(injectorProvider); | |
expect(injectorProvider.get()).andReturn(injector).anyTimes(); | |
Capture<MembersInjector<SomeInjectableBean>> capture = new Capture<MembersInjector<SomeInjectableBean>>(); | |
encounter.register(and(anyObject(MembersInjector.class), capture(capture))); | |
SecurityManager securityManager = control.createMock(SecurityManager.class); | |
String property = "myPropertyValue"; | |
expect(injector.getInstance(Key.get(SecurityManager.class))).andReturn(securityManager); | |
expect(injector.getInstance(Key.get(String.class, Names.named("shiro.myProperty")))).andReturn(property); | |
expect(injector.getInstance(Key.get(String.class, Names.named("shiro.unavailableProperty")))) | |
.andThrow(new ConfigurationException(Collections.singleton(new Message("Not Available!")))); | |
expect((Map)injector.getInstance(BeanTypeListener.MAP_KEY)).andReturn(Collections.EMPTY_MAP).anyTimes(); | |
control.replay(); | |
BeanTypeListener underTest = new BeanTypeListener(); | |
underTest.hear(TypeLiteral.get(SomeInjectableBean.class), encounter); | |
SomeInjectableBean bean = new SomeInjectableBean(); | |
capture.getValue().injectMembers(bean); | |
assertSame(securityManager, bean.securityManager); | |
assertSame(property, bean.myProperty); | |
assertNull(bean.unavailableProperty); | |
control.verify(); | |
} | |
public static class SomeInjectableBean { | |
private SecurityManager securityManager; | |
private String myProperty; | |
private String unavailableProperty; | |
public void setSecurityManager(SecurityManager securityManager) { | |
this.securityManager = securityManager; | |
} | |
public void setMyProperty(String myProperty) { | |
this.myProperty = myProperty; | |
} | |
public void setUnavailableProperty(String unavailableProperty) { | |
this.unavailableProperty = unavailableProperty; | |
} | |
} | |
} |