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 <btell...@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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org