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 2020/02/27 08:56:38 UTC

[james-project] 01/05: JAMES-3062: EventDeadLetters containEvents()

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 624fdef9818f71bc1cd4172592da2a505e298503
Author: duc91 <du...@gmail.com>
AuthorDate: Fri Feb 21 16:08:23 2020 +0700

    JAMES-3062: EventDeadLetters containEvents()
---
 .../james/mailbox/events/EventDeadLetters.java     |  2 +
 .../mailbox/events/EventDeadLettersContract.java   | 48 ++++++++++++++++++++++
 .../mailbox/events/CassandraEventDeadLetters.java  |  6 +++
 .../events/CassandraEventDeadLettersDAO.java       | 12 ++++++
 .../events/CassandraEventDeadLettersDAOTest.java   | 40 ++++++++++++++++++
 .../events/CassandraEventDeadLettersTest.java      |  8 +---
 .../mailbox/events/MemoryEventDeadLetters.java     |  5 +++
 .../mailbox/events/MemoryEventDeadLettersTest.java |  9 +---
 8 files changed, 115 insertions(+), 15 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLetters.java b/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLetters.java
index 0e1c805..053ba45 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLetters.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLetters.java
@@ -95,4 +95,6 @@ public interface EventDeadLetters {
     Flux<InsertionId> failedIds(Group registeredGroup);
 
     Flux<Group> groupsWithFailedEvents();
+
+    Mono<Boolean> containEvents();
 }
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
index 74cc2f2..5929c11 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
@@ -438,4 +438,52 @@ interface EventDeadLettersContract {
             assertThat(eventDeadLetters.groupsWithFailedEvents().toStream()).isEmpty();
         }
     }
+
+    interface ContainEventsContract extends EventDeadLettersContract {
+        @Test
+        default void containEventsShouldReturnFalseOnNothingStored() {
+            EventDeadLetters eventDeadLetters = eventDeadLetters();
+
+            assertThat(eventDeadLetters.containEvents().block()).isFalse();
+        }
+
+        @Test
+        default void containEventsShouldReturnTrueOnStoredEvents() {
+            EventDeadLetters eventDeadLetters = eventDeadLetters();
+            eventDeadLetters.store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
+
+            assertThat(eventDeadLetters.containEvents().block()).isTrue();
+        }
+
+        @Test
+        default void containEventsShouldReturnFalseWhenRemoveAllStoredEvents() {
+            EventDeadLetters eventDeadLetters = eventDeadLetters();
+            eventDeadLetters.store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
+            eventDeadLetters.store(GROUP_A, EVENT_2, INSERTION_ID_2).block();
+
+            assertThat(eventDeadLetters.containEvents().block()).isTrue();
+
+            eventDeadLetters.remove(GROUP_A, INSERTION_ID_1).block();
+            eventDeadLetters.remove(GROUP_A, INSERTION_ID_2).block();
+
+            assertThat(eventDeadLetters.containEvents().block()).isFalse();
+        }
+
+        @Test
+        default void containEventsShouldReturnTrueWhenRemoveSomeStoredEvents() {
+            EventDeadLetters eventDeadLetters = eventDeadLetters();
+            eventDeadLetters.store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
+            eventDeadLetters.store(GROUP_A, EVENT_2, INSERTION_ID_2).block();
+
+            assertThat(eventDeadLetters.containEvents().block()).isTrue();
+
+            eventDeadLetters.remove(GROUP_A, INSERTION_ID_1).block();
+
+            assertThat(eventDeadLetters.containEvents().block()).isTrue();
+        }
+    }
+
+    interface AllContracts extends StoreContract, RemoveContract, FailedEventContract, FailedEventsContract, GroupsWithFailedEventsContract, ContainEventsContract {
+
+    }
 }
