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:07 UTC

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

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