You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2018/01/18 02:49:12 UTC
[04/10] james-project git commit: JAMES-2285 Contracts for delayed
mail queues
JAMES-2285 Contracts for delayed mail queues
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/afcdc543
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/afcdc543
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/afcdc543
Branch: refs/heads/master
Commit: afcdc5438e29e99e046edf0fbcc4208bcaab6296
Parents: ce04905
Author: benwa <bt...@linagora.com>
Authored: Thu Jan 11 11:42:41 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Thu Jan 18 09:48:49 2018 +0700
----------------------------------------------------------------------
.../queue/api/DelayedMailQueueContract.java | 117 +++++++++++++++++++
.../api/DelayedManageableMailQueueContract.java | 79 +++++++++++++
.../james/queue/jms/JMSMailQueueTest.java | 21 +++-
3 files changed, 215 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/afcdc543/server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedMailQueueContract.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedMailQueueContract.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedMailQueueContract.java
new file mode 100644
index 0000000..6f28311
--- /dev/null
+++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedMailQueueContract.java
@@ -0,0 +1,117 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.queue.api;
+
+import static org.apache.james.queue.api.Mails.defaultMail;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import com.github.fge.lambdas.Throwing;
+import com.google.common.base.Stopwatch;
+
+@ExtendWith(ExecutorExtension.class)
+public interface DelayedMailQueueContract {
+
+ MailQueue getMailQueue();
+
+ @Test
+ default void enqueueShouldDelayMailsWhenSpecified(ExecutorService executorService) throws Exception {
+ getMailQueue().enQueue(defaultMail()
+ .build(),
+ 2L,
+ TimeUnit.SECONDS);
+
+ Future<?> future = executorService.submit(Throwing.runnable(() -> getMailQueue().deQueue()));
+ assertThatThrownBy(() -> future.get(1, TimeUnit.SECONDS))
+ .isInstanceOf(TimeoutException.class);
+ }
+
+ @Test
+ default void enqueueWithNegativeDelayShouldNotDelayDelivery(ExecutorService executorService) throws Exception {
+ getMailQueue().enQueue(defaultMail()
+ .build(),
+ -30L,
+ TimeUnit.SECONDS);
+
+ Future<?> future = executorService.submit(Throwing.runnable(() -> getMailQueue().deQueue()));
+ future.get(1, TimeUnit.SECONDS);
+ }
+
+ @Test
+ default void enqueueWithReasonablyLongDelayShouldDelayMail(ExecutorService executorService) throws Exception {
+ getMailQueue().enQueue(defaultMail()
+ .build(),
+ 365*1000,
+ TimeUnit.DAYS);
+
+ Future<?> future = executorService.submit(Throwing.runnable(() -> getMailQueue().deQueue()));
+ assertThatThrownBy(() -> future.get(1, TimeUnit.SECONDS))
+ .isInstanceOf(TimeoutException.class);
+ }
+
+ @Test
+ default void enqueueWithVeryLongDelayShouldDelayMail(ExecutorService executorService) throws Exception {
+ getMailQueue().enQueue(defaultMail()
+ .build(),
+ Long.MAX_VALUE / (3600 * 24),
+ TimeUnit.DAYS);
+
+ Future<?> future = executorService.submit(Throwing.runnable(() -> getMailQueue().deQueue()));
+ assertThatThrownBy(() -> future.get(1, TimeUnit.SECONDS))
+ .isInstanceOf(TimeoutException.class);
+ }
+
+ @Test
+ default void delayedMailCanBeRetrievedFromTheQueue() throws Exception {
+ getMailQueue().enQueue(defaultMail()
+ .name("name1")
+ .build(),
+ 1L,
+ TimeUnit.SECONDS);
+
+ MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+ assertThat(mailQueueItem.getMail().getName()).isEqualTo("name1");
+ }
+
+ @Test
+ default void delayShouldAtLeastBeTheOneSpecified() throws Exception {
+ long delay = 1L;
+ TimeUnit unit = TimeUnit.SECONDS;
+ Stopwatch started = Stopwatch.createStarted();
+
+ getMailQueue().enQueue(defaultMail()
+ .build(),
+ delay,
+ unit);
+
+ getMailQueue().deQueue();
+ assertThat(started.elapsed(TimeUnit.MILLISECONDS))
+ .isGreaterThan(unit.toMillis(delay));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/afcdc543/server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedManageableMailQueueContract.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedManageableMailQueueContract.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedManageableMailQueueContract.java
new file mode 100644
index 0000000..1397bbf
--- /dev/null
+++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedManageableMailQueueContract.java
@@ -0,0 +1,79 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.queue.api;
+
+import static org.apache.james.queue.api.Mails.defaultMail;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.mailet.Mail;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+@ExtendWith(ExecutorExtension.class)
+public interface DelayedManageableMailQueueContract extends DelayedMailQueueContract, ManageableMailQueueContract {
+
+ ManageableMailQueue getManageableMailQueue();
+
+ @Test
+ default void flushShouldRemoveDelays(ExecutorService executorService) throws Exception {
+ getManageableMailQueue().enQueue(defaultMail()
+ .name("name1")
+ .build(),
+ 30L,
+ TimeUnit.SECONDS);
+
+ getManageableMailQueue().flush();
+
+ Future<MailQueue.MailQueueItem> tryDequeue = executorService.submit(() -> getManageableMailQueue().deQueue());
+ assertThat(tryDequeue.get(1, TimeUnit.SECONDS).getMail().getName())
+ .isEqualTo("name1");
+ }
+
+ @Test
+ default void flushShouldPreserveBrowseOrder() throws Exception {
+ getManageableMailQueue().enQueue(defaultMail()
+ .name("name1")
+ .build());
+
+ getManageableMailQueue().enQueue(defaultMail()
+ .name("name2")
+ .build(),
+ 30L,
+ TimeUnit.SECONDS);
+
+ getManageableMailQueue().enQueue(defaultMail()
+ .name("name3")
+ .build(),
+ 2L,
+ TimeUnit.SECONDS);
+
+ getManageableMailQueue().flush();
+
+ assertThat(getManageableMailQueue().browse())
+ .extracting(ManageableMailQueue.MailQueueItemView::getMail)
+ .extracting(Mail::getName)
+ .containsExactly("name1", "name2", "name3");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/afcdc543/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java
----------------------------------------------------------------------
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 59b616e..8f9e39c 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
@@ -19,6 +19,8 @@
package org.apache.james.queue.jms;
+import java.util.concurrent.ExecutorService;
+
import javax.jms.ConnectionFactory;
import org.apache.activemq.ActiveMQConnectionFactory;
@@ -26,9 +28,9 @@ import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.broker.region.policy.PolicyEntry;
import org.apache.activemq.broker.region.policy.PolicyMap;
import org.apache.james.metrics.api.NoopMetricFactory;
+import org.apache.james.queue.api.DelayedManageableMailQueueContract;
import org.apache.james.queue.api.MailQueue;
import org.apache.james.queue.api.ManageableMailQueue;
-import org.apache.james.queue.api.ManageableMailQueueContract;
import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -37,7 +39,7 @@ import org.junit.jupiter.api.Test;
import com.google.common.collect.ImmutableList;
-public class JMSMailQueueTest implements ManageableMailQueueContract {
+public class JMSMailQueueTest implements DelayedManageableMailQueueContract {
private final static String QUEUE_NAME = "test";
@@ -114,4 +116,19 @@ public class JMSMailQueueTest implements ManageableMailQueueContract {
public void removeByRecipientShouldRemoveSpecificEmailWhenMultipleRecipients() {
}
+
+ @Test
+ @Override
+ @Disabled("JAMES-2308 Flushing JMS mail queue randomly re-order them" +
+ "Random test failing around 1% of the time")
+ public void flushShouldPreserveBrowseOrder() {
+
+ }
+
+ @Test
+ @Override
+ @Disabled("JAMES-2309 Long overflow in JMS delays")
+ public void enqueueWithVeryLongDelayShouldDelayMail(ExecutorService executorService) {
+
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org