You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2020/11/04 02:17:00 UTC
[james-project] 08/09: JAMES-3433 Tests enforcing Blob Store cache
usage
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 9150cbe81ec932c0d364d71ac45cce8718ebd2d4
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Nov 3 11:42:09 2020 +0700
JAMES-3433 Tests enforcing Blob Store cache usage
(When configured...)
---
.../org/apache/james/CassandraCacheQueryTest.java | 181 +++++++++++++++++++++
1 file changed, 181 insertions(+)
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraCacheQueryTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraCacheQueryTest.java
new file mode 100644
index 0000000..fcd326a
--- /dev/null
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraCacheQueryTest.java
@@ -0,0 +1,181 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.james.backends.cassandra.StatementRecorder;
+import org.apache.james.backends.cassandra.TestingSession;
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.init.SessionWithInitializedTablesFactory;
+import org.apache.james.blob.cassandra.cache.CassandraBlobCacheModule;
+import org.apache.james.core.Domain;
+import org.apache.james.mailbox.DefaultMailboxes;
+import org.apache.james.modules.MailboxProbeImpl;
+import org.apache.james.modules.protocols.ImapGuiceProbe;
+import org.apache.james.modules.protocols.SmtpGuiceProbe;
+import org.apache.james.util.MimeMessageUtil;
+import org.apache.james.util.Port;
+import org.apache.james.utils.DataProbeImpl;
+import org.apache.james.utils.GuiceProbe;
+import org.apache.james.utils.SMTPMessageSender;
+import org.apache.james.utils.SpoolerProbe;
+import org.apache.james.utils.TestIMAPClient;
+import org.apache.mailet.base.test.FakeMail;
+import org.awaitility.Awaitility;
+import org.awaitility.Duration;
+import org.awaitility.core.ConditionFactory;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import com.datastax.driver.core.Session;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Names;
+
+class CassandraCacheQueryTest {
+ private static class TestingSessionProbe implements GuiceProbe {
+ private final TestingSession testingSession;
+
+ @Inject
+ private TestingSessionProbe(TestingSession testingSession) {
+ this.testingSession = testingSession;
+ }
+
+ public TestingSession getTestingSession() {
+ return testingSession;
+ }
+ }
+
+ private static class TestingSessionModule extends AbstractModule {
+ @Override
+ protected void configure() {
+ Multibinder.newSetBinder(binder(), GuiceProbe.class)
+ .addBinding()
+ .to(TestingSessionProbe.class);
+
+ bind(Session.class)
+ .annotatedWith(Names.named("cache"))
+ .to(TestingSession.class);
+ bind(Session.class)
+ .to(TestingSession.class);
+ Multibinder.newSetBinder(binder(), CassandraModule.class).addBinding().toInstance(CassandraBlobCacheModule.MODULE);
+ }
+
+ @Provides
+ @Singleton
+ TestingSession provideSession(SessionWithInitializedTablesFactory factory) {
+ return new TestingSession(factory.get());
+ }
+ }
+
+ @RegisterExtension
+ static JamesServerExtension jamesServerExtension = WithCacheImmutableTest.baseExtensionBuilder()
+ .lifeCycle(JamesServerExtension.Lifecycle.PER_TEST)
+ .overrideServerModule(new TestingSessionModule())
+ .build();
+
+ private static final int MESSAGE_COUNT = 1;
+ private static final String JAMES_SERVER_HOST = "127.0.0.1";
+ private static final String DOMAIN = "apache.org";
+ private static final String JAMES_USER = "james-user@" + DOMAIN;
+ private static final String PASSWORD = "secret";
+ private static final String SENDER = "bob@apache.org";
+ private static final String UNICODE_BODY = "Unicode €uro symbol.";
+ private static final ConditionFactory CALMLY_AWAIT = Awaitility
+ .with().pollInterval(Duration.ONE_HUNDRED_MILLISECONDS)
+ .and().pollDelay(Duration.ONE_HUNDRED_MILLISECONDS)
+ .await();
+
+ private StatementRecorder statementRecorder;
+
+ @BeforeEach
+ void beforeEach(GuiceJamesServer server) throws Exception {
+ this.statementRecorder = new StatementRecorder();
+ server.getProbe(DataProbeImpl.class).fluent()
+ .addDomain(DOMAIN)
+ .addUser(JAMES_USER, PASSWORD);
+
+ MailboxProbeImpl mailboxProbe = server.getProbe(MailboxProbeImpl.class);
+ mailboxProbe.createMailbox("#private", JAMES_USER, DefaultMailboxes.INBOX);
+
+ server.getProbe(TestingSessionProbe.class).getTestingSession().printStatements();
+ server.getProbe(TestingSessionProbe.class).getTestingSession().recordStatements(statementRecorder);
+
+ sendAMail(server);
+ readAMail(server);
+ }
+
+ @Test
+ void deDuplicatingBlobStoreShouldNotClearCache() {
+ assertThat(statementRecorder.listExecutedStatements(
+ StatementRecorder.Selector.preparedStatementStartingWith("DELETE FROM blob_cache")))
+ .isEmpty();
+ }
+
+ @Test
+ void cacheShouldBeRead() {
+ assertThat(statementRecorder.listExecutedStatements(
+ StatementRecorder.Selector.preparedStatementStartingWith("SELECT * FROM blob_cache")))
+ .isNotEmpty();
+ }
+
+ private void readAMail(GuiceJamesServer server) throws IOException {
+ try (TestIMAPClient reader = new TestIMAPClient()) {
+ int imapPort = server.getProbe(ImapGuiceProbe.class).getImapPort();
+ reader.connect(JAMES_SERVER_HOST, imapPort)
+ .login(JAMES_USER, PASSWORD)
+ .select(TestIMAPClient.INBOX)
+ .awaitMessageCount(CALMLY_AWAIT, MESSAGE_COUNT);
+
+ assertThat(reader.readFirstMessage())
+ .contains(UNICODE_BODY);
+ }
+ }
+
+ private void sendAMail(GuiceJamesServer server) throws IOException, MessagingException {
+ Port smtpPort = server.getProbe(SmtpGuiceProbe.class).getSmtpPort();
+ try (SMTPMessageSender sender = new SMTPMessageSender(Domain.LOCALHOST.asString())) {
+ sender.connect(JAMES_SERVER_HOST, smtpPort);
+ MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream(
+ ClassLoader.getSystemResourceAsStream("eml/mail-containing-unicode-characters.eml"));
+
+ FakeMail.Builder mail = FakeMail.builder()
+ .name("test-unicode-body")
+ .sender(SENDER)
+ .recipient(JAMES_USER)
+ .mimeMessage(mimeMessage);
+
+ sender.sendMessage(mail);
+ }
+
+ CALMLY_AWAIT.until(() -> server.getProbe(SpoolerProbe.class).processingFinished());
+ }
+
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org