package com.github.triceo.splitlog; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import org.assertj.core.api.Assertions; import org.junit.Test; import com.github.triceo.splitlog.api.LogWatch; import com.github.triceo.splitlog.api.Message; import com.github.triceo.splitlog.api.MessageDeliveryStatus; import com.github.triceo.splitlog.api.MessageMeasure; import com.github.triceo.splitlog.api.MessageMetric; public class DefaultMessageMetricTest extends DefaultFollowerBaseTest { private static final MessageMeasure<Integer, LogWatch> DEFAULT_MEASURE = new MessageMeasure<Integer, LogWatch>() { @Override public Integer initialValue() { return 1; } @Override public Integer update(final MessageMetric<Integer, LogWatch> metric, final Message evaluate, final MessageDeliveryStatus status, final LogWatch source) { final Integer value = metric.getValue(); return value + 2; } }; private static final MessageBuilder MESSAGE = new MessageBuilder("test"); @Test public void testGetMeasure() { final MessageMetric<Integer, LogWatch> metric = new DefaultMessageMetric<>(this.getLogWatch(), DefaultMessageMetricTest.DEFAULT_MEASURE); Assertions.assertThat(metric.getMeasure()).isSameAs(DefaultMessageMetricTest.DEFAULT_MEASURE); } @Test public void testIncreases() { final LogWatch watch = this.getLogWatch(); final DefaultMessageMetric<Integer, LogWatch> metric = (DefaultMessageMetric<Integer, LogWatch>) watch.startMeasuring(DefaultMessageMetricTest.DEFAULT_MEASURE, "test"); Assertions.assertThat(metric.getMessageCount(null)).isEqualTo(0); Assertions.assertThat(metric.getValue(null)).isEqualTo(1); Assertions.assertThat(metric.getMessageCount()).isEqualTo(0); Assertions.assertThat(metric.getValue()).isEqualTo(1); final Message one = DefaultMessageMetricTest.MESSAGE.buildFinal(); metric.messageReceived(one, MessageDeliveryStatus.ACCEPTED, watch); Assertions.assertThat(metric.getMessageCount()).isEqualTo(1); Assertions.assertThat(metric.getValue()).isEqualTo(3); final Message two = DefaultMessageMetricTest.MESSAGE.buildFinal(); metric.messageReceived(two, MessageDeliveryStatus.ACCEPTED, watch); Assertions.assertThat(metric.getMessageCount()).isEqualTo(2); Assertions.assertThat(metric.getValue()).isEqualTo(5); // test history Assertions.assertThat(metric.getMessageCount(one)).isEqualTo(1); Assertions.assertThat(metric.getValue(one)).isEqualTo(3); Assertions.assertThat(metric.getMessageCount(two)).isEqualTo(2); Assertions.assertThat(metric.getValue(two)).isEqualTo(5); final Message none = DefaultMessageMetricTest.MESSAGE.buildFinal(); Assertions.assertThat(metric.getMessageCount(none)).isEqualTo(-1); Assertions.assertThat(metric.getValue(none)).isNull(); } @Test(expected = IllegalArgumentException.class) public void testNullConstructor() { new DefaultMessageMetric<Integer, LogWatch>(this.getLogWatch(), null); } @Test public void testWaiting() { final LogWatch watch = this.getLogWatch(); // placeholder final DefaultMessageMetric<Integer, LogWatch> metric = (DefaultMessageMetric<Integer, LogWatch>) watch.startMeasuring(DefaultMessageMetricTest.DEFAULT_MEASURE, "test"); Assertions.assertThat(metric.getValue()).isEqualTo(1); metric.messageReceived(DefaultMessageMetricTest.MESSAGE.buildFinal(), MessageDeliveryStatus.ACCEPTED, watch); Assertions.assertThat(metric.getValue()).isEqualTo(3); // prepare the waiting final Future<Message> result = metric.expect(evaluate -> evaluate.getValue() == 7); // this message will only increase the metric metric.messageReceived(DefaultMessageMetricTest.MESSAGE.buildFinal(), MessageDeliveryStatus.ACCEPTED, watch); // this message will put metric over threshold final Message expected = DefaultMessageMetricTest.MESSAGE.buildFinal(); metric.messageReceived(expected, MessageDeliveryStatus.ACCEPTED, watch); // and this message will, once again, do nothing; no one is waiting metric.messageReceived(DefaultMessageMetricTest.MESSAGE.buildFinal(), MessageDeliveryStatus.ACCEPTED, watch); try { Assertions.assertThat(result.get(10, TimeUnit.SECONDS)).isEqualTo(expected); } catch (final Exception e1) { Assertions.fail("Metric condition not triggered.", e1); } Assertions.assertThat(metric.getValue()).isEqualTo(9); } }