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