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;
+ }
+ }
}