This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 9ac287782796fd71b639b59f066791838791fb50 Author: datph <[email protected]> AuthorDate: Tue Apr 2 18:12:17 2019 +0700 JAMES-2706 Refactor MailQueueMetricExtension with non-mock metrics --- metrics/metrics-tests/pom.xml | 8 +-- .../james/metrics/tests/RecordingMetric.java | 2 +- .../metrics/tests/RecordingMetricFactory.java | 32 +++++++--- .../james/metrics/tests/RecordingTimeMetric.java | 4 +- .../metrics/tests/RecordingMetricFactoryTest.java | 64 ++++++++++++-------- server/queue/queue-activemq/pom.xml | 10 ++++ .../queue/activemq/ActiveMQMailQueueBlobTest.java | 4 +- .../queue/activemq/ActiveMQMailQueueTest.java | 6 +- server/queue/queue-api/pom.xml | 5 ++ .../james/queue/api/MailQueueMetricContract.java | 69 +++++++++++++++------- .../james/queue/api/MailQueueMetricExtension.java | 54 ++--------------- server/queue/queue-jms/pom.xml | 10 ++++ .../apache/james/queue/jms/JMSMailQueueTest.java | 2 +- server/queue/queue-rabbitmq/pom.xml | 10 ++++ .../queue/rabbitmq/RabbitMQMailQueueTest.java | 3 +- 15 files changed, 165 insertions(+), 118 deletions(-) diff --git a/metrics/metrics-tests/pom.xml b/metrics/metrics-tests/pom.xml index 3ad0b3b..a9214a4 100644 --- a/metrics/metrics-tests/pom.xml +++ b/metrics/metrics-tests/pom.xml @@ -42,14 +42,14 @@ <artifactId>metrics-api</artifactId> </dependency> <dependency> - <groupId>com.jayway.awaitility</groupId> - <artifactId>awaitility</artifactId> - </dependency> - <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> <dependency> + <groupId>com.github.steveash.guavate</groupId> + <artifactId>guavate</artifactId> + </dependency> + <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> diff --git a/metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingMetric.java b/metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingMetric.java index 97bef5d..915f81b 100644 --- a/metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingMetric.java +++ b/metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingMetric.java @@ -26,7 +26,7 @@ import org.apache.james.metrics.api.Metric; public class RecordingMetric implements Metric { private final String name; - private AtomicInteger value; + private final AtomicInteger value; private final Consumer<Integer> publishCallback; public RecordingMetric(String name, Consumer<Integer> publishCallback) { diff --git a/metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingMetricFactory.java b/metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingMetricFactory.java index 6fec18b..7127816 100644 --- a/metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingMetricFactory.java +++ b/metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingMetricFactory.java @@ -21,41 +21,55 @@ package org.apache.james.metrics.tests; import java.time.Duration; import java.util.Collection; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.james.metrics.api.Metric; import org.apache.james.metrics.api.MetricFactory; import org.apache.james.metrics.api.TimeMetric; -import com.google.common.collect.HashMultimap; +import com.github.steveash.guavate.Guavate; +import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; public class RecordingMetricFactory implements MetricFactory { - private final Multimap<String, Duration> executionTimesInMs = Multimaps.synchronizedSetMultimap(HashMultimap.create()); - private final ConcurrentHashMap<String, Integer> executionValues = new ConcurrentHashMap<>(); + private final Multimap<String, Duration> executionTimes = Multimaps.synchronizedListMultimap(ArrayListMultimap.create()); + private final ConcurrentHashMap<String, Integer> counters = new ConcurrentHashMap<>(); @Override public Metric generate(String name) { - return new RecordingMetric(name, executionValue -> executionValues.put(name, executionValue)); + return new RecordingMetric(name, executionValue -> counters.put(name, executionValue)); } @Override public TimeMetric timer(String name) { return new RecordingTimeMetric(name, executionTime -> { - synchronized (executionTimesInMs) { - executionTimesInMs.put(name, executionTime); + synchronized (executionTimes) { + executionTimes.put(name, executionTime); } }); } public Collection<Duration> executionTimesFor(String name) { - synchronized (executionTimesInMs) { - return executionTimesInMs.get(name); + synchronized (executionTimes) { + return executionTimes.get(name); + } + } + + public Multimap<String, Duration> executionTimesForPrefixName(String prefixName) { + synchronized (executionTimes) { + return Multimaps.filterKeys(executionTimes, key -> key.startsWith(prefixName)); } } public int countFor(String name) { - return executionValues.getOrDefault(name, 0); + return counters.getOrDefault(name, 0); + } + + public Map<String, Integer> countForPrefixName(String prefixName) { + return counters.entrySet().stream() + .filter(entry -> entry.getKey().startsWith(prefixName)) + .collect(Guavate.toImmutableMap(Map.Entry::getKey, Map.Entry::getValue)); } } diff --git a/metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingTimeMetric.java b/metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingTimeMetric.java index ea19cd7..87ed8bb 100644 --- a/metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingTimeMetric.java +++ b/metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingTimeMetric.java @@ -44,8 +44,8 @@ public class RecordingTimeMetric implements TimeMetric { @Override public long stopAndPublish() { - long elapsed = stopwatch.elapsed(TimeUnit.MILLISECONDS); - publishCallback.accept(Duration.ofMillis(elapsed)); + long elapsed = stopwatch.elapsed(TimeUnit.NANOSECONDS); + publishCallback.accept(Duration.ofNanos(elapsed)); return elapsed; } } diff --git a/metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricFactoryTest.java b/metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricFactoryTest.java index f2de003..9365774 100644 --- a/metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricFactoryTest.java +++ b/metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricFactoryTest.java @@ -19,23 +19,23 @@ package org.apache.james.metrics.tests; -import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; +import java.time.Duration; +import java.util.concurrent.atomic.AtomicInteger; + import org.apache.james.metrics.api.Metric; +import org.apache.james.metrics.api.TimeMetric; +import org.apache.james.util.concurrency.ConcurrentTestRunner; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import com.jayway.awaitility.Duration; -import com.jayway.awaitility.core.ConditionFactory; - class RecordingMetricFactoryTest { private static final String TIME_METRIC_NAME = "timerMetric"; private static final String METRIC_NAME = "metric"; private static final java.time.Duration ONE_SECOND = java.time.Duration.ofSeconds(1); private static final java.time.Duration FIVE_SECONDS = java.time.Duration.ofSeconds(5); - private static final ConditionFactory WAIT_CONDITION = await().timeout(Duration.ONE_MINUTE); private RecordingMetricFactory testee; @@ -45,17 +45,39 @@ class RecordingMetricFactoryTest { } @Test - void executionTimesForATimeMetricShouldBeStoreMultipleTime() { - runTimeMetric(ONE_SECOND); - runTimeMetric(FIVE_SECONDS); - - WAIT_CONDITION - .until(() -> { - assertThat(testee.executionTimesFor(TIME_METRIC_NAME)) - .hasSize(2); - assertThat(testee.executionTimesFor(TIME_METRIC_NAME)) - .contains(ONE_SECOND, FIVE_SECONDS); - }); + void executionTimesForATimeMetricShouldBeStoreMultipleTime() throws InterruptedException { + TimeMetric timeMetric1 = testee.timer(TIME_METRIC_NAME); + Thread.sleep(ONE_SECOND.toMillis()); + timeMetric1.stopAndPublish(); + + TimeMetric timeMetric2 = testee.timer(TIME_METRIC_NAME); + Thread.sleep(FIVE_SECONDS.toMillis()); + timeMetric2.stopAndPublish(); + + assertThat(testee.executionTimesFor(TIME_METRIC_NAME)) + .hasSize(2); + + assertThat(testee.executionTimesFor(TIME_METRIC_NAME)) + .element(0) + .satisfies(duration -> assertThat(duration).isGreaterThanOrEqualTo(ONE_SECOND)); + + assertThat(testee.executionTimesFor(TIME_METRIC_NAME)) + .element(1) + .satisfies(duration -> assertThat(duration).isGreaterThanOrEqualTo(FIVE_SECONDS)); + } + + @Test + void executionTimesForATimeMetricShouldBeStoreMultipleTimeInConcurrent() throws Exception { + AtomicInteger count = new AtomicInteger(); + + ConcurrentTestRunner.builder() + .operation((threadNumber, step) -> testee.runPublishingTimerMetric(TIME_METRIC_NAME, count::incrementAndGet)) + .threadCount(10) + .operationCount(200) + .runSuccessfullyWithin(Duration.ofSeconds(10)); + + assertThat(testee.executionTimesFor(TIME_METRIC_NAME)) + .hasSize(2000); } @Test @@ -89,14 +111,4 @@ class RecordingMetricFactoryTest { assertThat(testee.countFor(METRIC_NAME)) .isEqualTo(5); } - - private void runTimeMetric(java.time.Duration duration) { - testee.runPublishingTimerMetric(TIME_METRIC_NAME, () -> { - try { - Thread.sleep(duration.toMillis()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }); - } } diff --git a/server/queue/queue-activemq/pom.xml b/server/queue/queue-activemq/pom.xml index 8ec6f12..6c13fb7 100644 --- a/server/queue/queue-activemq/pom.xml +++ b/server/queue/queue-activemq/pom.xml @@ -83,6 +83,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>${james.groupId}</groupId> + <artifactId>metrics-tests</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <scope>test</scope> @@ -92,6 +97,11 @@ <artifactId>guava</artifactId> </dependency> <dependency> + <groupId>com.jayway.awaitility</groupId> + <artifactId>awaitility</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> </dependency> diff --git a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java index 98284d8..f6baa55 100644 --- a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java +++ b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java @@ -24,7 +24,6 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.time.Duration; import java.time.temporal.ChronoUnit; import org.apache.activemq.ActiveMQConnectionFactory; @@ -50,7 +49,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.threeten.extra.Years; @ExtendWith(BrokerExtension.class) @Tag(BrokerExtension.STATISTICS) @@ -73,7 +71,7 @@ public class ActiveMQMailQueueBlobTest implements DelayedManageableMailQueueCont connectionFactory.setBlobTransferPolicy(policy); RawMailQueueItemDecoratorFactory mailQueueItemDecoratorFactory = new RawMailQueueItemDecoratorFactory(); - MetricFactory metricFactory = metricTestSystem.getSpyMetricFactory(); + MetricFactory metricFactory = metricTestSystem.getMetricFactory(); GaugeRegistry gaugeRegistry = metricTestSystem.getSpyGaugeRegistry(); String queueName = BrokerExtension.generateRandomQueueName(broker); mailQueue = new ActiveMQMailQueue(connectionFactory, mailQueueItemDecoratorFactory, queueName, USE_BLOB, metricFactory, gaugeRegistry); diff --git a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java index df671ab..a4a7512 100644 --- a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java +++ b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java @@ -50,17 +50,17 @@ public class ActiveMQMailQueueTest implements DelayedManageableMailQueueContract ActiveMQMailQueue mailQueue; @BeforeEach - public void setUp(BrokerService broker, MailQueueMetricExtension.MailQueueMetricTestSystem metricTestSystem) throws Exception { + public void setUp(BrokerService broker, MailQueueMetricExtension.MailQueueMetricTestSystem metricTestSystem) { ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?create=false"); RawMailQueueItemDecoratorFactory mailQueueItemDecoratorFactory = new RawMailQueueItemDecoratorFactory(); - MetricFactory metricFactory = metricTestSystem.getSpyMetricFactory(); + MetricFactory metricFactory = metricTestSystem.getMetricFactory(); GaugeRegistry gaugeRegistry = metricTestSystem.getSpyGaugeRegistry(); String queueName = BrokerExtension.generateRandomQueueName(broker); mailQueue = new ActiveMQMailQueue(connectionFactory, mailQueueItemDecoratorFactory, queueName, !USE_BLOB, metricFactory, gaugeRegistry); } @AfterEach - public void tearDown() throws Exception { + public void tearDown() { mailQueue.dispose(); } diff --git a/server/queue/queue-api/pom.xml b/server/queue/queue-api/pom.xml index 5b6dbad..c1fdf43 100644 --- a/server/queue/queue-api/pom.xml +++ b/server/queue/queue-api/pom.xml @@ -69,6 +69,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>${james.groupId}</groupId> + <artifactId>metrics-tests</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueMetricContract.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueMetricContract.java index a367946..96bc150 100644 --- a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueMetricContract.java +++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueMetricContract.java @@ -19,7 +19,11 @@ package org.apache.james.queue.api; +import static org.apache.james.queue.api.MailQueue.DEQUEUED_METRIC_NAME_PREFIX; +import static org.apache.james.queue.api.MailQueue.ENQUEUED_METRIC_NAME_PREFIX; +import static org.apache.james.queue.api.MailQueue.ENQUEUED_TIMER_METRIC_NAME_PREFIX; import static org.apache.james.queue.api.Mails.defaultMail; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -30,13 +34,13 @@ import javax.mail.MessagingException; import org.apache.james.metrics.api.Gauge; import org.apache.mailet.base.test.FakeMail; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import com.github.fge.lambdas.Throwing; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -66,7 +70,7 @@ public interface MailQueueMetricContract extends MailQueueContract { } @Test - default void constructorShouldRegisterGetQueueSizeGauge(MailQueueMetricExtension.MailQueueMetricTestSystem testSystem) throws Exception { + default void constructorShouldRegisterGetQueueSizeGauge(MailQueueMetricExtension.MailQueueMetricTestSystem testSystem) { enQueueMail(3); ArgumentCaptor<Gauge<?>> gaugeCaptor = ArgumentCaptor.forClass(Gauge.class); @@ -74,51 +78,76 @@ public interface MailQueueMetricContract extends MailQueueContract { Mockito.verifyNoMoreInteractions(testSystem.getSpyGaugeRegistry()); Gauge<?> registeredGauge = gaugeCaptor.getValue(); - Assertions.assertThat(registeredGauge.get()).isEqualTo(3L); + assertThat(registeredGauge.get()).isEqualTo(3L); } @Test - default void enqueueShouldIncreaseEnQueueMetric(MailQueueMetricExtension.MailQueueMetricTestSystem testSystem) throws Exception { + default void enqueueShouldIncreaseEnQueueMetric(MailQueueMetricExtension.MailQueueMetricTestSystem testSystem) { enQueueMail(2); - verify(testSystem.getSpyEnqueuedMailsMetric(), times(2)).increment(); - Mockito.verifyNoMoreInteractions(testSystem.getSpyEnqueuedMailsMetric()); + assertThat(testSystem.getMetricFactory().countForPrefixName(ENQUEUED_METRIC_NAME_PREFIX)) + .hasSize(1) + .satisfies(values -> { + assertThat(values.values()).hasSize(1); + assertThat(values.values()).element(0).isEqualTo(2); + }); } @Test - default void enqueueShouldNotTouchDequeueMetric(MailQueueMetricExtension.MailQueueMetricTestSystem testSystem) throws Exception { + default void enqueueShouldNotTouchDequeueMetric(MailQueueMetricExtension.MailQueueMetricTestSystem testSystem) { enQueueMail(2); - verify(testSystem.getSpyEnqueuedMailsMetric(), times(2)).increment(); - Mockito.verifyNoMoreInteractions(testSystem.getSpyDequeuedMailsMetric()); + assertThat(testSystem.getMetricFactory().countForPrefixName(ENQUEUED_METRIC_NAME_PREFIX)) + .hasSize(1) + .satisfies(values -> { + assertThat(values.values()).hasSize(1); + assertThat(values.values()).element(0).isEqualTo(2); + }); + assertThat(testSystem.getMetricFactory().countForPrefixName(DEQUEUED_METRIC_NAME_PREFIX)) + .hasSize(0); } @Test - default void dequeueShouldIncreaseDequeueMetric(MailQueueMetricExtension.MailQueueMetricTestSystem testSystem) throws Exception { + default void dequeueShouldIncreaseDequeueMetric(MailQueueMetricExtension.MailQueueMetricTestSystem testSystem) { enQueueMail(2); deQueueMail(2); - verify(testSystem.getSpyDequeuedMailsMetric(), times(2)).increment(); - Mockito.verifyNoMoreInteractions(testSystem.getSpyDequeuedMailsMetric()); + assertThat(testSystem.getMetricFactory().countForPrefixName(DEQUEUED_METRIC_NAME_PREFIX)) + .hasSize(1) + .satisfies(values -> { + assertThat(values.values()).hasSize(1); + assertThat(values.values()).element(0).isEqualTo(2); + }); } @Test - default void dequeueShouldNotTouchEnqueueMetric(MailQueueMetricExtension.MailQueueMetricTestSystem testSystem) throws Exception { + default void dequeueShouldNotTouchEnqueueMetric(MailQueueMetricExtension.MailQueueMetricTestSystem testSystem) { enQueueMail(2); deQueueMail(2); - verify(testSystem.getSpyDequeuedMailsMetric(), times(2)).increment(); - Mockito.verifyNoMoreInteractions(testSystem.getSpyDequeuedMailsMetric()); - - verify(testSystem.getSpyEnqueuedMailsMetric(), times(2)).increment(); - Mockito.verifyNoMoreInteractions(testSystem.getSpyEnqueuedMailsMetric()); + assertThat(testSystem.getMetricFactory().countForPrefixName(DEQUEUED_METRIC_NAME_PREFIX)) + .hasSize(1) + .satisfies(values -> { + assertThat(values.values()).hasSize(1); + assertThat(values.values()).element(0).isEqualTo(2); + }); + assertThat(testSystem.getMetricFactory().countForPrefixName(ENQUEUED_METRIC_NAME_PREFIX)) + .hasSize(1) + .satisfies(values -> { + assertThat(values.values()).hasSize(1); + assertThat(values.values()).element(0).isEqualTo(2); + }); } @Test - default void enqueueShouldPublishEnqueueTimeMetric(MailQueueMetricExtension.MailQueueMetricTestSystem testSystem) throws Exception { + default void enqueueShouldPublishEnqueueTimeMetric(MailQueueMetricExtension.MailQueueMetricTestSystem testSystem) { enQueueMail(2); - verify(testSystem.getSpyEnqueuedMailsTimeMetric(), times(2)).stopAndPublish(); + assertThat(testSystem.getMetricFactory().executionTimesForPrefixName(ENQUEUED_TIMER_METRIC_NAME_PREFIX)) + .satisfies(executionMap -> { + assertThat(executionMap.keySet()).hasSize(1); + assertThat(executionMap.values()).hasSize(2); + }); } } diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueMetricExtension.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueMetricExtension.java index 93f8896..192ff38 100644 --- a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueMetricExtension.java +++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueMetricExtension.java @@ -19,19 +19,9 @@ package org.apache.james.queue.api; -import static org.apache.james.queue.api.MailQueue.DEQUEUED_METRIC_NAME_PREFIX; -import static org.apache.james.queue.api.MailQueue.ENQUEUED_METRIC_NAME_PREFIX; -import static org.apache.james.queue.api.MailQueue.ENQUEUED_TIMER_METRIC_NAME_PREFIX; -import static org.mockito.ArgumentMatchers.startsWith; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - import org.apache.james.metrics.api.GaugeRegistry; -import org.apache.james.metrics.api.Metric; -import org.apache.james.metrics.api.MetricFactory; import org.apache.james.metrics.api.NoopGaugeRegistry; -import org.apache.james.metrics.api.NoopMetricFactory; -import org.apache.james.metrics.api.TimeMetric; +import org.apache.james.metrics.tests.RecordingMetricFactory; import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.ParameterContext; @@ -42,60 +32,28 @@ import org.mockito.Mockito; public class MailQueueMetricExtension implements BeforeEachCallback, ParameterResolver { public class MailQueueMetricTestSystem { - private final Metric spyEnqueuedMailsMetric; - private final Metric spyDequeuedMailsMetric; - private final TimeMetric spyEnqueuedMailsTimeMetric; - private final TimeMetric spyDequeuedMailsTimeMetric; private final GaugeRegistry spyGaugeRegistry; - private final MetricFactory spyMetricFactory; + private final RecordingMetricFactory metricFactory; public MailQueueMetricTestSystem() { - spyEnqueuedMailsMetric = spy(new NoopMetricFactory.NoopMetric()); - spyDequeuedMailsMetric = spy(new NoopMetricFactory.NoopMetric()); - spyEnqueuedMailsTimeMetric = spy(new NoopMetricFactory.NoopTimeMetric()); - spyDequeuedMailsTimeMetric = spy(new NoopMetricFactory.NoopTimeMetric()); spyGaugeRegistry = Mockito.spy(new NoopGaugeRegistry()); - spyMetricFactory = Mockito.spy(new NoopMetricFactory()); - } - - public Metric getSpyEnqueuedMailsMetric() { - return spyEnqueuedMailsMetric; - } - - public Metric getSpyDequeuedMailsMetric() { - return spyDequeuedMailsMetric; + metricFactory = new RecordingMetricFactory(); } public GaugeRegistry getSpyGaugeRegistry() { return spyGaugeRegistry; } - public MetricFactory getSpyMetricFactory() { - return spyMetricFactory; - } - - public TimeMetric getSpyEnqueuedMailsTimeMetric() { - return spyEnqueuedMailsTimeMetric; - } - - public TimeMetric getSpyDequeuedMailsTimeMetric() { - return spyDequeuedMailsTimeMetric; + public RecordingMetricFactory getMetricFactory() { + return metricFactory; } } private MailQueueMetricTestSystem testSystem; @Override - public void beforeEach(ExtensionContext extensionContext) throws Exception { + public void beforeEach(ExtensionContext extensionContext) { testSystem = new MailQueueMetricTestSystem(); - - when(testSystem.spyMetricFactory.generate(startsWith(ENQUEUED_METRIC_NAME_PREFIX))) - .thenReturn(testSystem.spyEnqueuedMailsMetric); - when(testSystem.spyMetricFactory.generate(startsWith(DEQUEUED_METRIC_NAME_PREFIX))) - .thenReturn(testSystem.spyDequeuedMailsMetric); - - when(testSystem.spyMetricFactory.timer(startsWith(ENQUEUED_TIMER_METRIC_NAME_PREFIX))) - .thenReturn(testSystem.spyEnqueuedMailsTimeMetric); } @Override diff --git a/server/queue/queue-jms/pom.xml b/server/queue/queue-jms/pom.xml index b446fa4..c862b6e 100644 --- a/server/queue/queue-jms/pom.xml +++ b/server/queue/queue-jms/pom.xml @@ -82,6 +82,11 @@ <artifactId>metrics-api</artifactId> </dependency> <dependency> + <groupId>${james.groupId}</groupId> + <artifactId>metrics-tests</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <scope>test</scope> @@ -91,6 +96,11 @@ <artifactId>guava</artifactId> </dependency> <dependency> + <groupId>com.jayway.awaitility</groupId> + <artifactId>awaitility</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> </dependency> diff --git a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java index a39de8a..a31ed09 100644 --- a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java +++ b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java @@ -49,7 +49,7 @@ public class JMSMailQueueTest implements DelayedManageableMailQueueContract, Pri void setUp(BrokerService broker, MailQueueMetricExtension.MailQueueMetricTestSystem metricTestSystem) { ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?create=false"); RawMailQueueItemDecoratorFactory mailQueueItemDecoratorFactory = new RawMailQueueItemDecoratorFactory(); - MetricFactory metricFactory = metricTestSystem.getSpyMetricFactory(); + MetricFactory metricFactory = metricTestSystem.getMetricFactory(); GaugeRegistry gaugeRegistry = metricTestSystem.getSpyGaugeRegistry(); String queueName = BrokerExtension.generateRandomQueueName(broker); mailQueue = new JMSMailQueue(connectionFactory, mailQueueItemDecoratorFactory, queueName, metricFactory, gaugeRegistry); diff --git a/server/queue/queue-rabbitmq/pom.xml b/server/queue/queue-rabbitmq/pom.xml index aa59f09..5c31864 100644 --- a/server/queue/queue-rabbitmq/pom.xml +++ b/server/queue/queue-rabbitmq/pom.xml @@ -116,6 +116,11 @@ <artifactId>metrics-api</artifactId> </dependency> <dependency> + <groupId>${james.groupId}</groupId> + <artifactId>metrics-tests</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> @@ -144,6 +149,11 @@ <artifactId>guava</artifactId> </dependency> <dependency> + <groupId>com.jayway.awaitility</groupId> + <artifactId>awaitility</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> </dependency> diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java index 20678fe..dd9b53d 100644 --- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java +++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java @@ -62,6 +62,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import com.github.fge.lambdas.Throwing; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -115,7 +116,7 @@ public class RabbitMQMailQueueTest implements ManageableMailQueueContract, MailQ RabbitClient rabbitClient = new RabbitClient(rabbitMQExtension.getRabbitChannelPool()); RabbitMQMailQueueFactory.PrivateFactory factory = new RabbitMQMailQueueFactory.PrivateFactory( - metricTestSystem.getSpyMetricFactory(), + metricTestSystem.getMetricFactory(), metricTestSystem.getSpyGaugeRegistry(), rabbitClient, mimeMessageStoreFactory, --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
