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