1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package net.grinder.engine.process;
23
24 import static java.lang.System.arraycopy;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertSame;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
30 import static org.mockito.Mockito.withSettings;
31
32 import java.lang.reflect.Method;
33 import java.util.ArrayList;
34 import java.util.List;
35
36 import net.grinder.testutility.RandomObjectFactory;
37
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.mockito.Mock;
41 import org.mockito.MockitoAnnotations;
42 import org.mockito.invocation.InvocationOnMock;
43 import org.mockito.listeners.InvocationListener;
44 import org.mockito.listeners.MethodInvocationReport;
45 import org.slf4j.Logger;
46 import org.slf4j.Marker;
47
48
49
50
51
52
53
54 public class TestExternalLogger {
55
56 @Mock private Logger m_delegate;
57 @Mock private ThreadContextLocator m_threadContextLocator;
58 @Mock private ThreadContext m_threadContext;
59 @Mock private Marker m_marker;
60
61 @Before public void setUp() {
62 MockitoAnnotations.initMocks(this);
63 }
64
65 @Test public void testGetName() {
66 final Logger logger =
67 new ExternalLogger(m_delegate, m_threadContextLocator);
68
69 when(m_delegate.getName()).thenReturn("foo");
70
71 assertEquals("foo", logger.getName());
72 }
73
74 @Test public void testDelegateMethodsTakingNoMarker() throws Exception {
75
76 when(m_threadContextLocator.get()).thenReturn(m_threadContext);
77 when(m_threadContext.getLogMarker()).thenReturn(m_marker);
78
79 final List<InvocationOnMock> invocations =
80 new ArrayList<InvocationOnMock>();
81
82 final InvocationListener listeners = new InvocationListener() {
83 public void reportInvocation(MethodInvocationReport report) {
84 invocations.add((InvocationOnMock) report.getInvocation());
85 }
86 };
87
88 final Logger delegate =
89 mock(Logger.class, withSettings().invocationListeners(listeners));
90
91 final ExternalLogger logger =
92 new ExternalLogger(delegate, m_threadContextLocator);
93
94 final Method[] allMethods = Logger.class.getDeclaredMethods();
95
96 for (Method m : allMethods) {
97 final Class<?>[] parameterTypes = m.getParameterTypes();
98
99 if (parameterTypes.length > 0 && parameterTypes[0].equals(Marker.class)) {
100 continue;
101 }
102
103 final Class<?>[] delegateTypes = new Class<?>[parameterTypes.length + 1];
104
105 delegateTypes[0] = Marker.class;
106 arraycopy(parameterTypes, 0, delegateTypes, 1, parameterTypes.length);
107
108 final Method delegateMethod;
109 try {
110 delegateMethod = Logger.class.getMethod(m.getName(), delegateTypes);
111 }
112 catch (NoSuchMethodException e) {
113 continue;
114 }
115
116 final RandomObjectFactory randomObjectFactory = new RandomObjectFactory();
117
118 final List<Object> parameters = new ArrayList<Object>();
119
120 for (Class<?> type : parameterTypes) {
121 parameters.add(randomObjectFactory.generateParameter(type));
122 }
123
124 m.invoke(logger, parameters.toArray());
125
126 final InvocationOnMock invocation = invocations.remove(0);
127
128 assertEquals(delegateMethod, invocation.getMethod());
129
130 int i = 0;
131 final Object[] invokedArguments = invocation.getArguments();
132
133 assertSame(m_marker, invokedArguments[0]);
134
135 for (Object p : parameters) {
136 assertSame(p, invokedArguments[++i]);
137 }
138 }
139
140 assertEquals(0, invocations.size());
141 }
142
143 @Test public void testGetMarkerNullContext() {
144 final Logger logger =
145 new ExternalLogger(m_delegate, m_threadContextLocator);
146
147 logger.isTraceEnabled();
148
149 verify(m_delegate).isTraceEnabled(null);
150 }
151 }