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 rc...@apache.org on 2020/03/17 10:51:11 UTC

[james-project] 01/17: JAMES-3115 Fail when typo in mailet-container configuration file.µ

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

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

commit 0968022171374806be901635b2a6e76684a9bbea
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Mar 13 18:27:47 2020 +0700

    JAMES-3115 Fail when typo in mailet-container configuration file.µ
    
    Before that the exception was interpreted as a missing key of the
    configuration file, leading to the default one to be used.
---
 server/container/guice/mailet/pom.xml              |   5 +
 .../modules/server/CamelMailetContainerModule.java |  23 ++--
 .../server/CamelMailetContainerModuleTest.java     | 150 +++++++++++++++++++++
 3 files changed, 169 insertions(+), 9 deletions(-)

diff --git a/server/container/guice/mailet/pom.xml b/server/container/guice/mailet/pom.xml
index 38d33cc..4f1f9fc 100644
--- a/server/container/guice/mailet/pom.xml
+++ b/server/container/guice/mailet/pom.xml
@@ -80,5 +80,10 @@
             <groupId>com.google.inject</groupId>
             <artifactId>guice</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
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 3df1755..f9f4412 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
@@ -29,6 +29,7 @@ import org.apache.camel.impl.SimpleRegistry;
 import org.apache.commons.configuration2.BaseHierarchicalConfiguration;
 import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
+import org.apache.commons.configuration2.ex.ConfigurationRuntimeException;
 import org.apache.commons.configuration2.tree.ImmutableNode;
 import org.apache.james.lifecycle.api.Startable;
 import org.apache.james.mailetcontainer.api.MailProcessor;
@@ -56,6 +57,7 @@ import org.apache.mailet.Matcher;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
@@ -134,11 +136,12 @@ public class CamelMailetContainerModule extends AbstractModule {
             .init(() -> mailetContext.configure(getMailetContextConfiguration(configurationProvider)));
     }
 
