package org.axonframework.metrics;
import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricSet;
import org.apache.log4j.Appender;
import org.apache.log4j.Logger;
import org.axonframework.commandhandling.CommandMessage;
import org.axonframework.common.ReflectionUtils;
import org.axonframework.messaging.Message;
import org.axonframework.monitoring.MessageMonitor;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import java.lang.reflect.Field;
import java.util.Map;
import static org.axonframework.commandhandling.GenericCommandMessage.asCommandMessage;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
@RunWith(MockitoJUnitRunner.class)
public class PayloadTypeMessageMonitorWrapperTest<T extends MessageMonitor<Message<?>> & MetricSet> {
private static final CommandMessage<Object> STRING_MESSAGE = asCommandMessage("stringCommand");
private static final CommandMessage<Object> INTEGER_MESSAGE = asCommandMessage(1);
private PayloadTypeMessageMonitorWrapper<CapacityMonitor> testSubject;
private Class<CapacityMonitor> expectedMonitorClass;
private final Appender appender = mock(Appender.class);
private final Logger logger = Logger.getRootLogger();
@Before
public void setUp() throws Exception {
logger.addAppender(appender);
expectedMonitorClass = CapacityMonitor.class;
testSubject = new PayloadTypeMessageMonitorWrapper<>(CapacityMonitor::new);
}
@After
public void tearDown() throws Exception {
logger.removeAppender(appender);
}
@Test
public void testInstantiateMessageMonitorOfTypeMonitorOnMessageIngested() throws Exception {
Field payloadTypeMonitorsField = testSubject.getClass().getDeclaredField("payloadTypeMonitors");
payloadTypeMonitorsField.setAccessible(true);
String expectedMonitorName = STRING_MESSAGE.getPayloadType().getName();
testSubject.onMessageIngested(STRING_MESSAGE);
Map<String, T> payloadTypeMonitors = ReflectionUtils.getFieldValue(payloadTypeMonitorsField, testSubject);
assertTrue(payloadTypeMonitors.size() == 1);
MessageMonitor<Message<?>> messageMessageMonitor = payloadTypeMonitors.get(expectedMonitorName);
assertNotNull(messageMessageMonitor);
assertTrue(expectedMonitorClass.isInstance(messageMessageMonitor));
Map<String, Metric> resultMetrics = testSubject.getMetrics();
assertTrue(resultMetrics.size() == 1);
assertNotNull(resultMetrics.get(expectedMonitorName));
}
@Test
public void testInstantiatesOneMessageMonitorPerIngestedPayloadType() throws Exception {
Field payloadTypeMonitorsField = testSubject.getClass().getDeclaredField("payloadTypeMonitors");
payloadTypeMonitorsField.setAccessible(true);
String expectedStringMonitorName = STRING_MESSAGE.getPayloadType().getName();
String expectedIntegerMonitorName = INTEGER_MESSAGE.getPayloadType().getName();
testSubject.onMessageIngested(STRING_MESSAGE); // First unique payload type
testSubject.onMessageIngested(STRING_MESSAGE);
testSubject.onMessageIngested(INTEGER_MESSAGE); // Second unique payload type
Map<String, T> payloadTypeMonitors = ReflectionUtils.getFieldValue(payloadTypeMonitorsField, testSubject);
assertTrue(payloadTypeMonitors.size() == 2);
MessageMonitor<Message<?>> messageMessageMonitor = payloadTypeMonitors.get(expectedStringMonitorName);
assertNotNull(messageMessageMonitor);
assertTrue(expectedMonitorClass.isInstance(messageMessageMonitor));
messageMessageMonitor = payloadTypeMonitors.get(expectedIntegerMonitorName);
assertNotNull(messageMessageMonitor);
assertTrue(expectedMonitorClass.isInstance(messageMessageMonitor));
Map<String, Metric> resultMetrics = testSubject.getMetrics();
assertTrue(resultMetrics.size() == 2);
assertNotNull(resultMetrics.get(expectedStringMonitorName));
assertNotNull(resultMetrics.get(expectedStringMonitorName));
}
@Test
public void testMonitorNameFollowsGivenMonitorNameBuilderSpecifics() throws Exception {
String testPrefix = "additional-monitor-name.";
PayloadTypeMessageMonitorWrapper<CapacityMonitor> testSubject = new PayloadTypeMessageMonitorWrapper<>(
CapacityMonitor::new, payloadType -> testPrefix + payloadType.getName());
String expectedMonitorName = testPrefix + STRING_MESSAGE.getPayloadType().getName();
testSubject.onMessageIngested(STRING_MESSAGE);
Map<String, Metric> resultMetrics = testSubject.getMetrics();
assertTrue(resultMetrics.size() == 1);
assertNotNull(resultMetrics.get(expectedMonitorName));
}
}