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 2019/05/15 07:42:06 UTC

[james-project] branch master updated (6e7ae94 -> f31eedc)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.


    from 6e7ae94  JAMES-2768 make DelaysAndMaxRetry logs more clear
     new 72ccea5  JAMES-2754 add docker tests and smtp hosts system for deploiement validation
     new 4261609  JAMES-2754 add validate deployment test with mail sent with smtp
     new 1657eba  JAMES-2754 run JamesMailSpooler on init
     new 055f274  JAMES-2756 SimpleMessageSearchIndex doesn't decode header values before searching
     new f31eedc  JAMES-2756 MessageSearcher should decode value before searching

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../mailbox/store/search/MessageSearches.java      | 53 ++++++++----
 .../search/AbstractMessageSearchIndexTest.java     | 12 +++
 mailbox/store/src/test/resources/eml/mail.eml      |  2 +-
 mailbox/store/src/test/resources/eml/mail.json     |  6 +-
 .../api/{Continuation.java => DomainAdder.java}    | 13 ++-
 .../java/org/apache/james/mpt/api/UserAdder.java   |  2 -
 mpt/impl/imap-mailbox/external-james/pom.xml       |  4 +
 .../external/james/DeploymentValidation.java       | 45 +++++++++-
 ...=> DockerDeploymentValidationGuiceJPATest.java} | 39 ++++++++-
 ...> DockerDeploymentValidationSpringJPATest.java} | 39 ++++++++-
 .../external/james/DockerJamesRule.java            | 88 ++++++++++++++++++++
 .../external/james/ExternalJamesModule.java        | 23 ++++--
 .../james/JamesDeploymentValidationTest.java       | 13 ++-
 .../external/james/ProvisioningException.java      |  8 +-
 ...amesConfiguration.java => ProvisioningAPI.java} | 11 +--
 .../james/host/StaticJamesConfiguration.java       | 96 ++++++++++++----------
 .../james/host/docker/CliProvisioningAPI.java      | 95 +++++++++++++++++++++
 .../{ => external}/ExternalJamesConfiguration.java |  2 +-
 ...alJamesConfigurationEnvironnementVariables.java |  2 +-
 .../ExternalJamesImapHostSystem.java               |  5 +-
 .../ExternalJamesSmtpHostSystem.java               |  5 +-
 .../NoopDomainsAndUserAdder.java}                  | 16 ++--
 .../modules/server/CamelMailetContainerModule.java |  1 -
 .../mailetcontainer/impl/JamesMailSpooler.java     |  3 +-
 .../james/util/docker/DockerGenericContainer.java  |  6 ++
 25 files changed, 472 insertions(+), 117 deletions(-)
 copy mpt/core/src/main/java/org/apache/james/mpt/api/{Continuation.java => DomainAdder.java} (87%)
 copy mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/{JamesDeploymentValidationTest.java => DockerDeploymentValidationGuiceJPATest.java} (61%)
 copy mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/{JamesDeploymentValidationTest.java => DockerDeploymentValidationSpringJPATest.java} (61%)
 create mode 100644 mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerJamesRule.java
 copy server/container/core/src/main/java/org/apache/james/server/core/MissingArgumentException.java => mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/ProvisioningException.java (88%)
 copy mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/{ExternalJamesConfiguration.java => ProvisioningAPI.java} (88%)
 copy protocols/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddressException.java => mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/StaticJamesConfiguration.java (67%)
 create mode 100644 mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/docker/CliProvisioningAPI.java
 rename mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/{ => external}/ExternalJamesConfiguration.java (95%)
 rename mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/{ => external}/ExternalJamesConfigurationEnvironnementVariables.java (97%)
 rename mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/{ => external}/ExternalJamesImapHostSystem.java (93%)
 rename mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/{ => external}/ExternalJamesSmtpHostSystem.java (92%)
 rename mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/{ExternalJamesUserAdder.java => external/NoopDomainsAndUserAdder.java} (75%)


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


[james-project] 03/05: JAMES-2754 run JamesMailSpooler on init

Posted by bt...@apache.org.
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 1657eba301872271dc44ce2e771cb46e98c4cd33
Author: Rémi Kowalski <rk...@linagora.com>
AuthorDate: Fri May 3 17:07:32 2019 +0200

    JAMES-2754 run JamesMailSpooler on init
---
 .../org/apache/james/modules/server/CamelMailetContainerModule.java    | 1 -
 .../java/org/apache/james/mailetcontainer/impl/JamesMailSpooler.java   | 3 ++-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/server/container/guice/mailet/src/main/java/org/apache/james/modules/server/CamelMailetContainerModule.java b/server/container/guice/mailet/src/main/java/org/apache/james/modules/server/CamelMailetContainerModule.java
index 0a0a46c..8071593 100644
--- a/server/container/guice/mailet/src/main/java/org/apache/james/modules/server/CamelMailetContainerModule.java
+++ b/server/container/guice/mailet/src/main/java/org/apache/james/modules/server/CamelMailetContainerModule.java
@@ -175,7 +175,6 @@ public class CamelMailetContainerModule extends AbstractModule {
             jamesMailSpooler.setMailProcessor(camelCompositeProcessor);
             jamesMailSpooler.configure(getJamesSpoolerConfiguration());
             jamesMailSpooler.init();
-            jamesMailSpooler.run();
         }
 
         private HierarchicalConfiguration getJamesSpoolerConfiguration() {
diff --git a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailSpooler.java b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailSpooler.java
index d24e23e..b9a0c5c 100644
--- a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailSpooler.java
+++ b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailSpooler.java
@@ -105,9 +105,10 @@ public class JamesMailSpooler implements Disposable, Configurable, MailSpoolerMB
         queue = queueFactory.createQueue(MailQueueFactory.SPOOL);
         spooler = Schedulers.fromExecutor(Executors.newFixedThreadPool(numThreads, NamedThreadFactory.withName("spooler")));
         LOGGER.info("uses {} Thread(s)", numThreads);
+        run();
     }
 
