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/04/29 01:14:54 UTC

[james-project] 20/27: JAMES-3138 Cassandra test instumentation: inject failure after awaitOn

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 fc528ae112a211339616095d87b85a3366d9eb54
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sat Apr 25 11:52:28 2020 +0700

    JAMES-3138 Cassandra test instumentation: inject failure after awaitOn
    
    This enables synchronized failure injection. New behaviours can be
    written then injected at will!
---
 .../apache/james/backends/cassandra/Scenario.java  | 23 ++++++++++++++-----
 .../backends/cassandra/TestingSessionTest.java     | 26 ++++++++++++++++++++++
 .../cassandra/mail/CassandraACLMapperTest.java     |  6 +++--
 .../cassandra/mail/CassandraMailboxDAOTest.java    |  2 +-
 4 files changed, 49 insertions(+), 8 deletions(-)

diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/Scenario.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/Scenario.java
index 0d01c3e..f2f3682 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/Scenario.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/Scenario.java
@@ -41,10 +41,10 @@ public class Scenario {
 
         Behavior EXECUTE_NORMALLY = Session::executeAsync;
 
-        static Behavior awaitOn(Barrier barrier) {
+        static Behavior awaitOn(Barrier barrier, Behavior behavior) {
             return (session, statement) -> {
                 barrier.call();
-                return session.executeAsync(statement);
+                return behavior.execute(session, statement);
             };
         }
 
@@ -130,6 +130,19 @@ public class Scenario {
             }
         }
 
+        @FunctionalInterface
+        interface ComposeBehavior {
+            RequiresValidity then(Behavior behavior);
+
+            default RequiresValidity thenExecuteNormally() {
+                return then(Behavior.EXECUTE_NORMALLY);
+            }
+
+            default RequiresValidity thenFail() {
+                return then(Behavior.THROW);
+            }
+        }
+
         static RequiresValidity fail() {
             return validity -> statementPredicate -> new ExecutionHook(
                 statementPredicate,
@@ -144,10 +157,10 @@ public class Scenario {
                 validity);
         }
 
-        static RequiresValidity awaitOn(Barrier barrier) {
-            return validity -> statementPredicate -> new ExecutionHook(
+        static ComposeBehavior awaitOn(Barrier barrier) {
+            return behavior -> validity -> statementPredicate -> new ExecutionHook(
                 statementPredicate,
-                Behavior.awaitOn(barrier),
+                Behavior.awaitOn(barrier, behavior),
                 validity);
         }
     }
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSessionTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSessionTest.java
index bb08907..5140e14 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSessionTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSessionTest.java
@@ -209,6 +209,7 @@ class TestingSessionTest {
         Barrier barrier = new Barrier();
         cassandra.getConf()
             .registerScenario(awaitOn(barrier)
+                .thenExecuteNormally()
                 .times(1)
                 .whenQueryStartsWith("INSERT INTO schemaVersion"));
 
@@ -229,6 +230,7 @@ class TestingSessionTest {
         Barrier barrier = new Barrier();
         cassandra.getConf()
             .registerScenario(awaitOn(barrier)
+                .thenExecuteNormally()
                 .times(1)
                 .whenQueryStartsWith("INSERT INTO schemaVersion"));
 
@@ -251,6 +253,7 @@ class TestingSessionTest {
         Barrier barrier = new Barrier();
         cassandra.getConf()
             .registerScenario(awaitOn(barrier)
+                .thenExecuteNormally()
                 .times(1)
                 .whenQueryStartsWith("INSERT INTO schemaVersion"));
 
@@ -264,4 +267,27 @@ class TestingSessionTest {
         assertThat(dao.getCurrentSchemaVersion().block())
             .contains(newVersion);
     }
+
+    @Test
+    void awaitOnShouldBeAbleToInjectFailure(CassandraCluster cassandra) throws Exception {
+        SchemaVersion originalSchemaVersion = new SchemaVersion(32);
+        SchemaVersion newVersion = new SchemaVersion(36);
+
+        dao.updateVersion(originalSchemaVersion).block();
+        Barrier barrier = new Barrier();
+        cassandra.getConf()
+            .registerScenario(awaitOn(barrier)
+                .thenFail()
+                .times(1)
+                .whenQueryStartsWith("INSERT INTO schemaVersion"));
+
+        Mono<Void> operation = dao.updateVersion(newVersion).cache();
+
+        operation.subscribeOn(Schedulers.elastic()).subscribe();
+        barrier.awaitCaller();
+        barrier.releaseCaller();
+
+        assertThatThrownBy(operation::block)
+            .isInstanceOf(RuntimeException.class);
+    }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
index cf5a4ca..d6b66e9 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
@@ -164,8 +164,9 @@ class CassandraACLMapperTest {
         Barrier barrier = new Barrier(2);
         cassandra.getConf()
             .registerScenario(awaitOn(barrier)
-                    .times(2)
-                    .whenQueryStartsWith("SELECT acl,version FROM acl WHERE id=:id;"));
+                .thenExecuteNormally()
+                .times(2)
+                .whenQueryStartsWith("SELECT acl,version FROM acl WHERE id=:id;"));
 
         MailboxACL.EntryKey keyBob = new MailboxACL.EntryKey("bob", MailboxACL.NameType.user, false);
         MailboxACL.Rfc4314Rights rights = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read);
@@ -191,6 +192,7 @@ class CassandraACLMapperTest {
         Barrier barrier = new Barrier(2);
         cassandra.getConf()
             .registerScenario(awaitOn(barrier)
+                .thenExecuteNormally()
                 .times(2)
                 .whenQueryStartsWith("SELECT acl,version FROM acl WHERE id=:id;"));
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
index 3fc20cf..e2d3b2f 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
@@ -30,7 +30,6 @@ import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.Scenario;
 import org.apache.james.backends.cassandra.Scenario.Barrier;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
@@ -136,6 +135,7 @@ class CassandraMailboxDAOTest {
 
         Barrier barrier = new Barrier(2);
         cassandra.getConf().registerScenario(awaitOn(barrier)
+            .thenExecuteNormally()
             .times(2)
             .whenQueryStartsWith("UPDATE mailbox SET"));
 


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