/***********************************************************************************
* Copyright (c) 2013. Nickolay Gerilovich. Russia.
* Some Rights Reserved.
************************************************************************************/
package com.github.nickvl.xspring.core.log.aop;
import java.io.IOException;
import java.util.Arrays;
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.FooService;
import com.github.nickvl.xspring.core.log.aop.service.SimpleFooService;
import static com.github.nickvl.xspring.core.log.aop.TestSupportUtility.arrayEqual;
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;
import static org.junit.Assert.fail;
/**
* Tests check logging annotation parameters.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("AOPLoggerTestCase-context.xml")
@DirtiesContext
public class AOPLoggerTestCase {
@Autowired
private AOPLogger aspect;
@Autowired
private FooService fooService;
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 testLogDebugBothVoidMethodZero() throws Exception {
expectSimpleFooServiceLogger();
Capture<ArgumentDescriptor> captured = new Capture<ArgumentDescriptor>();
EasyMock.expect(logAdapter.toMessage(eq("voidMethodZero"), aryEq(new Object[]{}), capture(captured))).andReturn(">");
EasyMock.expect(logAdapter.toMessage(eq("voidMethodZero"), eq(0), eq(Void.TYPE))).andReturn("<");
EasyMock.expect(logger.isDebugEnabled()).andReturn(true);
logger.debug(">");
EasyMock.expect(logger.isTraceEnabled()).andReturn(true);
logger.trace("<");
EasyMock.replay(logAdapter, logger);
fooService.voidMethodZero();
assertParams(captured.getValue(), null);
EasyMock.verify(logAdapter, logger);
}
@Test
public void testLogDebugBothVoidMethodOne() throws Exception {
EasyMock.replay(logAdapter, logger);
fooService.stringMethodOne("@1");
EasyMock.verify(logAdapter, logger);
}
@Test
public void testLogDebugBothStringMethodTwoLp() throws Exception {
expectSimpleFooServiceLogger();
Capture<ArgumentDescriptor> captured = new Capture<ArgumentDescriptor>();
EasyMock.expect(logAdapter.toMessage(eq("stringMethodTwo"), aryEq(new Object[]{"@1", "@2"}), capture(captured))).andReturn(">");
EasyMock.expect(logAdapter.toMessage(eq("stringMethodTwo"), eq(2), eq("stringMethodTwo:@1:@2"))).andReturn("<");
EasyMock.expect(logger.isDebugEnabled()).andReturn(true);
logger.debug(">");
EasyMock.expect(logger.isDebugEnabled()).andReturn(true);
logger.debug("<");
EasyMock.replay(logAdapter, logger);
String res = fooService.stringMethodTwo("@1", "@2");
assertEquals("stringMethodTwo:@1:@2", res);
assertParams(captured.getValue(), new String[]{"first", "second"}, false, true);
EasyMock.verify(logAdapter, logger);
}
@Test
public void testLogDebugBothStringMethodThreeAll() throws Exception {
expectSimpleFooServiceLogger();
Capture<ArgumentDescriptor> captured = new Capture<ArgumentDescriptor>();
EasyMock.expect(logAdapter.toMessage(eq("stringMethodThree"), aryEq(new Object[]{"@1", "@2", "@3"}), capture(captured))).andReturn(">");
EasyMock.expect(logAdapter.toMessage(eq("stringMethodThree"), eq(3), eq("stringMethodThree:@1:@2:@3"))).andReturn("<");
EasyMock.expect(logger.isDebugEnabled()).andReturn(true);
logger.debug(">");
EasyMock.expect(logger.isDebugEnabled()).andReturn(true);
logger.debug("<");
EasyMock.replay(logAdapter, logger);
String res = fooService.stringMethodThree("@1", "@2", "@3");
assertEquals("stringMethodThree:@1:@2:@3", res);
assertParams(captured.getValue(), new String[]{"first", "second", "third"}, true, true, true);
EasyMock.verify(logAdapter, logger);
}
@Test
public void testLogTraceBothStringMethodTwoVarargsLp() throws Exception {
expectSimpleFooServiceLogger();
String[] secondArgValue = {"@2-1", "@2-2"};
Capture<ArgumentDescriptor> captured = new Capture<ArgumentDescriptor>();
EasyMock.expect(logAdapter.toMessage(eq("stringMethodTwoVarargs"), arrayEqual(new Object[]{"@1", new String[]{"@2-1", "@2-2"}}), capture(captured))).andReturn(">");
EasyMock.expect(logAdapter.toMessage(eq("stringMethodTwoVarargs"), eq(2), eq("stringMethodTwoVarargs:@1:" + Arrays.toString(secondArgValue)))).andReturn("<");
EasyMock.expect(logger.isTraceEnabled()).andReturn(true);
logger.trace(">");
EasyMock.expect(logger.isTraceEnabled()).andReturn(true);
logger.trace("<");
EasyMock.replay(logAdapter, logger);
String res = fooService.stringMethodTwoVarargs("@1", "@2-1", "@2-2");
assertEquals("stringMethodTwoVarargs:@1:" + Arrays.toString(secondArgValue), res);
assertParams(captured.getValue(), new String[]{"first", "second"}, false, true);
EasyMock.verify(logAdapter, logger);
}
@Test
public void testLogDebugBothVoidExcMethodZero() throws Exception {
expectSimpleFooServiceLogger();
Capture<ArgumentDescriptor> captured = new Capture<ArgumentDescriptor>();
EasyMock.expect(logAdapter.toMessage(eq("voidExcMethodZero"), aryEq(new Object[]{}), capture(captured))).andReturn(">");
EasyMock.expect(logAdapter.toMessage(eq("voidExcMethodZero"), eq(0), EasyMock.anyObject(IOException.class), eq(false))).andReturn("io thrown");
EasyMock.expect(logger.isDebugEnabled()).andReturn(true);
logger.debug(">");
EasyMock.expect(logger.isWarnEnabled()).andReturn(true);
logger.warn("io thrown");
EasyMock.replay(logAdapter, logger);
try {
fooService.voidExcMethodZero();
fail("IOException is expected");
} catch (IOException e) {
assertEquals("io fail", e.getMessage());
}
assertParams(captured.getValue(), null);
EasyMock.verify(logAdapter, logger);
}
private void expectSimpleFooServiceLogger() {
EasyMock.expect(logAdapter.getLog(SimpleFooService.class)).andReturn(logger);
}
private void assertParams(ArgumentDescriptor descriptor, String[] names, boolean... indexes) {
assertArrayEquals(names, descriptor.getNames());
for (int i = 0; i < indexes.length; i++) {
assertEquals(indexes[i], descriptor.isArgumentIndex(i));
}
assertEquals(-1, descriptor.nextArgumentIndex(indexes.length));
}
}