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 de85ed1c5386e616b61648c6c4c8aec6ac223da3 Author: Tran Tien Duc <[email protected]> AuthorDate: Thu Dec 12 14:58:55 2019 +0700 JAMES-3007 Improve RecordingMetricFactory to satisfy the contract --- .../apache/james/metrics/tests/RecordingMetric.java | 19 ++++++++++--------- .../james/metrics/tests/RecordingMetricFactory.java | 13 +++++++++---- .../metrics/tests/RecordingMetricFactoryTest.java | 6 ------ .../james/metrics/tests/RecordingMetricTest.java | 6 +----- .../james/queue/api/MailQueueMetricContract.java | 6 +++++- 5 files changed, 25 insertions(+), 25 deletions(-) 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 78baea4..e004e86 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 @@ -20,37 +20,38 @@ package org.apache.james.metrics.tests; import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; import org.apache.james.metrics.api.Metric; public class RecordingMetric implements Metric { private final AtomicInteger value; - private final Consumer<Integer> publishCallback; - public RecordingMetric(Consumer<Integer> publishCallback) { - this.value = new AtomicInteger(); - this.publishCallback = publishCallback; + RecordingMetric() { + this(new AtomicInteger()); + } + + RecordingMetric(AtomicInteger value) { + this.value = value; } @Override public void increment() { - publishCallback.accept(value.incrementAndGet()); + value.incrementAndGet(); } @Override public void decrement() { - publishCallback.accept(value.decrementAndGet()); + value.decrementAndGet(); } @Override public void add(int i) { - publishCallback.accept(value.addAndGet(i)); + value.addAndGet(i); } @Override public void remove(int i) { - publishCallback.accept(value.addAndGet(-1 * i)); + value.addAndGet(-1 * i); } @Override 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 f18b9a6..24438d5 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 @@ -23,6 +23,7 @@ import java.time.Duration; import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.james.metrics.api.Metric; import org.apache.james.metrics.api.MetricFactory; @@ -35,11 +36,15 @@ import com.google.common.collect.Multimaps; public class RecordingMetricFactory implements MetricFactory { private final Multimap<String, Duration> executionTimes = Multimaps.synchronizedListMultimap(ArrayListMultimap.create()); - private final ConcurrentHashMap<String, Integer> counters = new ConcurrentHashMap<>(); + private final ConcurrentHashMap<String, AtomicInteger> counters = new ConcurrentHashMap<>(); @Override public Metric generate(String name) { - return new RecordingMetric(executionValue -> counters.put(name, executionValue)); + return new RecordingMetric(atomicCounterFor(name)); + } + + private AtomicInteger atomicCounterFor(String name) { + return counters.computeIfAbsent(name, currentName -> new AtomicInteger()); } @Override @@ -64,12 +69,12 @@ public class RecordingMetricFactory implements MetricFactory { } public int countFor(String name) { - return counters.getOrDefault(name, 0); + return atomicCounterFor(name).get(); } 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)); + .collect(Guavate.toImmutableMap(Map.Entry::getKey, e -> e.getValue().get())); } } 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 066d33b..eb39585 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 @@ -30,7 +30,6 @@ import org.apache.james.metrics.api.MetricFactoryContract; 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.Disabled; import org.junit.jupiter.api.Test; class RecordingMetricFactoryTest implements MetricFactoryContract { @@ -52,11 +51,6 @@ class RecordingMetricFactoryTest implements MetricFactoryContract { return testee; } - @Disabled("Current RecordingMetricFactory doesn't support this") - @Override - public void generateWithSameNameShouldReturnMetricsWithCorrelatedCounter() { - } - @Test void executionTimesForATimeMetricShouldBeStoreMultipleTime() throws InterruptedException { TimeMetric timeMetric1 = testee.timer(TIME_METRIC_NAME); diff --git a/metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricTest.java b/metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricTest.java index 8b45440..682fa31 100644 --- a/metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricTest.java +++ b/metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricTest.java @@ -19,21 +19,17 @@ package org.apache.james.metrics.tests; -import java.util.function.Consumer; - import org.apache.james.metrics.api.Metric; import org.apache.james.metrics.api.MetricContract; import org.junit.jupiter.api.BeforeEach; class RecordingMetricTest implements MetricContract { - private static final Consumer<Integer> NO_CALLBACK = counterValue -> {}; - private RecordingMetric testee; @BeforeEach void setUp() { - testee = new RecordingMetric(NO_CALLBACK); + testee = new RecordingMetric(); } @Override 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 96bc150..aa210ea 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 @@ -104,7 +104,11 @@ public interface MailQueueMetricContract extends MailQueueContract { assertThat(values.values()).element(0).isEqualTo(2); }); assertThat(testSystem.getMetricFactory().countForPrefixName(DEQUEUED_METRIC_NAME_PREFIX)) - .hasSize(0); + .hasSize(1) + .satisfies(values -> { + assertThat(values.values()).hasSize(1); + assertThat(values.values()).element(0).isEqualTo(0); + }); } @Test --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
