/***********************************************************************************
* Copyright (c) 2013. Nickolay Gerilovich. Russia.
* Some Rights Reserved.
************************************************************************************/
package com.github.nickvl.xspring.core.log.aop;
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.BarService;
import com.github.nickvl.xspring.core.log.aop.service.ExtendedBarService;
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 log configuration on an extended class.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("AOPLoggerInheritanceTestCase-context.xml")
@DirtiesContext
public class AOPLoggerInheritanceTestCase {
private static final String[] A_PARAM_NAMES = new String[]{"aFirst", "aSecond"};
private static final String[] E_PARAM_NAMES = new String[]{"eFirst", "eSecond"};
private static final Object[] PARAM_VALUE = new Object[]{"@1", "@2"};
@Autowired
private AOPLogger aspect;
@Autowired
private BarService barService;
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();
}
private void expectExtendedBarServiceLogger() {
EasyMock.expect(logAdapter.getLog(ExtendedBarService.class)).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));
}
@Test
public void testInExtendedLogInSuperOnly() throws Exception {
EasyMock.replay(logAdapter, logger);
barService.inExtendedLogInSuperOnly("@1", "@2");
EasyMock.verify(logAdapter, logger);
}
@Test
public void testInAbstract() throws Exception {
expectExtendedBarServiceLogger();
Capture<ArgumentDescriptor> captured = new Capture<ArgumentDescriptor>();
EasyMock.expect(logAdapter.toMessage(eq("inAbstract"), aryEq(PARAM_VALUE), capture(captured))).andReturn(">");
EasyMock.expect(logAdapter.toMessage("inAbstract", 2, Void.TYPE)).andReturn("<");
expectInfoLogging();
EasyMock.replay(logAdapter, logger);
barService.inAbstract("@1", "@2");
assertParams(captured.getValue(), A_PARAM_NAMES, true, true);
EasyMock.verify(logAdapter, logger);
}
@Test
public void testInExtended() throws Exception {
expectExtendedBarServiceLogger();
Capture<ArgumentDescriptor> captured = new Capture<ArgumentDescriptor>();
EasyMock.expect(logAdapter.toMessage(eq("inExtended"), aryEq(PARAM_VALUE), capture(captured))).andReturn(">");
EasyMock.expect(logAdapter.toMessage("inExtended", 2, Void.TYPE)).andReturn("<");
expectDebugLogging();
EasyMock.replay(logAdapter, logger);
barService.inExtended("@1", "@2");
assertParams(captured.getValue(), E_PARAM_NAMES, true, true);
EasyMock.verify(logAdapter, logger);
}
@Test
public void testOoverridden() throws Exception {
expectExtendedBarServiceLogger();
Capture<ArgumentDescriptor> captured = new Capture<ArgumentDescriptor>();
EasyMock.expect(logAdapter.toMessage(eq("overridden"), aryEq(PARAM_VALUE), capture(captured))).andReturn(">");
EasyMock.expect(logAdapter.toMessage("overridden", 2, Void.TYPE)).andReturn("<");
expectDebugLogging();
EasyMock.replay(logAdapter, logger);
barService.overridden("@1", "@2");
assertParams(captured.getValue(), E_PARAM_NAMES, false, true);
EasyMock.verify(logAdapter, logger);
}
@Test
public void testOverriddenLogInAbstractOnly() throws Exception {
EasyMock.replay(logAdapter, logger);
barService.overriddenLogInAbstractOnly("@1", "@2");
EasyMock.verify(logAdapter, logger);
}
}