-    public void run() {
+    private void run() {
         LOGGER.info("Queue={}", queue);
 
         disposable = Flux.from(queue.deQueue())


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


[james-project] 02/05: JAMES-2754 add validate deployment test with mail sent with smtp

Posted by bt...@apache.org.
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 42616098ed0ca459c0d4ed3af70523237eb6c169
Author: Rémi Kowalski <rk...@linagora.com>
AuthorDate: Fri May 3 14:19:27 2019 +0200

    JAMES-2754 add validate deployment test with mail sent with smtp
---
 .../external/james/DeploymentValidation.java       | 40 ++++++++++++++++++++++
 .../DockerDeploymentValidationGuiceJPATest.java    | 14 +++++++-
 .../DockerDeploymentValidationSpringJPATest.java   | 14 +++++++-
 .../james/JamesDeploymentValidationTest.java       | 10 ++++--
 4 files changed, 73 insertions(+), 5 deletions(-)

diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DeploymentValidation.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DeploymentValidation.java
index 20a4515..2c01407 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DeploymentValidation.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DeploymentValidation.java
@@ -19,11 +19,21 @@
 
 package org.apache.james.mpt.imapmailbox.external.james;
 
+import static org.awaitility.Duration.ONE_HUNDRED_MILLISECONDS;
+import static org.awaitility.Duration.TEN_SECONDS;
+
+import java.io.IOException;
 import java.util.Locale;
 
+import org.apache.commons.net.imap.IMAPClient;
 import org.apache.james.mpt.api.ImapHostSystem;
 import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
+import org.apache.james.mpt.imapmailbox.external.james.host.external.ExternalJamesConfiguration;
 import org.apache.james.mpt.script.SimpleScriptedTestProtocol;
+import org.apache.james.utils.SMTPMessageSender;
+import org.awaitility.Awaitility;
+import org.awaitility.Duration;
+import org.awaitility.core.ConditionFactory;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -33,17 +43,33 @@ public abstract class DeploymentValidation {
     public static final String USER = "imapuser";
     public static final String USER_ADDRESS = USER + "@" + DOMAIN;
     public static final String PASSWORD = "password";
+    private static final String INBOX = "INBOX";
+    private static final String ONE_MAIL = "* 1 EXISTS";
 
     protected abstract ImapHostSystem createImapHostSystem();
 
     protected abstract SmtpHostSystem createSmtpHostSystem();
 
+    protected abstract ExternalJamesConfiguration getConfiguration();
+
     private ImapHostSystem system;
+    private SmtpHostSystem smtpSystem;
     private SimpleScriptedTestProtocol simpleScriptedTestProtocol;
+    private IMAPClient imapClient = new IMAPClient();
+
+    protected static final Duration slowPacedPollInterval = ONE_HUNDRED_MILLISECONDS;
+    protected static final ConditionFactory calmlyAwait = Awaitility.with()
+        .pollInterval(slowPacedPollInterval)
+        .and()
+        .with()
+        .pollDelay(slowPacedPollInterval)
+        .await();
+    protected static final ConditionFactory awaitAtMostTenSeconds = calmlyAwait.atMost(TEN_SECONDS);
 
     @Before
     public void setUp() throws Exception {
         system = createImapHostSystem();
+        smtpSystem = createSmtpHostSystem();
 
         simpleScriptedTestProtocol = new SimpleScriptedTestProtocol("/org/apache/james/imap/scripts/", system)
             .withUser(USER_ADDRESS, PASSWORD)
@@ -55,4 +81,18 @@ public abstract class DeploymentValidation {
         simpleScriptedTestProtocol.run("ValidateDeployment");
     }
 
+    @Test
+    public void validateDeploymentWithMailsFromSmtp() throws Exception {
+        SMTPMessageSender smtpMessageSender = new SMTPMessageSender("another-domain");
+        smtpSystem.connect(smtpMessageSender).sendMessage("test@" + DOMAIN, USER_ADDRESS);
+        imapClient.connect(getConfiguration().getAddress(), getConfiguration().getImapPort().getValue());
+        imapClient.login(USER_ADDRESS, PASSWORD);
+        awaitAtMostTenSeconds.until(this::checkMailDelivery);
+    }
+
+    private Boolean checkMailDelivery() throws IOException {
+        imapClient.select(INBOX);
+        String replyString = imapClient.getReplyString();
+        return replyString.contains(ONE_MAIL);
+    }
 }
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationGuiceJPATest.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationGuiceJPATest.java
index 13df38e..c9e74c7 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationGuiceJPATest.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationGuiceJPATest.java
@@ -22,6 +22,7 @@ package org.apache.james.mpt.imapmailbox.external.james;
 import org.apache.james.mpt.api.ImapHostSystem;
 import org.apache.james.mpt.imapmailbox.external.james.host.ProvisioningAPI;
 import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
+import org.apache.james.mpt.imapmailbox.external.james.host.external.ExternalJamesConfiguration;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -47,7 +48,7 @@ public class DockerDeploymentValidationGuiceJPATest extends DeploymentValidation
         dockerJamesRule.start();
 
         ProvisioningAPI provisioningAPI = dockerJamesRule.cliJarDomainsAndUsersAdder();
-        Injector injector = Guice.createInjector(new ExternalJamesModule(dockerJamesRule.getConfiguration(), provisioningAPI));
+        Injector injector = Guice.createInjector(new ExternalJamesModule(getConfiguration(), provisioningAPI));
         provisioningAPI.addDomain(DOMAIN);
         provisioningAPI.addUser(USER_ADDRESS, PASSWORD);
         system = injector.getInstance(ImapHostSystem.class);
@@ -63,6 +64,12 @@ public class DockerDeploymentValidationGuiceJPATest extends DeploymentValidation
     public void validateDeployment() throws Exception {
     }
 
+    @Test
+    @Ignore("Not to be run on CI, as it will not use the current build. Uncomment to test on local dev environment")
+    @Override
+    public void validateDeploymentWithMailsFromSmtp() throws Exception {
+    }
+
     @Override
     protected ImapHostSystem createImapHostSystem() {
         return system;
@@ -73,6 +80,11 @@ public class DockerDeploymentValidationGuiceJPATest extends DeploymentValidation
         return smtpHostSystem;
     }
 
+    @Override
+    protected ExternalJamesConfiguration getConfiguration() {
+        return dockerJamesRule.getConfiguration();
+    }
+
     @After
     public void tearDown() throws Exception {
         system.afterTest();
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationSpringJPATest.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationSpringJPATest.java
index 0f4e86a..d99e546 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationSpringJPATest.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationSpringJPATest.java
@@ -22,6 +22,7 @@ package org.apache.james.mpt.imapmailbox.external.james;
 import org.apache.james.mpt.api.ImapHostSystem;
 import org.apache.james.mpt.imapmailbox.external.james.host.ProvisioningAPI;
 import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
+import org.apache.james.mpt.imapmailbox.external.james.host.external.ExternalJamesConfiguration;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -47,7 +48,7 @@ public class DockerDeploymentValidationSpringJPATest extends DeploymentValidatio
         dockerJamesRule.start();
 
         ProvisioningAPI provisioningAPI = dockerJamesRule.cliShellDomainsAndUsersAdder();
-        Injector injector = Guice.createInjector(new ExternalJamesModule(dockerJamesRule.getConfiguration(), provisioningAPI));
+        Injector injector = Guice.createInjector(new ExternalJamesModule(getConfiguration(), provisioningAPI));
         system = injector.getInstance(ImapHostSystem.class);
         provisioningAPI.addDomain(DOMAIN);
         provisioningAPI.addUser(USER_ADDRESS, PASSWORD);
@@ -63,6 +64,12 @@ public class DockerDeploymentValidationSpringJPATest extends DeploymentValidatio
     public void validateDeployment() throws Exception {
     }
 
+    @Test
+    @Ignore("Not to be run on CI, as it will not use the current build. Uncomment to test on local dev environment")
+    @Override
+    public void validateDeploymentWithMailsFromSmtp() throws Exception {
+    }
+
     @Override
     protected ImapHostSystem createImapHostSystem() {
         return system;
@@ -73,6 +80,11 @@ public class DockerDeploymentValidationSpringJPATest extends DeploymentValidatio
         return smtpHostSystem;
     }
 
+    @Override
+    protected ExternalJamesConfiguration getConfiguration() {
+        return dockerJamesRule.getConfiguration();
+    }
+
     @After
     public void tearDown() throws Exception {
         system.afterTest();
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java
index adf9940..5afc1ee 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java
@@ -20,11 +20,10 @@
 package org.apache.james.mpt.imapmailbox.external.james;
 
 import org.apache.james.mpt.api.ImapHostSystem;
+import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
 import org.apache.james.mpt.imapmailbox.external.james.host.external.ExternalJamesConfiguration;
-import org.apache.james.mpt.imapmailbox.external.james.host.external.NoopDomainsAndUserAdder;
 import org.apache.james.mpt.imapmailbox.external.james.host.external.ExternalJamesConfigurationEnvironnementVariables;
-import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
-import org.apache.james.utils.SMTPMessageSender;
+import org.apache.james.mpt.imapmailbox.external.james.host.external.NoopDomainsAndUserAdder;
 import org.junit.After;
 import org.junit.Before;
 
@@ -58,6 +57,11 @@ public class JamesDeploymentValidationTest extends DeploymentValidation {
         return smtpHostSystem;
     }
 
+    @Override
+    protected ExternalJamesConfiguration getConfiguration() {
+        return configuration;
+    }
+
     @After
     public void tearDown() throws Exception {
         system.afterTest();


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


[james-project] 05/05: JAMES-2756 MessageSearcher should decode value before searching

Posted by bt...@apache.org.
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 f31eedcbcf26a5e0089a421f405829540907f93a
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri May 10 18:10:18 2019 +0700

    JAMES-2756 MessageSearcher should decode value before searching
---
 .../store/search/SimpleMessageSearchIndexTest.java |  5 --
 .../mailbox/store/search/MessageSearches.java      | 53 ++++++++++++++--------
 2 files changed, 35 insertions(+), 23 deletions(-)

diff --git a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
index c383e35..48ffb16 100644
--- a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
+++ b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
@@ -238,9 +238,4 @@ public class SimpleMessageSearchIndexTest extends AbstractMessageSearchIndexTest
     @Override
     public void searchWithTextShouldReturnMailsWhenHtmlBodyMatchesWithStemming() throws Exception {
     }
-
-    @Ignore("JAMES-2756 SimpleMessageSearchIndex doesn't decode header values before searching")
-    @Override
-    public void addressShouldReturnTheRightUidOfTheMessageContainingUTF8EncodingToHeaderName() {
-    }
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
index 6f98523..5ff778a 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
@@ -421,37 +421,54 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
      */
     private boolean matchesAddress(SearchQuery.AddressOperator operator, String headerName,
                                    MailboxMessage message) throws MailboxException, IOException {
-        String text = operator.getAddress().toUpperCase(Locale.US);
+        String text = operator.getAddress();
         List<Header> headers = ResultUtils.createHeaders(message);
         for (Header header : headers) {
             String name = header.getName();
             if (headerName.equalsIgnoreCase(name)) {
                 String value = header.getValue();
-                AddressList aList = LenientAddressParser.DEFAULT.parseAddressList(value);
-                for (Address address : aList) {
-                    if (address instanceof Mailbox) {
-                        if (AddressFormatter.DEFAULT.encode((Mailbox) address).toUpperCase(Locale.US)
-                            .contains(text)) {
-                            return true;
-                        }
-                    } else if (address instanceof Group) {
-                        MailboxList mList = ((Group) address).getMailboxes();
-                        for (Mailbox mailbox : mList) {
-                            if (AddressFormatter.DEFAULT.encode(mailbox).toUpperCase(Locale.US)
-                                .contains(text)) {
-                                return true;
-                            }
-                        }
-                    }
+                AddressList addressList = LenientAddressParser.DEFAULT.parseAddressList(value);
+                if (matchesAddress(addressList, text)) {
+                    return true;
                 }
 
                 // Also try to match against raw header now
-                return value.toUpperCase(Locale.US).contains(text);
+                return value.toUpperCase(Locale.US).contains(text.toUpperCase(Locale.US));
             }
         }
         return false;
     }
 
+    private boolean matchesAddress(AddressList addressList, String valueToMatch) {
+        for (Address address : addressList) {
+            if (address instanceof Mailbox) {
+                if (doesMailboxContains((Mailbox) address, valueToMatch)) {
+                    return true;
+                }
+            } else if (address instanceof Group) {
+                MailboxList mList = ((Group) address).getMailboxes();
+                for (Mailbox mailbox : mList) {
+                    if (doesMailboxContains(mailbox, valueToMatch)) {
+                        return true;
+                    }
+                }
+            }
+        }
+
+        return false;
+    }
+
+    private boolean doesMailboxContains(Mailbox mailbox, String searchedText) {
+        String mailboxAsString = encodeAndUnscramble(mailbox);
+        return mailboxAsString.toUpperCase(Locale.US)
+            .contains(searchedText.toUpperCase(Locale.US));
+    }
+
+    private String encodeAndUnscramble(Mailbox mailbox) {
+        return MimeUtil.unscrambleHeaderValue(
+            AddressFormatter.DEFAULT.encode(mailbox));
+    }
+
     private boolean exists(String headerName, MailboxMessage message) throws MailboxException, IOException {
         List<Header> headers = ResultUtils.createHeaders(message);
 


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


[james-project] 04/05: JAMES-2756 SimpleMessageSearchIndex doesn't decode header values before searching

Posted by bt...@apache.org.
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 055f274f75a727a87cb67f90a1a9f68231f5a39a
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Mon May 6 12:02:06 2019 +0700

    JAMES-2756 SimpleMessageSearchIndex doesn't decode header values before searching
---
 .../mailbox/store/search/SimpleMessageSearchIndexTest.java   |  5 +++++
 .../mailbox/store/search/AbstractMessageSearchIndexTest.java | 12 ++++++++++++
 mailbox/store/src/test/resources/eml/mail.eml                |  2 +-
 mailbox/store/src/test/resources/eml/mail.json               |  6 +++++-
 4 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
index 48ffb16..c383e35 100644
--- a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
+++ b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
@@ -238,4 +238,9 @@ public class SimpleMessageSearchIndexTest extends AbstractMessageSearchIndexTest
     @Override
     public void searchWithTextShouldReturnMailsWhenHtmlBodyMatchesWithStemming() throws Exception {
     }
+
+    @Ignore("JAMES-2756 SimpleMessageSearchIndex doesn't decode header values before searching")
+    @Override
+    public void addressShouldReturnTheRightUidOfTheMessageContainingUTF8EncodingToHeaderName() {
+    }
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
index d7d6744..6df7e78 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
@@ -820,6 +820,18 @@ public abstract class AbstractMessageSearchIndexTest {
     }
 
     @Test
+    public void addressShouldReturnTheRightUidOfTheMessageContainingUTF8EncodingToHeaderName() throws Exception {
+        Assume.assumeTrue(storeMailboxManager
+            .getSupportedSearchCapabilities()
+            .contains(MailboxManager.SearchCapabilities.PartialEmailMatch));
+
+        SearchQuery searchQuery = new SearchQuery(SearchQuery.address(AddressType.To, "Üsteliğhan"));
+
+        assertThat(messageSearchIndex.search(session, mailbox, searchQuery))
+            .containsOnly(m8.getUid());
+    }
+
+    @Test
     public void addressShouldReturnUidHavingRightRecipientWhenToIsSpecified() throws Exception {
         SearchQuery searchQuery = new SearchQuery(SearchQuery.address(AddressType.To, "root@listes.minet.net"));
 
diff --git a/mailbox/store/src/test/resources/eml/mail.eml b/mailbox/store/src/test/resources/eml/mail.eml
index 6a8d498..e5d5d8f 100644
--- a/mailbox/store/src/test/resources/eml/mail.eml
+++ b/mailbox/store/src/test/resources/eml/mail.eml
@@ -63,7 +63,7 @@ Received: by 10.27.96.135 with HTTP; Wed, 3 Jun 2015 21:08:41 -0700 (PDT)
 From: Murari <mu...@gmail.com>
 Date: Thu, 4 Jun 2015 06:08:41 +0200
 Message-ID: <CA...@mail.gmail.com>
-To: General Discussion about Arch Linux <ar...@archlinux.org>
+To: General Discussion about Arch Linux <ar...@archlinux.org>, =?UTF-8?Q?=C3=9Csteli=C4=9Fhan_Ma=C5=9Frapa?= <us...@domain.tld>
 Content-Type: text/plain; charset=UTF-8
 X-Content-Filtered-By: Mailman/MimeDel 2.1.20
 Subject: [arch-general] Inkscape fails to open svg files
diff --git a/mailbox/store/src/test/resources/eml/mail.json b/mailbox/store/src/test/resources/eml/mail.json
index 2ad96b7..ab07ece 100644
--- a/mailbox/store/src/test/resources/eml/mail.json
+++ b/mailbox/store/src/test/resources/eml/mail.json
@@ -111,7 +111,7 @@
    "2.1.20"
   ],
   "to": [
-   "General Discussion about Arch Linux <ar...@archlinux.org>"
+   "General Discussion about Arch Linux <ar...@archlinux.org>, Üsteliğhan Maşrapa <us...@domain.tld>"
   ],
   "x-content-filtered-by": [
    "Mailman/MimeDel 2.1.20"
@@ -130,6 +130,10 @@
   {
    "name": "General Discussion about Arch Linux",
    "address": "arch-general@archlinux.org"
+  },
+  {
+   "name": "Üsteliğhan Maşrapa",
+   "address": "ustelighanmasrapa@domain.tld"
   }
  ],
  "cc": [],


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


[james-project] 01/05: JAMES-2754 add docker tests and smtp hosts system for deploiement validation

Posted by bt...@apache.org.
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 72ccea557fb8b9bc59b64e59cc56e5addea75427
Author: Rémi Kowalski <rk...@linagora.com>
AuthorDate: Fri May 3 11:47:57 2019 +0200

    JAMES-2754 add docker tests and smtp hosts system for deploiement validation
---
 .../org/apache/james/mpt/api/DomainAdder.java}     | 19 +++--
 .../java/org/apache/james/mpt/api/UserAdder.java   |  2 -
 mpt/impl/imap-mailbox/external-james/pom.xml       |  4 +
 .../external/james/DeploymentValidation.java       |  5 +-
 ...=> DockerDeploymentValidationGuiceJPATest.java} | 27 +++++-
 ...> DockerDeploymentValidationSpringJPATest.java} | 27 +++++-
 .../external/james/DockerJamesRule.java            | 88 ++++++++++++++++++++
 .../external/james/ExternalJamesModule.java        | 23 ++++--
 .../james/JamesDeploymentValidationTest.java       |  9 +-
 ...nfiguration.java => ProvisioningException.java} | 14 ++--
 ...nalJamesUserAdder.java => ProvisioningAPI.java} | 19 +----
 ...guration.java => StaticJamesConfiguration.java} | 29 ++++++-
 .../james/host/docker/CliProvisioningAPI.java      | 95 ++++++++++++++++++++++
 .../{ => external}/ExternalJamesConfiguration.java |  2 +-
 ...alJamesConfigurationEnvironnementVariables.java |  2 +-
 .../ExternalJamesImapHostSystem.java               |  5 +-
 .../ExternalJamesSmtpHostSystem.java               |  5 +-
 .../NoopDomainsAndUserAdder.java}                  | 16 ++--
 .../james/util/docker/DockerGenericContainer.java  |  6 ++
 19 files changed, 326 insertions(+), 71 deletions(-)

diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfiguration.java b/mpt/core/src/main/java/org/apache/james/mpt/api/DomainAdder.java
similarity index 84%
copy from mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfiguration.java
copy to mpt/core/src/main/java/org/apache/james/mpt/api/DomainAdder.java
index 4035615..cebd4d8 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfiguration.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/api/DomainAdder.java
@@ -16,15 +16,16 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.mpt.imapmailbox.external.james.host;
 
-import org.apache.james.util.Port;
-
-public interface ExternalJamesConfiguration {
-    String getAddress();
-
-    Port getImapPort();
-
-    Port getSmptPort();
+package org.apache.james.mpt.api;
 
+/**
+ * Adds domains on demand.
+ */
+public interface DomainAdder {
+    
+    /**
+     * @param domain not null
+     */
+    void addDomain(String domain) throws Exception;
 }
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/api/UserAdder.java b/mpt/core/src/main/java/org/apache/james/mpt/api/UserAdder.java
index 6d9cf0c..4311deb 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/api/UserAdder.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/api/UserAdder.java
@@ -25,10 +25,8 @@ package org.apache.james.mpt.api;
 public interface UserAdder {
     
     /**
-     * Adds a user.
      * @param user not null
      * @param password not null
-     * @throws Exception when user cannot be added
      */
     void addUser(String user, String password) throws Exception;
 }
diff --git a/mpt/impl/imap-mailbox/external-james/pom.xml b/mpt/impl/imap-mailbox/external-james/pom.xml
index 5663268..3553258 100644
--- a/mpt/impl/imap-mailbox/external-james/pom.xml
+++ b/mpt/impl/imap-mailbox/external-james/pom.xml
@@ -41,6 +41,10 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-webadmin-data</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-testing</artifactId>
             <scope>test</scope>
         </dependency>
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DeploymentValidation.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DeploymentValidation.java
index f4acc0c..20a4515 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DeploymentValidation.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DeploymentValidation.java
@@ -22,7 +22,6 @@ package org.apache.james.mpt.imapmailbox.external.james;
 import java.util.Locale;
 
 import org.apache.james.mpt.api.ImapHostSystem;
-import org.apache.james.mpt.imapmailbox.external.james.host.ExternalJamesSmtpHostSystem;
 import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
 import org.apache.james.mpt.script.SimpleScriptedTestProtocol;
 import org.junit.Before;
@@ -32,6 +31,7 @@ public abstract class DeploymentValidation {
 
     public static final String DOMAIN = "domain";
     public static final String USER = "imapuser";
+    public static final String USER_ADDRESS = USER + "@" + DOMAIN;
     public static final String PASSWORD = "password";
 
     protected abstract ImapHostSystem createImapHostSystem();
@@ -44,8 +44,9 @@ public abstract class DeploymentValidation {
     @Before
     public void setUp() throws Exception {
         system = createImapHostSystem();
+
         simpleScriptedTestProtocol = new SimpleScriptedTestProtocol("/org/apache/james/imap/scripts/", system)
-            .withUser(USER + "@" + DOMAIN, PASSWORD)
+            .withUser(USER_ADDRESS, PASSWORD)
             .withLocale(Locale.US);
     }
 
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationGuiceJPATest.java
similarity index 70%
copy from mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java
copy to mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationGuiceJPATest.java
index 6bc75a9..13df38e 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationGuiceJPATest.java
@@ -20,28 +20,49 @@
 package org.apache.james.mpt.imapmailbox.external.james;
 
 import org.apache.james.mpt.api.ImapHostSystem;
+import org.apache.james.mpt.imapmailbox.external.james.host.ProvisioningAPI;
 import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 
-public class JamesDeploymentValidationTest extends DeploymentValidation {
+@Ignore("Not to be run on CI, as it will not use the current build")
+public class DockerDeploymentValidationGuiceJPATest extends DeploymentValidation {
 
     private ImapHostSystem system;
     private SmtpHostSystem smtpHostSystem;
 
+    @Rule
+    public DockerJamesRule dockerJamesRule = new DockerJamesRule("linagora/james-jpa-guice");
+
     @Override
     @Before
     public void setUp() throws Exception {
-        Injector injector = Guice.createInjector(new ExternalJamesModule());
+
+        dockerJamesRule.start();
+
+        ProvisioningAPI provisioningAPI = dockerJamesRule.cliJarDomainsAndUsersAdder();
+        Injector injector = Guice.createInjector(new ExternalJamesModule(dockerJamesRule.getConfiguration(), provisioningAPI));
+        provisioningAPI.addDomain(DOMAIN);
+        provisioningAPI.addUser(USER_ADDRESS, PASSWORD);
         system = injector.getInstance(ImapHostSystem.class);
         smtpHostSystem = injector.getInstance(SmtpHostSystem.class);
         system.beforeTest();
+
         super.setUp();
     }
 
+    @Test
+    @Ignore("Not to be run on CI, as it will not use the current build. Uncomment to test on local dev environment")
+    @Override
+    public void validateDeployment() throws Exception {
+    }
+
     @Override
     protected ImapHostSystem createImapHostSystem() {
         return system;
@@ -55,7 +76,7 @@ public class JamesDeploymentValidationTest extends DeploymentValidation {
     @After
     public void tearDown() throws Exception {
         system.afterTest();
+        dockerJamesRule.stop();
     }
 
-
 }
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationSpringJPATest.java
similarity index 70%
copy from mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java
copy to mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationSpringJPATest.java
index 6bc75a9..0f4e86a 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationSpringJPATest.java
@@ -20,28 +20,49 @@
 package org.apache.james.mpt.imapmailbox.external.james;
 
 import org.apache.james.mpt.api.ImapHostSystem;
+import org.apache.james.mpt.imapmailbox.external.james.host.ProvisioningAPI;
 import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 
-public class JamesDeploymentValidationTest extends DeploymentValidation {
+@Ignore("Not to be run on CI, as it will not use the current build")
+public class DockerDeploymentValidationSpringJPATest extends DeploymentValidation {
 
     private ImapHostSystem system;
     private SmtpHostSystem smtpHostSystem;
 
+    @Rule
+    public DockerJamesRule dockerJamesRule = new DockerJamesRule("linagora/james-jpa-spring");
+
     @Override
     @Before
     public void setUp() throws Exception {
-        Injector injector = Guice.createInjector(new ExternalJamesModule());
+
+        dockerJamesRule.start();
+
+        ProvisioningAPI provisioningAPI = dockerJamesRule.cliShellDomainsAndUsersAdder();
+        Injector injector = Guice.createInjector(new ExternalJamesModule(dockerJamesRule.getConfiguration(), provisioningAPI));
         system = injector.getInstance(ImapHostSystem.class);
+        provisioningAPI.addDomain(DOMAIN);
+        provisioningAPI.addUser(USER_ADDRESS, PASSWORD);
         smtpHostSystem = injector.getInstance(SmtpHostSystem.class);
         system.beforeTest();
+
         super.setUp();
     }
 
+    @Test
+    @Ignore("Not to be run on CI, as it will not use the current build. Uncomment to test on local dev environment")
+    @Override
+    public void validateDeployment() throws Exception {
+    }
+
     @Override
     protected ImapHostSystem createImapHostSystem() {
         return system;
@@ -55,7 +76,7 @@ public class JamesDeploymentValidationTest extends DeploymentValidation {
     @After
     public void tearDown() throws Exception {
         system.afterTest();
+        dockerJamesRule.stop();
     }
 
-
 }
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerJamesRule.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerJamesRule.java
new file mode 100644
index 0000000..1ff4709
--- /dev/null
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerJamesRule.java
@@ -0,0 +1,88 @@
+/****************************************************************
+ * 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.mpt.imapmailbox.external.james;
+
+import java.io.IOException;
+
+import org.apache.james.mpt.imapmailbox.external.james.host.ProvisioningAPI;
+import org.apache.james.mpt.imapmailbox.external.james.host.StaticJamesConfiguration;
+import org.apache.james.mpt.imapmailbox.external.james.host.docker.CliProvisioningAPI;
+import org.apache.james.mpt.imapmailbox.external.james.host.external.ExternalJamesConfiguration;
+import org.apache.james.util.Port;
+import org.apache.james.util.docker.DockerGenericContainer;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy;
+
+public class DockerJamesRule implements TestRule {
+
+    private static final int IMAP_PORT = 143;
+    private static final int SMTP_PORT = 587;
+    private static final int WEBADMIN_PORT = 8000;
+
+    private final DockerGenericContainer container;
+
+    public DockerJamesRule(String image) {
+        container = new DockerGenericContainer(image)
+            .withExposedPorts(SMTP_PORT, IMAP_PORT)
+            .waitingFor(new HostPortWaitStrategy());
+    }
+
+    public ProvisioningAPI cliJarDomainsAndUsersAdder() throws InterruptedException, ProvisioningException, IOException {
+        return new CliProvisioningAPI(CliProvisioningAPI.CliType.JAR, container);
+    }
+
+    public ProvisioningAPI cliShellDomainsAndUsersAdder() throws InterruptedException, ProvisioningException, IOException {
+        return new CliProvisioningAPI(CliProvisioningAPI.CliType.SH, container);
+    }
+
+    public void start() {
+        container.start();
+    }
+
+    public void stop() {
+        container.stop();
+    }
+
+    public void pause() {
+        container.pause();
+    }
+
+    public void unpause() {
+        container.unpause();
+    }
+
+    public ExternalJamesConfiguration getConfiguration() {
+        return new StaticJamesConfiguration("localhost", getMappedPort(IMAP_PORT), getMappedPort(SMTP_PORT));
+    }
+
+    public Port getWebadminPort() {
+        return getMappedPort(WEBADMIN_PORT);
+    }
+
+    private Port getMappedPort(int port) {
+        return Port.of(container.getMappedPort(port));
+    }
+
+    @Override
+    public Statement apply(Statement statement, Description description) {
+        return statement;
+    }
+}
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/ExternalJamesModule.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/ExternalJamesModule.java
index 4b0917f..6505f9b 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/ExternalJamesModule.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/ExternalJamesModule.java
@@ -19,29 +19,38 @@
 
 package org.apache.james.mpt.imapmailbox.external.james;
 
+import org.apache.james.mpt.api.DomainAdder;
 import org.apache.james.mpt.api.HostSystem;
 import org.apache.james.mpt.api.ImapHostSystem;
 import org.apache.james.mpt.api.UserAdder;
 import org.apache.james.mpt.host.ExternalHostSystem;
-import org.apache.james.mpt.imapmailbox.external.james.host.ExternalJamesConfiguration;
-import org.apache.james.mpt.imapmailbox.external.james.host.ExternalJamesConfigurationEnvironnementVariables;
-import org.apache.james.mpt.imapmailbox.external.james.host.ExternalJamesImapHostSystem;
-import org.apache.james.mpt.imapmailbox.external.james.host.ExternalJamesSmtpHostSystem;
-import org.apache.james.mpt.imapmailbox.external.james.host.ExternalJamesUserAdder;
+import org.apache.james.mpt.imapmailbox.external.james.host.ProvisioningAPI;
 import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
+import org.apache.james.mpt.imapmailbox.external.james.host.external.ExternalJamesConfiguration;
+import org.apache.james.mpt.imapmailbox.external.james.host.external.ExternalJamesImapHostSystem;
+import org.apache.james.mpt.imapmailbox.external.james.host.external.ExternalJamesSmtpHostSystem;
 
 import com.google.inject.AbstractModule;
 
 public class ExternalJamesModule extends AbstractModule {
 
+    private final ExternalJamesConfiguration configuration;
+    private final ProvisioningAPI provisioningAPI;
+
+    public ExternalJamesModule(ExternalJamesConfiguration configuration, ProvisioningAPI provisioningAPI) {
+        this.configuration = configuration;
+        this.provisioningAPI = provisioningAPI;
+    }
+
     @Override
     protected void configure() {
-        bind(ExternalJamesConfiguration.class).to(ExternalJamesConfigurationEnvironnementVariables.class);
+        bind(ExternalJamesConfiguration.class).toInstance(configuration);
         bind(ImapHostSystem.class).to(ExternalJamesImapHostSystem.class);
         bind(HostSystem.class).to(ExternalJamesImapHostSystem.class);
         bind(ExternalHostSystem.class).to(ExternalJamesImapHostSystem.class);
         bind(SmtpHostSystem.class).to(ExternalJamesSmtpHostSystem.class);
-        bind(UserAdder.class).to(ExternalJamesUserAdder.class);
+        bind(DomainAdder.class).toInstance(provisioningAPI);
+        bind(UserAdder.class).toInstance(provisioningAPI);
     }
 
 }
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java
index 6bc75a9..adf9940 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java
@@ -20,7 +20,11 @@
 package org.apache.james.mpt.imapmailbox.external.james;
 
 import org.apache.james.mpt.api.ImapHostSystem;
+import org.apache.james.mpt.imapmailbox.external.james.host.external.ExternalJamesConfiguration;
+import org.apache.james.mpt.imapmailbox.external.james.host.external.NoopDomainsAndUserAdder;
+import org.apache.james.mpt.imapmailbox.external.james.host.external.ExternalJamesConfigurationEnvironnementVariables;
 import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
+import org.apache.james.utils.SMTPMessageSender;
 import org.junit.After;
 import org.junit.Before;
 
@@ -29,13 +33,15 @@ import com.google.inject.Injector;
 
 public class JamesDeploymentValidationTest extends DeploymentValidation {
 
+    private final String USER_ADDRESS = USER + "@" + DOMAIN;
     private ImapHostSystem system;
     private SmtpHostSystem smtpHostSystem;
+    private final ExternalJamesConfiguration configuration = new ExternalJamesConfigurationEnvironnementVariables();
 
     @Override
     @Before
     public void setUp() throws Exception {
-        Injector injector = Guice.createInjector(new ExternalJamesModule());
+        Injector injector = Guice.createInjector(new ExternalJamesModule(configuration, new NoopDomainsAndUserAdder()));
         system = injector.getInstance(ImapHostSystem.class);
         smtpHostSystem = injector.getInstance(SmtpHostSystem.class);
         system.beforeTest();
@@ -57,5 +63,4 @@ public class JamesDeploymentValidationTest extends DeploymentValidation {
         system.afterTest();
     }
 
-
 }
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfiguration.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/ProvisioningException.java
similarity index 84%
copy from mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfiguration.java
copy to mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/ProvisioningException.java
index 4035615..fb1d251 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfiguration.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/ProvisioningException.java
@@ -16,15 +16,11 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.mpt.imapmailbox.external.james.host;
+package org.apache.james.mpt.imapmailbox.external.james;
 
-import org.apache.james.util.Port;
-
-public interface ExternalJamesConfiguration {
-    String getAddress();
-
-    Port getImapPort();
-
-    Port getSmptPort();
+public class ProvisioningException extends Exception {
 
+    public ProvisioningException(String message) {
+        super(message);
+    }
 }
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesUserAdder.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ProvisioningAPI.java
similarity index 77%
copy from mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesUserAdder.java
copy to mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ProvisioningAPI.java
index 80801de..a5e0c7c 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesUserAdder.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ProvisioningAPI.java
@@ -18,21 +18,8 @@
  ****************************************************************/
 package org.apache.james.mpt.imapmailbox.external.james.host;
 
+import org.apache.james.mpt.api.DomainAdder;
 import org.apache.james.mpt.api.UserAdder;
 
-import com.google.inject.Singleton;
-
-@Singleton
-public class ExternalJamesUserAdder implements UserAdder {
-
-    public ExternalJamesUserAdder() {
-
-    }
-
-    @Override
-    public void addUser(String user, String password) throws Exception {
-        // User should already be configured
-        // We do not throw an exception in order to use BaseImapProtocol based tests
-    }
-
-}
\ No newline at end of file
+public interface ProvisioningAPI extends DomainAdder, UserAdder {
+}
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfiguration.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/StaticJamesConfiguration.java
similarity index 64%
copy from mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfiguration.java
copy to mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/StaticJamesConfiguration.java
index 4035615..915d57a 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfiguration.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/StaticJamesConfiguration.java
@@ -18,13 +18,34 @@
  ****************************************************************/
 package org.apache.james.mpt.imapmailbox.external.james.host;
 
+import org.apache.james.mpt.imapmailbox.external.james.host.external.ExternalJamesConfiguration;
 import org.apache.james.util.Port;
 
-public interface ExternalJamesConfiguration {
-    String getAddress();
+public class StaticJamesConfiguration implements ExternalJamesConfiguration {
 
-    Port getImapPort();
+    private final String address;
+    private final Port imapPort;
+    private final Port smtpPort;
 
-    Port getSmptPort();
 
+    public StaticJamesConfiguration(String address, Port imapPort, Port smtpPort) {
+        this.address = address;
+        this.imapPort = imapPort;
+        this.smtpPort = smtpPort;
+    }
+
+    @Override
+    public String getAddress() {
+        return address;
+    }
+
+    @Override
+    public Port getImapPort() {
+        return imapPort;
+    }
+
+    @Override
+    public Port getSmptPort() {
+        return smtpPort;
+    }
 }
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/docker/CliProvisioningAPI.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/docker/CliProvisioningAPI.java
new file mode 100644
index 0000000..b3aa138
--- /dev/null
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/docker/CliProvisioningAPI.java
@@ -0,0 +1,95 @@
+/****************************************************************
+ * 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.mpt.imapmailbox.external.james.host.docker;
+
+import java.io.IOException;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.james.mpt.imapmailbox.external.james.ProvisioningException;
+import org.apache.james.mpt.imapmailbox.external.james.host.ProvisioningAPI;
+import org.apache.james.util.docker.DockerGenericContainer;
+import org.testcontainers.containers.Container;
+import org.testcontainers.shaded.org.apache.commons.lang.StringUtils;
+
+import com.google.common.collect.ImmutableList;
+
+public class CliProvisioningAPI implements ProvisioningAPI {
+
+    public enum CliType {
+        JAR,
+        SH
+    }
+
+    private final DockerGenericContainer container;
+    private final String[] cmd;
+
+    private final static String[] jarCmd = {"java", "-jar", "/root/james-cli.jar"};
+    private final static String[] hostAndPort = {"-h", "127.0.0.1", "-p", "9999"};
+
+    public CliProvisioningAPI(CliType cliType, DockerGenericContainer container) throws InterruptedException, ProvisioningException, IOException, IllegalArgumentException {
+        this.container = container;
+        switch (cliType) {
+            case JAR:
+                cmd = jarCmd;
+                break;
+            case SH:
+                cmd = shCmd();
+                break;
+            default:
+                throw new IllegalArgumentException("UNKNOWN CliType");
+        }
+    }
+
+    @Override
+    public void addDomain(String domain) throws Exception {
+        Container.ExecResult execResult = exec("adddomain", domain);
+
+        if (execResult.getExitCode() != 0) {
+            throw new ProvisioningException("Failed to add domain" + executionResultToString(execResult));
+        }
+    }
+
+    @Override
+    public void addUser(String user, String password) throws Exception {
+        Container.ExecResult execResult = exec("adduser", user, password);
+
+        if (execResult.getExitCode() != 0) {
+            throw new ProvisioningException("Failed to add user" + executionResultToString(execResult));
+        }
+    }
+
+    private String[] shCmd() throws IOException, InterruptedException, ProvisioningException {
+        Container.ExecResult findCli = container.exec("find", "/root", "-name", "james-cli.sh");
+        if (findCli.getExitCode() != 0) {
+            throw new ProvisioningException("Failed to getCliPath" + executionResultToString(findCli));
+        }
+        return new String[]{findCli.getStdout().trim()};
+    }
+
+
+    private Container.ExecResult exec(String... commands) throws Exception {
+        String[] command = ArrayUtils.addAll(ArrayUtils.addAll(cmd, hostAndPort), commands);
+        return container.exec(command);
+    }
+
+    private String executionResultToString(Container.ExecResult execResult) {
+        return StringUtils.join(ImmutableList.of(execResult.getStdout(), execResult.getStderr()), " ");
+    }
+
+}
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfiguration.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesConfiguration.java
similarity index 95%
rename from mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfiguration.java
rename to mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesConfiguration.java
index 4035615..91fa822 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfiguration.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesConfiguration.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.mpt.imapmailbox.external.james.host;
+package org.apache.james.mpt.imapmailbox.external.james.host.external;
 
 import org.apache.james.util.Port;
 
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfigurationEnvironnementVariables.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesConfigurationEnvironnementVariables.java
similarity index 97%
rename from mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfigurationEnvironnementVariables.java
rename to mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesConfigurationEnvironnementVariables.java
index 799746d..03f36bf 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesConfigurationEnvironnementVariables.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesConfigurationEnvironnementVariables.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.mpt.imapmailbox.external.james.host;
+package org.apache.james.mpt.imapmailbox.external.james.host.external;
 
 import org.apache.james.util.Port;
 
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesImapHostSystem.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesImapHostSystem.java
similarity index 93%
rename from mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesImapHostSystem.java
rename to mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesImapHostSystem.java
index ac75f4c..6f9c4c7 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesImapHostSystem.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesImapHostSystem.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.mpt.imapmailbox.external.james.host;
+package org.apache.james.mpt.imapmailbox.external.james.host.external;
 
 import java.net.InetSocketAddress;
 import java.util.function.Supplier;
@@ -30,7 +30,6 @@ import org.apache.james.mpt.api.ImapFeatures.Feature;
 import org.apache.james.mpt.host.ExternalHostSystem;
 import org.apache.james.mpt.monitor.NullMonitor;
 
-import com.google.common.base.Preconditions;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 
@@ -43,7 +42,7 @@ public class ExternalJamesImapHostSystem extends ExternalHostSystem {
     private final Supplier<InetSocketAddress> addressSupplier;
 
     @Inject
-    private ExternalJamesImapHostSystem(ExternalJamesUserAdder userAdder, ExternalJamesConfiguration configuration) {
+    private ExternalJamesImapHostSystem(NoopDomainsAndUserAdder userAdder, ExternalJamesConfiguration configuration) {
         super(SUPPORTED_FEATURES, new NullMonitor(), SHABANG, userAdder);
         this.addressSupplier = () -> new InetSocketAddress(configuration.getAddress(), configuration.getImapPort().getValue());
     }
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesSmtpHostSystem.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesSmtpHostSystem.java
similarity index 92%
rename from mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesSmtpHostSystem.java
rename to mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesSmtpHostSystem.java
index 8e6aee0..de6ecca 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesSmtpHostSystem.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesSmtpHostSystem.java
@@ -16,17 +16,18 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.mpt.imapmailbox.external.james.host;
+package org.apache.james.mpt.imapmailbox.external.james.host.external;
 
 import java.io.IOException;
 
+import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
 import org.apache.james.utils.SMTPMessageSender;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 
 @Singleton
-public class ExternalJamesSmtpHostSystem implements SmtpHostSystem{
+public class ExternalJamesSmtpHostSystem implements SmtpHostSystem {
 
     private final ExternalJamesConfiguration configuration;
 
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesUserAdder.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/NoopDomainsAndUserAdder.java
similarity index 75%
rename from mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesUserAdder.java
rename to mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/NoopDomainsAndUserAdder.java
index 80801de..38fdfad 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ExternalJamesUserAdder.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/NoopDomainsAndUserAdder.java
@@ -16,16 +16,13 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.mpt.imapmailbox.external.james.host;
+package org.apache.james.mpt.imapmailbox.external.james.host.external;
 
-import org.apache.james.mpt.api.UserAdder;
+import org.apache.james.mpt.imapmailbox.external.james.host.ProvisioningAPI;
 
-import com.google.inject.Singleton;
+public class NoopDomainsAndUserAdder implements ProvisioningAPI {
 
-@Singleton
-public class ExternalJamesUserAdder implements UserAdder {
-
-    public ExternalJamesUserAdder() {
+    public NoopDomainsAndUserAdder() {
 
     }
 
@@ -35,4 +32,9 @@ public class ExternalJamesUserAdder implements UserAdder {
         // We do not throw an exception in order to use BaseImapProtocol based tests
     }
 
+    @Override
+    public void addDomain(String domain) throws Exception {
+        // Domain should already be configured
+        // We do not throw an exception in order to use BaseImapProtocol based tests
+    }
 }
\ No newline at end of file
diff --git a/server/testing/src/main/java/org/apache/james/util/docker/DockerGenericContainer.java b/server/testing/src/main/java/org/apache/james/util/docker/DockerGenericContainer.java
index a833f58..8502745 100644
--- a/server/testing/src/main/java/org/apache/james/util/docker/DockerGenericContainer.java
+++ b/server/testing/src/main/java/org/apache/james/util/docker/DockerGenericContainer.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.util.docker;
 
+import java.io.IOException;
 import java.net.Socket;
 import java.time.Duration;
 import java.util.List;
@@ -32,6 +33,7 @@ import org.junit.runners.model.Statement;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testcontainers.DockerClientFactory;
+import org.testcontainers.containers.Container;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.wait.strategy.WaitStrategy;
 import org.testcontainers.images.builder.ImageFromDockerfile;
@@ -113,6 +115,10 @@ public class DockerGenericContainer implements TestRule {
         return this;
     }
 
+    public Container.ExecResult exec(String... command) throws IOException, InterruptedException {
+       return container.execInContainer(command);
+    }
+
     public void start() {
         container.start();
     }


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