/*********************************************************************************** * Copyright (c) 2013. Nickolay Gerilovich. Russia. * Some Rights Reserved. ************************************************************************************/ package com.github.nickvl.xspring.core.log.aop; import javax.annotation.Resource; import org.apache.commons.logging.Log; import org.easymock.Capture; import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.github.nickvl.xspring.core.log.aop.service.AuxBazService; import com.github.nickvl.xspring.core.log.aop.service.BazService; import com.github.nickvl.xspring.core.log.aop.service.GeneralBazService; import static org.easymock.EasyMock.aryEq; import static org.easymock.EasyMock.capture; import static org.easymock.EasyMock.eq; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; /** * Tests check that two different classes of the same interface: * <ul> * <li>has independent log configurations,</li> * <li>a log annotation on a class does not apply for inherited methods</li> * </ul> */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("AOPLoggerInheritanceAnnotatedClassTestCase-context.xml") @DirtiesContext public class AOPLoggerInheritanceAnnotatedClassTestCase { private static final String[] G_PARAM_NAMES = new String[]{"gFirst", "gSecond"}; private static final String[] X_PARAM_NAMES = new String[]{"xFirst", "xSecond"}; private static final Object[] PARAM_VALUE = new Object[]{"@1", "@2"}; @Autowired private AOPLogger aspect; @Resource(name = "generalBaz") private BazService bazService; @Resource(name = "auxBaz") private BazService auxBazService; private LogAdapter logAdapter; private Log logger; @Before public void setUp() throws Exception { logAdapter = EasyMock.createMock(LogAdapter.class); logger = EasyMock.createMock(Log.class); aspect.setLogAdapter(logAdapter); aspect.afterPropertiesSet(); } @Test public void testGeneralBazInImpl() throws Exception { expectSimpleBarServiceLogger(GeneralBazService.class); Capture<ArgumentDescriptor> captured = new Capture<ArgumentDescriptor>(); EasyMock.expect(logAdapter.toMessage(eq("inImpl"), aryEq(PARAM_VALUE), capture(captured))).andReturn(">"); EasyMock.expect(logAdapter.toMessage("inImpl", 2, Void.TYPE)).andReturn("<"); expectInfoLogging(); EasyMock.replay(logAdapter, logger); bazService.inImpl("@1", "@2"); assertParams(captured.getValue(), G_PARAM_NAMES, true, true); EasyMock.verify(logAdapter, logger); } @Test public void testGeneralBazInAbstract() throws Exception { EasyMock.replay(logAdapter, logger); bazService.inAbstract("@1", "@2"); EasyMock.verify(logAdapter, logger); } @Test public void testAuxBazInImpl() throws Exception { expectSimpleBarServiceLogger(AuxBazService.class); Capture<ArgumentDescriptor> captured = new Capture<ArgumentDescriptor>(); EasyMock.expect(logAdapter.toMessage(eq("inImpl"), aryEq(PARAM_VALUE), capture(captured))).andReturn(">"); EasyMock.expect(logAdapter.toMessage("inImpl", 2, Void.TYPE)).andReturn("<"); expectDebugLogging(); EasyMock.replay(logAdapter, logger); auxBazService.inImpl("@1", "@2"); assertParams(captured.getValue(), X_PARAM_NAMES, true, true); EasyMock.verify(logAdapter, logger); } @Test public void testAuxBazInAbstract() throws Exception { EasyMock.replay(logAdapter, logger); auxBazService.inAbstract("@1", "@2"); EasyMock.verify(logAdapter, logger); } private void expectSimpleBarServiceLogger(Class<?> clazz) { EasyMock.expect(logAdapter.getLog(clazz)).andReturn(logger); } private void expectInfoLogging() { EasyMock.expect(logger.isInfoEnabled()).andReturn(true); logger.info(">"); EasyMock.expect(logger.isInfoEnabled()).andReturn(true); logger.info("<"); } private void expectDebugLogging() { EasyMock.expect(logger.isDebugEnabled()).andReturn(true); logger.debug(">"); EasyMock.expect(logger.isDebugEnabled()).andReturn(true); logger.debug("<"); } private void assertParams(ArgumentDescriptor descriptor, String[] names, boolean first, boolean second) { assertArrayEquals(names, descriptor.getNames()); assertEquals(first, descriptor.isArgumentIndex(0)); assertEquals(second, descriptor.isArgumentIndex(1)); } }