/* * This code is distributed under The GNU Lesser General Public License (LGPLv3) * Please visit GNU site for LGPLv3 http://www.gnu.org/copyleft/lesser.html * * Copyright Denis Pavlov 2009 * Web: http://www.genericdtoassembler.org * SVN: https://svn.code.sf.net/p/geda-genericdto/code/trunk/ * SVN (mirror): http://geda-genericdto.googlecode.com/svn/trunk/ */ package com.inspiresoftware.lib.dto.geda.interceptor.impl; import com.inspiresoftware.lib.dto.geda.annotations.Occurrence; import com.inspiresoftware.lib.dto.geda.interceptor.AdviceConfig; import org.easymock.EasyMock; import org.easymock.IMocksControl; import org.testng.annotations.Test; import java.lang.reflect.Method; import java.util.Collections; import java.util.Map; import static org.easymock.EasyMock.expect; import static org.testng.Assert.*; /** * . * <p/> * User: denispavlov * Date: Jan 26, 2012 * Time: 6:06:16 PM */ public class AdviceConfigResolverImplTest { public static class TestMethods { public void methAnn1() { } public void methAnn2() { } public void methBlack1() { } public void methBlack2() { } } @Test public void testResolveMethod() throws Exception { final IMocksControl ctrl = EasyMock.createControl(); final Method methAnn1 = TestMethods.class.getMethod("methAnn1"); final Method methAnn2 = TestMethods.class.getMethod("methAnn2"); final Method methBlack1 = TestMethods.class.getMethod("methBlack1"); final Method methBlack2 = TestMethods.class.getMethod("methBlack2"); final Map cfg1 = ctrl.createMock("cfg1", Map.class); final Map cfg2 = ctrl.createMock("cfg2", Map.class); final RuntimeAdviceConfigResolverImpl resolver = new RuntimeAdviceConfigResolverImpl() { private int count = 0; @Override Map<Occurrence, AdviceConfig> resolveConfiguration(final Method method, final Class<?> targetClass) { assertTrue(count < 4); if (method == methAnn1) { count++; return cfg1; } else if (method == methAnn2) { count++; return cfg2; } return Collections.emptyMap(); } }; expect(cfg1.isEmpty()).andReturn(false).anyTimes(); expect(cfg2.isEmpty()).andReturn(false).anyTimes(); ctrl.replay(); final Map<Occurrence, AdviceConfig> map1 = resolver.resolve(methAnn1, null); assertNotNull(map1); assertSame(map1, cfg1); final Map<Occurrence, AdviceConfig> map1_1 = resolver.resolve(methAnn1, null); assertNotNull(map1_1); assertSame(map1_1, cfg1); assertSame(map1, map1_1); final Map<Occurrence, AdviceConfig> map1_2 = resolver.resolve(methAnn1, null); assertNotNull(map1_2); assertSame(map1_2, cfg1); assertSame(map1, map1_2); assertTrue(resolver.isCached(resolver.methodCacheKey(methAnn1, null))); assertFalse(resolver.isBlacklisted(resolver.methodCacheKey(methAnn1, null))); final Map<Occurrence, AdviceConfig> map2 = resolver.resolve(methAnn2, null); assertNotNull(map2); assertSame(map2, cfg2); final Map<Occurrence, AdviceConfig> map2_1 = resolver.resolve(methAnn2, null); assertNotNull(map2_1); assertSame(map2_1, cfg2); final Map<Occurrence, AdviceConfig> map2_2 = resolver.resolve(methAnn2, null); assertNotNull(map2_2); assertSame(map2_2, cfg2); assertSame(map2, map2_1); assertTrue(resolver.isCached(resolver.methodCacheKey(methAnn2, null))); assertFalse(resolver.isBlacklisted(resolver.methodCacheKey(methAnn2, null))); final Map<Occurrence, AdviceConfig> map3 = resolver.resolve(methBlack1, null); assertNotNull(map3); assertTrue(map3.isEmpty()); final Map<Occurrence, AdviceConfig> map3_1 = resolver.resolve(methBlack1, null); assertNotNull(map3_1); assertTrue(map3_1.isEmpty()); assertSame(map3, map3_1); assertFalse(resolver.isCached(resolver.methodCacheKey(methBlack1, null))); assertTrue(resolver.isBlacklisted(resolver.methodCacheKey(methBlack1, null))); final Map<Occurrence, AdviceConfig> map4 = resolver.resolve(methBlack2, null); assertNotNull(map4); assertTrue(map4.isEmpty()); final Map<Occurrence, AdviceConfig> map4_1 = resolver.resolve(methBlack2, null); assertNotNull(map4_1); assertTrue(map4_1.isEmpty()); assertSame(map4, map4_1); assertFalse(resolver.isCached(resolver.methodCacheKey(methBlack2, null))); assertTrue(resolver.isBlacklisted(resolver.methodCacheKey(methBlack2, null))); ctrl.verify(); } public static class TestMethodsProxy extends TestMethods { } @Test public void testResolveMethodByClass() throws Exception { final IMocksControl ctrl = EasyMock.createControl(); final Method methAnn1 = TestMethods.class.getMethod("methAnn1"); final Method methBlack1 = TestMethods.class.getMethod("methBlack1"); final Map cfg1 = ctrl.createMock("cfg1", Map.class); final Map cfg2 = ctrl.createMock("cfg2", Map.class); final RuntimeAdviceConfigResolverImpl resolver = new RuntimeAdviceConfigResolverImpl() { private int count = 0; @Override Map<Occurrence, AdviceConfig> resolveConfiguration(final Method method, final Class<?> targetClass) { assertTrue(count < 3); if (method == methAnn1) { count++; return cfg1; } return Collections.emptyMap(); } }; expect(cfg1.isEmpty()).andReturn(false).anyTimes(); expect(cfg2.isEmpty()).andReturn(false).anyTimes(); ctrl.replay(); final Map<Occurrence, AdviceConfig> map1 = resolver.resolve(methAnn1, null); assertNotNull(map1); assertSame(map1, cfg1); final Map<Occurrence, AdviceConfig> map1_1 = resolver.resolve(methAnn1, TestMethods.class); assertNotNull(map1_1); assertSame(map1_1, cfg1); assertSame(map1, map1_1); final Map<Occurrence, AdviceConfig> map1_2 = resolver.resolve(methAnn1, TestMethodsProxy.class); assertNotNull(map1_2); assertSame(map1_2, cfg1); assertSame(map1, map1_2); assertTrue(resolver.isCached(resolver.methodCacheKey(methAnn1, null))); assertTrue(resolver.isCached(resolver.methodCacheKey(methAnn1, TestMethods.class))); assertTrue(resolver.isCached(resolver.methodCacheKey(methAnn1, TestMethodsProxy.class))); assertFalse(resolver.isBlacklisted(resolver.methodCacheKey(methAnn1, null))); assertFalse(resolver.isBlacklisted(resolver.methodCacheKey(methAnn1, TestMethods.class))); assertFalse(resolver.isBlacklisted(resolver.methodCacheKey(methAnn1, TestMethodsProxy.class))); final Map<Occurrence, AdviceConfig> map3 = resolver.resolve(methBlack1, null); assertNotNull(map3); assertTrue(map3.isEmpty()); final Map<Occurrence, AdviceConfig> map3_1 = resolver.resolve(methBlack1, TestMethodsProxy.class); assertNotNull(map3_1); assertTrue(map3_1.isEmpty()); assertSame(map3, map3_1); assertFalse(resolver.isCached(resolver.methodCacheKey(methBlack1, null))); assertFalse(resolver.isCached(resolver.methodCacheKey(methBlack1, TestMethods.class))); assertFalse(resolver.isCached(resolver.methodCacheKey(methBlack1, TestMethodsProxy.class))); assertTrue(resolver.isBlacklisted(resolver.methodCacheKey(methBlack1, null))); assertTrue(resolver.isBlacklisted(resolver.methodCacheKey(methBlack1, TestMethods.class))); assertTrue(resolver.isBlacklisted(resolver.methodCacheKey(methBlack1, TestMethodsProxy.class))); ctrl.verify(); } }