\ No newline at end of file
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java
index 920168c..97e4a8e 100644
--- a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java
@@ -31,6 +31,7 @@ public class CassandraEventDeadLetters implements EventDeadLetters {
     private final CassandraEventDeadLettersDAO cassandraEventDeadLettersDAO;
     private final CassandraEventDeadLettersGroupDAO cassandraEventDeadLettersGroupDAO;
 
+
     @Inject
     CassandraEventDeadLetters(CassandraEventDeadLettersDAO cassandraEventDeadLettersDAO,
                               CassandraEventDeadLettersGroupDAO cassandraEventDeadLettersGroupDAO) {
@@ -76,4 +77,9 @@ public class CassandraEventDeadLetters implements EventDeadLetters {
     public Flux<Group> groupsWithFailedEvents() {
         return cassandraEventDeadLettersGroupDAO.retrieveAllGroups();
     }
+
+    @Override
+    public Mono<Boolean> containEvents() {
+        return cassandraEventDeadLettersDAO.containEvents();
+    }
 }
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
index 0afe2ba..d9913ad 100644
--- a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
@@ -47,6 +47,7 @@ public class CassandraEventDeadLettersDAO {
     private final PreparedStatement deleteStatement;
     private final PreparedStatement selectEventStatement;
     private final PreparedStatement selectEventIdsWithGroupStatement;
+    private final PreparedStatement containEventsStatement;
 
     @Inject
     CassandraEventDeadLettersDAO(Session session, EventSerializer eventSerializer) {
@@ -56,6 +57,7 @@ public class CassandraEventDeadLettersDAO {
         this.deleteStatement = prepareDeleteStatement(session);
         this.selectEventStatement = prepareSelectEventStatement(session);
         this.selectEventIdsWithGroupStatement = prepareSelectInsertionIdsWithGroupStatement(session);
+        this.containEventsStatement = prepareContainEventStatement(session);
     }
 
     private PreparedStatement prepareInsertStatement(Session session) {
@@ -85,6 +87,12 @@ public class CassandraEventDeadLettersDAO {
             .where(eq(GROUP, bindMarker(GROUP))));
     }
 
+    private PreparedStatement prepareContainEventStatement(Session session) {
+        return session.prepare(select(EVENT)
+            .from(TABLE_NAME)
+            .limit(1));
+    }
+
     Mono<Void> store(Group group, Event failedEvent, EventDeadLetters.InsertionId insertionId) {
         return executor.executeVoid(insertStatement.bind()
                 .setString(GROUP, group.asString())
@@ -111,6 +119,10 @@ public class CassandraEventDeadLettersDAO {
             .map(row -> EventDeadLetters.InsertionId.of(row.getUUID(INSERTION_ID)));
     }
 
+    Mono<Boolean> containEvents() {
+        return executor.executeReturnExists(containEventsStatement.bind().setFetchSize(1));
+    }
+
     private Event deserializeEvent(String serializedEvent) {
         return eventSerializer.fromJson(serializedEvent).get();
     }
diff --git a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java
index 729c671..35ab39f 100644
--- a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java
+++ b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java
@@ -102,4 +102,44 @@ class CassandraEventDeadLettersDAOTest {
                 .collectList().block())
             .containsOnly(INSERTION_ID_1, INSERTION_ID_2, INSERTION_ID_3);
     }
+
+    @Test
+    void shouldReturnTrueWhenEventStored() {
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_1).block();
+        assertThat(cassandraEventDeadLettersDAO.containEvents().block()).isTrue();
+    }
+
+    @Test
+    void shouldReturnTrueWhenNoEventStored() {
+        assertThat(cassandraEventDeadLettersDAO.containEvents().block()).isFalse();
+    }
+
+    @Test
+    void shouldReturnTrueWhenEventsStoredAndRemovedSome() {
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_1).block();
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_2).block();
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_3).block();
+
+        assertThat(cassandraEventDeadLettersDAO.containEvents().block()).isTrue();
+
+        cassandraEventDeadLettersDAO.removeEvent(GROUP_B, INSERTION_ID_3).block();
+
+        assertThat(cassandraEventDeadLettersDAO.containEvents().block()).isTrue();
+    }
+
+    @Test
+    void shouldReturnFalseWhenRemovedAllEventsStored() {
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_1).block();
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_2).block();
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_3).block();
+
+        assertThat(cassandraEventDeadLettersDAO.containEvents().block()).isTrue();
+
+        cassandraEventDeadLettersDAO.removeEvent(GROUP_B, INSERTION_ID_3).block();
+        cassandraEventDeadLettersDAO.removeEvent(GROUP_B, INSERTION_ID_2).block();
+        cassandraEventDeadLettersDAO.removeEvent(GROUP_B, INSERTION_ID_1).block();
+
+        assertThat(cassandraEventDeadLettersDAO.containEvents().block()).isFalse();
+    }
+
 }
diff --git a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
index fce1ee7..9930e9f 100644
--- a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
+++ b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
@@ -22,19 +22,13 @@ package org.apache.james.mailbox.events;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.event.json.EventSerializer;
-import org.apache.james.mailbox.events.EventDeadLettersContract.FailedEventContract;
-import org.apache.james.mailbox.events.EventDeadLettersContract.FailedEventsContract;
-import org.apache.james.mailbox.events.EventDeadLettersContract.GroupsWithFailedEventsContract;
-import org.apache.james.mailbox.events.EventDeadLettersContract.RemoveContract;
-import org.apache.james.mailbox.events.EventDeadLettersContract.StoreContract;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-class CassandraEventDeadLettersTest implements StoreContract, RemoveContract, FailedEventContract, FailedEventsContract,
-    GroupsWithFailedEventsContract {
+class CassandraEventDeadLettersTest implements EventDeadLettersContract.AllContracts {
 
     @RegisterExtension
     static CassandraClusterExtension cassandraClusterExtension = new CassandraClusterExtension(CassandraEventDeadLettersModule.MODULE);
diff --git a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java b/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
index 3c8f423..cbf37ab 100644
--- a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
+++ b/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
@@ -83,4 +83,9 @@ public class MemoryEventDeadLetters implements EventDeadLetters {
             return Flux.fromIterable(ImmutableList.copyOf(deadLetters.rowKeySet()));
         }
     }
+
+    @Override
+    public Mono<Boolean> containEvents() {
+        return Mono.just(deadLetters.size() > 0);
+    }
 }
diff --git a/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersTest.java b/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersTest.java
index ab2c8a4..2ef0996 100644
--- a/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersTest.java
+++ b/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersTest.java
@@ -19,16 +19,9 @@
 
 package org.apache.james.mailbox.events;
 
-import static org.apache.james.mailbox.events.EventDeadLettersContract.FailedEventContract;
-import static org.apache.james.mailbox.events.EventDeadLettersContract.FailedEventsContract;
-import static org.apache.james.mailbox.events.EventDeadLettersContract.GroupsWithFailedEventsContract;
-import static org.apache.james.mailbox.events.EventDeadLettersContract.RemoveContract;
-import static org.apache.james.mailbox.events.EventDeadLettersContract.StoreContract;
-
 import org.junit.jupiter.api.BeforeEach;
 
-class MemoryEventDeadLettersTest implements StoreContract, RemoveContract, FailedEventContract, FailedEventsContract,
-    GroupsWithFailedEventsContract {
+class MemoryEventDeadLettersTest implements EventDeadLettersContract.AllContracts {
 
     private MemoryEventDeadLetters eventDeadLetters;
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org