You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ol...@apache.org on 2021/09/10 20:02:19 UTC

[sling-org-apache-sling-commons-messaging-mail] 01/02: check for required configuration and services, test component lifecycle

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

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-messaging-mail.git

commit 735b0a2588166f9a83c623042eb7d144c4c084d9
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Fri Sep 10 21:57:28 2021 +0200

    check for required configuration and services, test component lifecycle
---
 pom.xml                                            |   1 +
 .../messaging/mail/internal/SimpleMailService.java |   6 ++
 .../mail/internal/SimpleMailServiceTest.java       | 111 +++++++++++++++++++++
 .../org.mockito.plugins.MockMaker                  |   1 +
 4 files changed, 119 insertions(+)

diff --git a/pom.xml b/pom.xml
index 703e49d..7e3d2d0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -60,6 +60,7 @@
         <configuration>
           <excludes combine.children="append">
             <exclude>**/*.txt</exclude>
+            <exclude>src/test/resources/mockito-extensions/*</exclude>
             <exclude>src/test/resources/password</exclude>
           </excludes>
         </configuration>
diff --git a/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java b/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java
index 6822c6e..f90cd5d 100644
--- a/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java
+++ b/src/main/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailService.java
@@ -174,10 +174,16 @@ public final class SimpleMailService implements MailService {
 
     @Override
     public @NotNull CompletableFuture<Void> sendMessage(@NotNull final MimeMessage message) {
+        final var threadPool = this.threadPool;
+        Objects.requireNonNull(threadPool, "Thread pool must not be null");
         return CompletableFuture.runAsync(() -> send(message), runnable -> threadPool.submit(runnable));
     }
 
     private void send(@NotNull final MimeMessage message) {
+        final var configuration = this.configuration;
+        Objects.requireNonNull(configuration, "Configuration must not be null");
+        final var cryptoService = this.cryptoService;
+        Objects.requireNonNull(cryptoService, "Crypto service must not be null");
         try {
             final ClassLoader tccl = Thread.currentThread().getContextClassLoader();
             Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
diff --git a/src/test/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailServiceTest.java b/src/test/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailServiceTest.java
new file mode 100644
index 0000000..d11d10e
--- /dev/null
+++ b/src/test/java/org/apache/sling/commons/messaging/mail/internal/SimpleMailServiceTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.sling.commons.messaging.mail.internal;
+
+import java.util.Collections;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.Future;
+
+import jakarta.mail.Session;
+import jakarta.mail.Transport;
+import jakarta.mail.internet.MimeMessage;
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.commons.lang3.reflect.MethodUtils;
+import org.apache.sling.commons.crypto.CryptoService;
+import org.apache.sling.commons.threads.ThreadPool;
+import org.apache.sling.commons.threads.ThreadPoolConfig;
+import org.apache.sling.commons.threads.ThreadPoolManager;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class SimpleMailServiceTest {
+
+    @Rule
+    public ExpectedException exception = ExpectedException.none();
+
+    @Test
+    public void testComponentLifecycle() throws Exception {
+        final MimeMessage message = mock(MimeMessage.class);
+        final ThreadPoolManager threadPoolManager = mock(ThreadPoolManager.class);
+        when(threadPoolManager.get("default")).thenReturn(new DefaultThreadPool());
+        final CryptoService cryptoService = mock(CryptoService.class);
+        final Transport transport = mock(Transport.class);
+        final Session session = mock(Session.class);
+        when(session.getTransport("smtps")).thenReturn(transport);
+        final SimpleMailService service = new SimpleMailService();
+        FieldUtils.writeDeclaredField(service, "threadPoolManager", threadPoolManager, true);
+        FieldUtils.writeDeclaredField(service, "cryptoService", cryptoService, true);
+        FieldUtils.writeDeclaredField(service, "connectionListeners", Collections.emptyList(), true);
+        FieldUtils.writeDeclaredField(service, "transportListeners", Collections.emptyList(), true);
+        { // activate
+            final SimpleMailServiceConfiguration configuration = mock(SimpleMailServiceConfiguration.class);
+            when(configuration.threadpool_name()).thenReturn("default");
+            MethodUtils.invokeMethod(service, true, "activate", configuration);
+            FieldUtils.writeDeclaredField(service, "session", session, true);
+            service.sendMessage(message);
+        }
+        { // modified
+            final SimpleMailServiceConfiguration configuration = mock(SimpleMailServiceConfiguration.class);
+            when(configuration.threadpool_name()).thenReturn("default");
+            MethodUtils.invokeMethod(service, true, "modified", configuration);
+            service.sendMessage(message);
+        }
+        { // deactivate
+            MethodUtils.invokeMethod(service, true, "deactivate");
+            exception.expect(NullPointerException.class);
+            exception.expectMessage("Thread pool must not be null");
+            service.sendMessage(message);
+        }
+    }
+
+    private static final class DefaultThreadPool implements ThreadPool {
+
+        @Override
+        public void execute(Runnable runnable) {
+            ForkJoinPool.commonPool().execute(runnable);
+        }
+
+        @Override
+        public <T> Future<T> submit(Callable<T> callable) {
+            return ForkJoinPool.commonPool().submit(callable);
+        }
+
+        @Override
+        public Future<?> submit(Runnable runnable) {
+            return ForkJoinPool.commonPool().submit(runnable);
+        }
+
+        @Override
+        public String getName() {
+            return "default";
+        }
+
+        @Override
+        public ThreadPoolConfig getConfiguration() {
+            return null;
+        }
+
+    }
+
+}
diff --git a/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
new file mode 100644
index 0000000..1f0955d
--- /dev/null
+++ b/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
@@ -0,0 +1 @@
+mock-maker-inline