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

exceptionfactory pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new e1c99e3  MINIFI-553: Fix timeout-based tests in StatusLoggerTest
e1c99e3 is described below

commit e1c99e3a5c1d138c322b412a66c4027359c84088
Author: Matthew Burgess <[email protected]>
AuthorDate: Wed Apr 28 17:30:07 2021 -0400

    MINIFI-553: Fix timeout-based tests in StatusLoggerTest
    
    This closes #5041
    
    Signed-off-by: David Handermann <[email protected]>
---
 .../bootstrap/status/PeriodicStatusReporter.java   | 14 ++++-
 .../status/reporters/StatusLoggerTest.java         | 63 +++++++++++++++-------
 2 files changed, 57 insertions(+), 20 deletions(-)

diff --git 
a/minifi/minifi-bootstrap/src/main/java/org/apache/nifi/minifi/bootstrap/status/PeriodicStatusReporter.java
 
b/minifi/minifi-bootstrap/src/main/java/org/apache/nifi/minifi/bootstrap/status/PeriodicStatusReporter.java
index 916c903..0816aa7 100644
--- 
a/minifi/minifi-bootstrap/src/main/java/org/apache/nifi/minifi/bootstrap/status/PeriodicStatusReporter.java
+++ 
b/minifi/minifi-bootstrap/src/main/java/org/apache/nifi/minifi/bootstrap/status/PeriodicStatusReporter.java
@@ -20,12 +20,13 @@ package org.apache.nifi.minifi.bootstrap.status;
 import org.apache.nifi.minifi.bootstrap.QueryableStatusAggregator;
 
 import java.util.Properties;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
 public abstract class PeriodicStatusReporter {
 
-    private final ScheduledThreadPoolExecutor scheduledExecutorService = new 
ScheduledThreadPoolExecutor(1);
+    private ScheduledExecutorService scheduledExecutorService = new 
ScheduledThreadPoolExecutor(1);
 
     private volatile int period = -1;
     private volatile int termination_wait = 5000;
@@ -42,7 +43,6 @@ public abstract class PeriodicStatusReporter {
     /**
      * Begins the associated reporting service provided by the given 
implementation.  In most implementations, no action will occur until this 
method is invoked. The implementing class must have set
      * 'reportRunner' prior to this method being called.
-     *
      */
     public void start() {
         if (reportRunner == null){
@@ -78,4 +78,14 @@ public abstract class PeriodicStatusReporter {
     public void setTermination_wait(int termination_wait) {
         this.termination_wait = termination_wait;
     }
+
+    /**
+     * Allows the underlying ScheduledExecutorService to be set to something 
other than the default ScheduledThreadPoolExecutor(1). This method should be 
called
+     * before start() to ensure all methods are invoked on the same 
ScheduledExecutorService instance
+     * @param scheduledExecutorService the ScheduledExecutorService to set
+     */
+    public void setScheduledExecutorService(ScheduledExecutorService 
scheduledExecutorService) {
+        this.scheduledExecutorService = scheduledExecutorService;
+    }
+
 }
diff --git 
a/minifi/minifi-bootstrap/src/test/java/org/apache/nifi/minifi/bootstrap/status/reporters/StatusLoggerTest.java
 
b/minifi/minifi-bootstrap/src/test/java/org/apache/nifi/minifi/bootstrap/status/reporters/StatusLoggerTest.java
index 576dc4e..e184472 100644
--- 
a/minifi/minifi-bootstrap/src/test/java/org/apache/nifi/minifi/bootstrap/status/reporters/StatusLoggerTest.java
+++ 
b/minifi/minifi-bootstrap/src/test/java/org/apache/nifi/minifi/bootstrap/status/reporters/StatusLoggerTest.java
@@ -29,6 +29,9 @@ import java.io.IOException;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.Properties;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 import static 
org.apache.nifi.minifi.bootstrap.status.reporters.StatusLogger.ENCOUNTERED_IO_EXCEPTION;
 import static 
org.apache.nifi.minifi.bootstrap.status.reporters.StatusLogger.LOGGING_LEVEL_KEY;
@@ -71,9 +74,9 @@ public class StatusLoggerTest {
     }
 
     @Test(expected = IllegalStateException.class)
-    public void testFailedInitDueToFatalLogLevel(){
+    public void testFailedInitDueToFatalLogLevel() {
         Properties properties = new Properties();
-        properties.setProperty(REPORT_PERIOD_KEY, "100");
+        properties.setProperty(REPORT_PERIOD_KEY, "1");
         properties.setProperty(LOGGING_LEVEL_KEY, LogLevel.FATAL.name());
         properties.setProperty(QUERY_KEY, MOCK_QUERY);
 
@@ -81,7 +84,7 @@ public class StatusLoggerTest {
     }
 
     @Test(expected = IllegalStateException.class)
-    public void testFailedInitDueToNoPeriod(){
+    public void testFailedInitDueToNoPeriod() {
         Properties properties = new Properties();
         properties.setProperty(LOGGING_LEVEL_KEY, LogLevel.INFO.name());
         properties.setProperty(QUERY_KEY, MOCK_QUERY);
@@ -90,9 +93,9 @@ public class StatusLoggerTest {
     }
 
     @Test(expected = IllegalStateException.class)
-    public void testFailedInitDueToNoQuery(){
+    public void testFailedInitDueToNoQuery() {
         Properties properties = new Properties();
-        properties.setProperty(REPORT_PERIOD_KEY, "100");
+        properties.setProperty(REPORT_PERIOD_KEY, "1");
         properties.setProperty(LOGGING_LEVEL_KEY, LogLevel.INFO.name());
 
         statusLogger.initialize(properties, queryableStatusAggregator);
@@ -101,48 +104,53 @@ public class StatusLoggerTest {
     @Test
     public void TestTrace() {
         statusLogger.initialize(getProperties(LogLevel.TRACE), 
queryableStatusAggregator);
+        statusLogger.setScheduledExecutorService(new 
RunOnceScheduledExecutorService(1));
         statusLogger.start();
 
-        verify(logger, Mockito.timeout(300).atLeastOnce()).info(MOCK_STATUS, 
(Throwable) null);
+        verify(logger, Mockito.atLeastOnce()).trace(MOCK_STATUS, (Throwable) 
null);
     }
 
     @Test
     public void TestDebug() {
         statusLogger.initialize(getProperties(LogLevel.DEBUG), 
queryableStatusAggregator);
+        statusLogger.setScheduledExecutorService(new 
RunOnceScheduledExecutorService(1));
         statusLogger.start();
 
-        verify(logger, Mockito.timeout(300).atLeastOnce()).debug(MOCK_STATUS, 
(Throwable) null);
+        verify(logger, Mockito.atLeastOnce()).debug(MOCK_STATUS, (Throwable) 
null);
     }
 
     @Test
     public void TestInfo() {
         statusLogger.initialize(getProperties(LogLevel.INFO), 
queryableStatusAggregator);
+        statusLogger.setScheduledExecutorService(new 
RunOnceScheduledExecutorService(1));
         statusLogger.start();
 
-        verify(logger, Mockito.timeout(300).atLeastOnce()).info(MOCK_STATUS, 
(Throwable) null);
+        verify(logger, Mockito.atLeastOnce()).info(MOCK_STATUS, (Throwable) 
null);
     }
 
     @Test
     public void TestWarn() {
         statusLogger.initialize(getProperties(LogLevel.WARN), 
queryableStatusAggregator);
+        statusLogger.setScheduledExecutorService(new 
RunOnceScheduledExecutorService(1));
         statusLogger.start();
 
-        verify(logger, Mockito.timeout(300).atLeastOnce()).warn(MOCK_STATUS, 
(Throwable) null);
+        verify(logger, Mockito.atLeastOnce()).warn(MOCK_STATUS, (Throwable) 
null);
     }
 
     @Test
     public void TestError() {
         statusLogger.initialize(getProperties(LogLevel.ERROR), 
queryableStatusAggregator);
+        statusLogger.setScheduledExecutorService(new 
RunOnceScheduledExecutorService(1));
         statusLogger.start();
 
-        verify(logger, Mockito.timeout(300).atLeastOnce()).error(MOCK_STATUS, 
(Throwable) null);
+        verify(logger, Mockito.atLeastOnce()).error(MOCK_STATUS, (Throwable) 
null);
     }
 
     // Exception testing
     @Test
     public void TestTraceException() throws IOException {
         Properties properties = new Properties();
-        properties.setProperty(REPORT_PERIOD_KEY, "100");
+        properties.setProperty(REPORT_PERIOD_KEY, "1");
         properties.setProperty(LOGGING_LEVEL_KEY, LogLevel.TRACE.name());
         properties.setProperty(QUERY_KEY, MOCK_QUERY);
 
@@ -150,9 +158,10 @@ public class StatusLoggerTest {
         
Mockito.when(queryableStatusAggregator.statusReport(MOCK_QUERY)).thenThrow(ioException);
 
         statusLogger.initialize(properties, queryableStatusAggregator);
+        statusLogger.setScheduledExecutorService(new 
RunOnceScheduledExecutorService(1));
         statusLogger.start();
 
-        verify(logger, 
Mockito.timeout(300).atLeastOnce()).trace(ENCOUNTERED_IO_EXCEPTION, 
ioException);
+        verify(logger, Mockito.atLeastOnce()).trace(ENCOUNTERED_IO_EXCEPTION, 
ioException);
     }
 
     @Test
@@ -161,9 +170,10 @@ public class StatusLoggerTest {
         
Mockito.when(queryableStatusAggregator.statusReport(MOCK_QUERY)).thenThrow(ioException);
 
         statusLogger.initialize(getProperties(LogLevel.DEBUG), 
queryableStatusAggregator);
+        statusLogger.setScheduledExecutorService(new 
RunOnceScheduledExecutorService(1));
         statusLogger.start();
 
-        verify(logger, 
Mockito.timeout(300).atLeastOnce()).debug(ENCOUNTERED_IO_EXCEPTION, 
ioException);
+        verify(logger, Mockito.atLeastOnce()).debug(ENCOUNTERED_IO_EXCEPTION, 
ioException);
     }
 
     @Test
@@ -172,9 +182,10 @@ public class StatusLoggerTest {
         
Mockito.when(queryableStatusAggregator.statusReport(MOCK_QUERY)).thenThrow(ioException);
 
         statusLogger.initialize(getProperties(LogLevel.INFO), 
queryableStatusAggregator);
+        statusLogger.setScheduledExecutorService(new 
RunOnceScheduledExecutorService(1));
         statusLogger.start();
 
-        verify(logger, 
Mockito.timeout(300).atLeastOnce()).info(ENCOUNTERED_IO_EXCEPTION, ioException);
+        verify(logger, Mockito.atLeastOnce()).info(ENCOUNTERED_IO_EXCEPTION, 
ioException);
     }
 
     @Test
@@ -183,9 +194,10 @@ public class StatusLoggerTest {
         
Mockito.when(queryableStatusAggregator.statusReport(MOCK_QUERY)).thenThrow(ioException);
 
         statusLogger.initialize(getProperties(LogLevel.WARN), 
queryableStatusAggregator);
+        statusLogger.setScheduledExecutorService(new 
RunOnceScheduledExecutorService(1));
         statusLogger.start();
 
-        verify(logger, 
Mockito.timeout(300).atLeastOnce()).warn(ENCOUNTERED_IO_EXCEPTION, ioException);
+        verify(logger, Mockito.atLeastOnce()).warn(ENCOUNTERED_IO_EXCEPTION, 
ioException);
     }
 
     @Test
@@ -194,16 +206,31 @@ public class StatusLoggerTest {
         
Mockito.when(queryableStatusAggregator.statusReport(MOCK_QUERY)).thenThrow(ioException);
 
         statusLogger.initialize(getProperties(LogLevel.ERROR), 
queryableStatusAggregator);
+        statusLogger.setScheduledExecutorService(new 
RunOnceScheduledExecutorService(1));
         statusLogger.start();
 
-        verify(logger, 
Mockito.timeout(300).atLeastOnce()).error(ENCOUNTERED_IO_EXCEPTION, 
ioException);
+        verify(logger, Mockito.atLeastOnce()).error(ENCOUNTERED_IO_EXCEPTION, 
ioException);
     }
 
-    private static Properties getProperties(LogLevel logLevel){
+    private static Properties getProperties(LogLevel logLevel) {
         Properties properties = new Properties();
-        properties.setProperty(REPORT_PERIOD_KEY, "100");
+        properties.setProperty(REPORT_PERIOD_KEY, "1");
         properties.setProperty(LOGGING_LEVEL_KEY, logLevel.name());
         properties.setProperty(QUERY_KEY, MOCK_QUERY);
         return properties;
     }
+
+    private static class RunOnceScheduledExecutorService extends 
ScheduledThreadPoolExecutor {
+
+        public RunOnceScheduledExecutorService(int corePoolSize) {
+            super(corePoolSize);
+        }
+
+        @Override
+        public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long 
initialDelay, long period, TimeUnit unit) {
+            command.run();
+            // Return value is not used
+            return null;
+        }
+    }
 }

Reply via email to