This is an automated email from the ASF dual-hosted git repository. rcordier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit ecbd1c3b5df2fb8fd9f8cb36eadcd1eb5ca419fe Author: Benoit Tellier <[email protected]> AuthorDate: Fri Jul 24 11:30:05 2020 +0700 JAMES-3319 Tests for CassandraMailRepository blob deletion Tests are conducted out both on Deduplication & Passthrough BlobStores --- .../cassandra/mail/CassandraMessageDAOTest.java | 3 +- .../mailbox/cassandra/mail/utils/GuiceUtils.java | 2 +- .../blob/cassandra/CassandraBlobStoreFactory.java | 6 +- .../blob/cassandra/cache/CachedBlobStoreTest.java | 3 +- .../cassandra/CassandraMailRepositoryTest.java | 100 +++++++++++++++++---- ...aMailRepositoryWithFakeImplementationsTest.java | 6 +- .../RabbitMQMailQueueConfigurationChangeTest.java | 3 +- .../queue/rabbitmq/RabbitMQMailQueueTest.java | 3 +- 8 files changed, 96 insertions(+), 30 deletions(-) diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java index a58595c..7fa6f49 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java @@ -86,7 +86,8 @@ class CassandraMessageDAOTest { void setUp(CassandraCluster cassandra) { messageIdFactory = new CassandraMessageId.Factory(); messageId = messageIdFactory.generate(); - BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()); + BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()) + .passthrough(); HashBlobId.Factory blobIdFactory = new HashBlobId.Factory(); testee = new CassandraMessageDAO( cassandra.getConf(), diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java index 39e539d..a6d8883 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java @@ -59,7 +59,7 @@ public class GuiceUtils { return Modules.combine( binder -> binder.bind(MessageId.Factory.class).toInstance(messageIdFactory), binder -> binder.bind(BlobId.Factory.class).toInstance(new HashBlobId.Factory()), - binder -> binder.bind(BlobStore.class).toProvider(() -> CassandraBlobStoreFactory.forTesting(session)), + binder -> binder.bind(BlobStore.class).toProvider(() -> CassandraBlobStoreFactory.forTesting(session).passthrough()), binder -> binder.bind(Session.class).toInstance(session), binder -> binder.bind(CassandraTypesProvider.class).toInstance(typesProvider), binder -> binder.bind(CassandraConfiguration.class).toInstance(configuration), diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreFactory.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreFactory.java index f1d0576..5dc2d8f 100644 --- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreFactory.java +++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreFactory.java @@ -20,7 +20,6 @@ package org.apache.james.blob.cassandra; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; -import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.HashBlobId; import org.apache.james.server.blob.deduplication.BlobStoreFactory; @@ -28,14 +27,13 @@ import org.apache.james.server.blob.deduplication.BlobStoreFactory; import com.datastax.driver.core.Session; public class CassandraBlobStoreFactory { - public static BlobStore forTesting(Session session) { + public static BlobStoreFactory.RequireStoringStrategy forTesting(Session session) { HashBlobId.Factory blobIdFactory = new HashBlobId.Factory(); CassandraBucketDAO bucketDAO = new CassandraBucketDAO(blobIdFactory, session); CassandraDefaultBucketDAO defaultBucketDAO = new CassandraDefaultBucketDAO(session); CassandraDumbBlobStore dumbBlobStore = new CassandraDumbBlobStore(defaultBucketDAO, bucketDAO, CassandraConfiguration.DEFAULT_CONFIGURATION, BucketName.DEFAULT); return BlobStoreFactory.builder().dumbBlobStore(dumbBlobStore) .blobIdFactory(blobIdFactory) - .defaultBucketName() - .passthrough(); + .defaultBucketName(); } } diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CachedBlobStoreTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CachedBlobStoreTest.java index 34ed1be..bf0a405 100644 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CachedBlobStoreTest.java +++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CachedBlobStoreTest.java @@ -74,7 +74,8 @@ public class CachedBlobStoreTest implements BlobStoreContract { @BeforeEach void setUp(CassandraCluster cassandra) { - backend = CassandraBlobStoreFactory.forTesting(cassandra.getConf()); + backend = CassandraBlobStoreFactory.forTesting(cassandra.getConf()) + .passthrough(); CassandraCacheConfiguration cacheConfig = new CassandraCacheConfiguration.Builder() .sizeThresholdInBytes(EIGHT_KILOBYTES.length + 1) .timeOut(Duration.ofSeconds(60)) diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java index 0a3be14..3011e98 100644 --- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java +++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java @@ -19,6 +19,9 @@ package org.apache.james.mailrepository.cassandra; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; + import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.CassandraClusterExtension; import org.apache.james.backends.cassandra.components.CassandraModule; @@ -30,14 +33,16 @@ import org.apache.james.blob.cassandra.CassandraBlobModule; import org.apache.james.blob.cassandra.CassandraBlobStoreFactory; import org.apache.james.blob.mail.MimeMessageStore; import org.apache.james.mailrepository.MailRepositoryContract; +import org.apache.james.mailrepository.api.MailKey; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -class CassandraMailRepositoryTest implements MailRepositoryContract { +class CassandraMailRepositoryTest { static final MailRepositoryUrl URL = MailRepositoryUrl.from("proto://url"); static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); @@ -50,29 +55,86 @@ class CassandraMailRepositoryTest implements MailRepositoryContract { CassandraMailRepository cassandraMailRepository; + @Nested + class PassThroughTest implements MailRepositoryContract { + @BeforeEach + void setup(CassandraCluster cassandra) { + CassandraMailRepositoryMailDAO v1 = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider()); + CassandraMailRepositoryMailDaoV2 v2 = new CassandraMailRepositoryMailDaoV2(cassandra.getConf(), BLOB_ID_FACTORY); + CassandraMailRepositoryMailDaoAPI mailDAO = new MergingCassandraMailRepositoryMailDao(v1, v2); + CassandraMailRepositoryKeysDAO keysDAO = new CassandraMailRepositoryKeysDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION); + CassandraMailRepositoryCountDAO countDAO = new CassandraMailRepositoryCountDAO(cassandra.getConf()); + BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()) + .passthrough(); - @BeforeEach - void setup(CassandraCluster cassandra) { - CassandraMailRepositoryMailDAO v1 = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider()); - CassandraMailRepositoryMailDaoV2 v2 = new CassandraMailRepositoryMailDaoV2(cassandra.getConf(), BLOB_ID_FACTORY); - CassandraMailRepositoryMailDaoAPI mailDAO = new MergingCassandraMailRepositoryMailDao(v1, v2); - CassandraMailRepositoryKeysDAO keysDAO = new CassandraMailRepositoryKeysDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION); - CassandraMailRepositoryCountDAO countDAO = new CassandraMailRepositoryCountDAO(cassandra.getConf()); - BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()); + cassandraMailRepository = new CassandraMailRepository(URL, + keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobStore).mimeMessageStore()); + } - cassandraMailRepository = new CassandraMailRepository(URL, - keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobStore).mimeMessageStore()); - } + @Override + public MailRepository retrieveRepository() { + return cassandraMailRepository; + } + + @Test + @Disabled("key is unique in Cassandra") + @Override + public void sizeShouldBeIncrementedByOneWhenDuplicates() { + } + + @Disabled("Failing") + @Test + void removeShouldDeleteStoredBlobs(CassandraCluster cassandra) throws Exception { + MailRepository testee = retrieveRepository(); - @Override - public MailRepository retrieveRepository() { - return cassandraMailRepository; + MailKey key1 = testee.store(createMail(MAIL_1)); + + testee.remove(key1); + + assertThat(cassandra.getConf().execute("SELECT * FROM blobs;")) + .isEmpty(); + } } - @Test - @Disabled("key is unique in Cassandra") - @Override - public void sizeShouldBeIncrementedByOneWhenDuplicates() { + @Nested + class DeDuplicationTest implements MailRepositoryContract { + @BeforeEach + void setup(CassandraCluster cassandra) { + CassandraMailRepositoryMailDAO v1 = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider()); + CassandraMailRepositoryMailDaoV2 v2 = new CassandraMailRepositoryMailDaoV2(cassandra.getConf(), BLOB_ID_FACTORY); + CassandraMailRepositoryMailDaoAPI mailDAO = new MergingCassandraMailRepositoryMailDao(v1, v2); + CassandraMailRepositoryKeysDAO keysDAO = new CassandraMailRepositoryKeysDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION); + CassandraMailRepositoryCountDAO countDAO = new CassandraMailRepositoryCountDAO(cassandra.getConf()); + BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()) + .deduplication(); + + cassandraMailRepository = new CassandraMailRepository(URL, + keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobStore).mimeMessageStore()); + } + + @Override + public MailRepository retrieveRepository() { + return cassandraMailRepository; + } + + @Test + @Disabled("key is unique in Cassandra") + @Override + public void sizeShouldBeIncrementedByOneWhenDuplicates() { + } + + @Test + void removeShouldNotAffectMailsWithTheSameContent() throws Exception { + MailRepository testee = retrieveRepository(); + + MailKey key1 = testee.store(createMail(MAIL_1)); + MailKey key2 = testee.store(createMail(MAIL_2)); + + testee.remove(key1); + + assertThatCode(() -> testee.retrieve(key2)) + .doesNotThrowAnyException(); + } } } \ No newline at end of file diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java index 648a6e9..60f6ad9 100644 --- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java +++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java @@ -128,7 +128,8 @@ class CassandraMailRepositoryWithFakeImplementationsTest { FailingMailDAO mailDAO = new FailingMailDAO(); keysDAO = new CassandraMailRepositoryKeysDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION); CassandraMailRepositoryCountDAO countDAO = new CassandraMailRepositoryCountDAO(cassandra.getConf()); - BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()); + BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()) + .passthrough(); cassandraMailRepository = new CassandraMailRepository(URL, keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobStore).mimeMessageStore()); @@ -213,7 +214,8 @@ class CassandraMailRepositoryWithFakeImplementationsTest { CassandraMailRepositoryMailDaoAPI mailDAO = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider()); FailingKeysDAO keysDAO = new FailingKeysDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION); countDAO = new CassandraMailRepositoryCountDAO(cassandra.getConf()); - BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()); + BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()) + .passthrough(); cassandraMailRepository = new CassandraMailRepository(URL, keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobStore).mimeMessageStore()); diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java index a863ef8..6831937 100644 --- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java +++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java @@ -94,7 +94,8 @@ class RabbitMQMailQueueConfigurationChangeTest { @BeforeEach void setup(CassandraCluster cassandra) throws Exception { - BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()); + BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()) + .passthrough(); mimeMessageStoreFactory = MimeMessageStore.factory(blobStore); clock = new UpdatableTickingClock(IN_SLICE_1); mqManagementApi = new RabbitMQMailQueueManagement(rabbitMQExtension.managementAPI()); diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java index c6d0691..a8b044d 100644 --- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java +++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java @@ -702,7 +702,8 @@ class RabbitMQMailQueueTest { private void setUp(CassandraCluster cassandra, MailQueueMetricExtension.MailQueueMetricTestSystem metricTestSystem, RabbitMQMailQueueConfiguration configuration) throws Exception { - BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()); + BlobStore blobStore = CassandraBlobStoreFactory.forTesting(cassandra.getConf()) + .passthrough(); MimeMessageStore.Factory mimeMessageStoreFactory = MimeMessageStore.factory(blobStore); clock = new UpdatableTickingClock(IN_SLICE_1); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