-    private HierarchicalConfiguration<ImmutableNode> getMailetContextConfiguration(ConfigurationProvider configurationProvider) {
+    @VisibleForTesting
+    HierarchicalConfiguration<ImmutableNode> getMailetContextConfiguration(ConfigurationProvider configurationProvider) throws ConfigurationException {
+        HierarchicalConfiguration<ImmutableNode> mailetContainerConfiguration = configurationProvider.getConfiguration("mailetcontainer");
         try {
-            return configurationProvider.getConfiguration("mailetcontainer")
-                .configurationAt("context");
-        } catch (Exception e) {
+            return mailetContainerConfiguration.configurationAt("context");
+        } catch (ConfigurationRuntimeException e) {
             LOGGER.warn("Could not locate configuration for Mailet context. Assuming empty configuration for this component.");
             return new BaseHierarchicalConfiguration();
         }
@@ -156,7 +159,8 @@ public class CamelMailetContainerModule extends AbstractModule {
         public MailetModuleInitializationOperation(ConfigurationProvider configurationProvider,
                                                    CamelCompositeProcessor camelCompositeProcessor,
                                                    Set<TransportProcessorCheck> transportProcessorCheckSet,
-                                                   DefaultProcessorsConfigurationSupplier defaultProcessorsConfigurationSupplier, DefaultCamelContext camelContext) {
+                                                   DefaultProcessorsConfigurationSupplier defaultProcessorsConfigurationSupplier,
+                                                   DefaultCamelContext camelContext) {
             this.configurationProvider = configurationProvider;
             this.camelCompositeProcessor = camelCompositeProcessor;
             this.transportProcessorCheckSet = transportProcessorCheckSet;
@@ -176,11 +180,12 @@ public class CamelMailetContainerModule extends AbstractModule {
             camelCompositeProcessor.init();
         }
 
-        private HierarchicalConfiguration<ImmutableNode> getProcessorConfiguration() {
+        @VisibleForTesting
+        HierarchicalConfiguration<ImmutableNode> getProcessorConfiguration() throws ConfigurationException {
+            HierarchicalConfiguration<ImmutableNode> mailetContainerConfiguration = configurationProvider.getConfiguration("mailetcontainer");
             try {
-                return configurationProvider.getConfiguration("mailetcontainer")
-                    .configurationAt("processors");
-            } catch (Exception e) {
+                return mailetContainerConfiguration.configurationAt("processors");
+            } catch (ConfigurationRuntimeException e) {
                 LOGGER.warn("Could not load configuration for Processors. Fallback to default.");
                 return defaultProcessorsConfigurationSupplier.getDefaultConfiguration();
             }
diff --git a/server/container/guice/mailet/src/test/java/org/apache/james/modules/server/CamelMailetContainerModuleTest.java b/server/container/guice/mailet/src/test/java/org/apache/james/modules/server/CamelMailetContainerModuleTest.java
new file mode 100644
index 0000000..c740f49
--- /dev/null
+++ b/server/container/guice/mailet/src/test/java/org/apache/james/modules/server/CamelMailetContainerModuleTest.java
@@ -0,0 +1,150 @@
+/****************************************************************
+ * 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.modules.server;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.ByteArrayInputStream;
+import java.nio.charset.StandardCharsets;
+
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.commons.configuration2.BaseHierarchicalConfiguration;
+import org.apache.commons.configuration2.HierarchicalConfiguration;
+import org.apache.commons.configuration2.XMLConfiguration;
+import org.apache.commons.configuration2.ex.ConfigurationRuntimeException;
+import org.apache.commons.configuration2.tree.ImmutableNode;
+import org.apache.james.mailetcontainer.impl.camel.CamelCompositeProcessor;
+import org.apache.james.modules.server.CamelMailetContainerModule.MailetModuleInitializationOperation;
+import org.apache.james.server.core.configuration.ConfigurationProvider;
+import org.apache.james.server.core.configuration.FileConfigurationProvider;
+import org.junit.jupiter.api.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+class CamelMailetContainerModuleTest {
+
+    public static final ImmutableSet<CamelMailetContainerModule.TransportProcessorCheck> NO_TRANSPORT_CHECKS = ImmutableSet.of();
+
+    @Test
+    void getMailetContextConfigurationShouldReturnEmptyWhenNoContextSection() throws Exception {
+        ConfigurationProvider configurationProvider = mock(ConfigurationProvider.class);
+        when(configurationProvider.getConfiguration("mailetcontainer"))
+            .thenReturn(new BaseHierarchicalConfiguration());
+
+        CamelMailetContainerModule testee = new CamelMailetContainerModule();
+
+        assertThat(testee.getMailetContextConfiguration(configurationProvider).size())
+            .isEqualTo(0);
+    }
+
+    @Test
+    void getMailetContextConfigurationShouldThrowOnInvalidXML() throws Exception {
+        ConfigurationProvider configurationProvider = mock(ConfigurationProvider.class);
+        when(configurationProvider.getConfiguration("mailetcontainer"))
+            .thenThrow(new ConfigurationRuntimeException());
+
+        CamelMailetContainerModule testee = new CamelMailetContainerModule();
+
+        assertThatThrownBy(() -> testee.getMailetContextConfiguration(configurationProvider))
+            .isInstanceOf(ConfigurationRuntimeException.class);
+    }
+
+    @Test
+    void getMailetContextConfigurationShouldReturnConfigurationWhenSome() throws Exception {
+        XMLConfiguration configuration = FileConfigurationProvider.getConfig(new ByteArrayInputStream((
+                    "<mailetcontainer>" +
+                    "  <context>" +
+                    "    <key>value</key>" +
+                    "  </context>" +
+                    "</mailetcontainer>")
+            .getBytes(StandardCharsets.UTF_8)));
+        ConfigurationProvider configurationProvider = mock(ConfigurationProvider.class);
+        when(configurationProvider.getConfiguration("mailetcontainer")).thenReturn(configuration);
+
+        CamelMailetContainerModule testee = new CamelMailetContainerModule();
+
+        HierarchicalConfiguration<ImmutableNode> mailetContextConfiguration = testee.getMailetContextConfiguration(configurationProvider);
+        assertThat(mailetContextConfiguration.getString("key"))
+            .isEqualTo("value");
+    }
+
+    @Test
+    void getProcessortConfigurationShouldReturnEmptyWhenNoContextSection() throws Exception {
+        ConfigurationProvider configurationProvider = mock(ConfigurationProvider.class);
+        when(configurationProvider.getConfiguration("mailetcontainer"))
+            .thenReturn(new BaseHierarchicalConfiguration());
+        XMLConfiguration defaultConfiguration = FileConfigurationProvider.getConfig(new ByteArrayInputStream((
+                "<processors>" +
+                "  <key>value</key>" +
+                "</processors>")
+            .getBytes(StandardCharsets.UTF_8)));
+
+        MailetModuleInitializationOperation testee = new MailetModuleInitializationOperation(configurationProvider,
+            mock(CamelCompositeProcessor.class),
+            NO_TRANSPORT_CHECKS,
+            () -> defaultConfiguration,
+            mock(DefaultCamelContext.class));
+
+        assertThat(testee.getProcessorConfiguration())
+            .isEqualTo(defaultConfiguration);
+    }
+
+    @Test
+    void getProcessorConfigurationShouldThrowOnInvalidXML() throws Exception {
+        ConfigurationProvider configurationProvider = mock(ConfigurationProvider.class);
+        when(configurationProvider.getConfiguration("mailetcontainer"))
+            .thenThrow(new ConfigurationRuntimeException());
+
+        MailetModuleInitializationOperation testee = new MailetModuleInitializationOperation(configurationProvider,
+            mock(CamelCompositeProcessor.class),
+            NO_TRANSPORT_CHECKS,
+            mock(CamelMailetContainerModule.DefaultProcessorsConfigurationSupplier.class),
+            mock(DefaultCamelContext.class));
+
+        assertThatThrownBy(testee::getProcessorConfiguration)
+            .isInstanceOf(ConfigurationRuntimeException.class);
+    }
+
+    @Test
+    void getProcessorConfigurationShouldReturnConfigurationWhenSome() throws Exception {
+        XMLConfiguration configuration = FileConfigurationProvider.getConfig(new ByteArrayInputStream((
+                    "<mailetcontainer>" +
+                    "  <processors>" +
+                    "    <key>value</key>" +
+                    "  </processors>" +
+                    "</mailetcontainer>")
+            .getBytes(StandardCharsets.UTF_8)));
+        ConfigurationProvider configurationProvider = mock(ConfigurationProvider.class);
+        when(configurationProvider.getConfiguration("mailetcontainer")).thenReturn(configuration);
+
+        MailetModuleInitializationOperation testee = new MailetModuleInitializationOperation(configurationProvider,
+            mock(CamelCompositeProcessor.class),
+            NO_TRANSPORT_CHECKS,
+            mock(CamelMailetContainerModule.DefaultProcessorsConfigurationSupplier.class),
+            mock(DefaultCamelContext.class));
+
+        HierarchicalConfiguration<ImmutableNode> mailetContextConfiguration = testee.getProcessorConfiguration();
+        assertThat(mailetContextConfiguration.getString("key"))
+            .isEqualTo("value");
+    }
+}
\ No newline at end of file


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