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]

Reply via email to