This is an automated email from the ASF dual-hosted git repository.
dklco pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-event.git
The following commit(s) were added to refs/heads/master by this push:
new 8b6ee70 SLING-11797 - Adding a log message at INFO when a job is
added which has no assigned topic (#25)
8b6ee70 is described below
commit 8b6ee70aebdce8cda6b36e26709dd78801a2c48b
Author: Dan Klco <[email protected]>
AuthorDate: Fri Mar 17 13:06:46 2023 -0400
SLING-11797 - Adding a log message at INFO when a job is added which has no
assigned topic (#25)
* SLING-11797 - Adding a log message at INFO when a job is added which has
no assigned topic
* Adding test case coverage
* Removing unused imports
* Refactoring to reuse log check and make getJobManager method private
---
.../sling/event/impl/jobs/JobManagerImpl.java | 12 +-
.../java/org/apache/sling/event/impl/TestUtil.java | 18 +++
.../sling/event/impl/jobs/JobManagerImplTest.java | 132 +++++++++++++++++++--
.../org/apache/sling/event/it/JobHandlingIT.java | 41 +++++--
4 files changed, 183 insertions(+), 20 deletions(-)
diff --git a/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java
b/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java
index a396fc5..4f4ad08 100644
--- a/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java
+++ b/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java
@@ -580,12 +580,12 @@ public class JobManagerImpl
final TopologyCapabilities caps =
this.configuration.getTopologyCapabilities();
info.targetId = (caps == null ? null : caps.detectTarget(jobTopic,
jobProperties, info));
- if ( logger.isDebugEnabled() ) {
- if ( info.targetId != null ) {
- logger.debug("Persisting job {} into queue {}, target={}", new
Object[] {Utility.toString(jobTopic, jobProperties), info.queueName,
info.targetId});
- } else {
- logger.debug("Persisting job {} into queue {}",
Utility.toString(jobTopic, jobProperties), info.queueName);
- }
+ if (info.targetId == null && logger.isInfoEnabled()) {
+ logger.info("Persisting job {} into queue {} with no assigned
target",
+ Utility.toString(jobTopic, jobProperties), info.queueName);
+ } else if (info.targetId != null && logger.isDebugEnabled()) {
+ logger.debug("Persisting job {} into queue {}, target={}",
+ Utility.toString(jobTopic, jobProperties), info.queueName,
info.targetId);
}
final ResourceResolver resolver =
this.configuration.createResourceResolver();
try {
diff --git a/src/test/java/org/apache/sling/event/impl/TestUtil.java
b/src/test/java/org/apache/sling/event/impl/TestUtil.java
index 4be099f..79ee8bb 100644
--- a/src/test/java/org/apache/sling/event/impl/TestUtil.java
+++ b/src/test/java/org/apache/sling/event/impl/TestUtil.java
@@ -18,7 +18,13 @@
*/
package org.apache.sling.event.impl;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
import java.lang.reflect.Field;
+import java.util.function.Predicate;
public class TestUtil {
@@ -50,4 +56,16 @@ public class TestUtil {
public static Object getFieldValue(final Object obj, final String
fieldName) {
return getSetField(obj, fieldName, true, null);
}
+
+ public static boolean containsLine(ByteArrayOutputStream os,
Predicate<String> matcher) throws IOException {
+ try (BufferedReader reader = new BufferedReader(new
InputStreamReader(new ByteArrayInputStream(os.toByteArray())))) {
+ while (reader.ready()) {
+ String line = reader.readLine();
+ if (matcher.test(line)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
}
diff --git
a/src/test/java/org/apache/sling/event/impl/jobs/JobManagerImplTest.java
b/src/test/java/org/apache/sling/event/impl/jobs/JobManagerImplTest.java
index 2ac24ea..fb391d5 100644
--- a/src/test/java/org/apache/sling/event/impl/jobs/JobManagerImplTest.java
+++ b/src/test/java/org/apache/sling/event/impl/jobs/JobManagerImplTest.java
@@ -19,27 +19,145 @@
package org.apache.sling.event.impl.jobs;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.commons.lang.reflect.FieldUtils;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.event.impl.TestUtil;
+import org.apache.sling.event.impl.jobs.config.InternalQueueConfiguration;
+import org.apache.sling.event.impl.jobs.config.JobManagerConfiguration;
+import org.apache.sling.event.impl.jobs.config.QueueConfigurationManager;
+import
org.apache.sling.event.impl.jobs.config.QueueConfigurationManager.QueueInfo;
+import org.apache.sling.event.impl.jobs.config.TopologyCapabilities;
import org.apache.sling.event.jobs.JobManager.QueryType;
+import org.junit.After;
+import org.junit.Before;
import org.junit.Test;
+import org.slf4j.Logger;
public class JobManagerImplTest {
-
private static final String QUERY_ROOT = "/var/eventing/foobar";
private static final QueryType QUERY_TYPE = QueryType.ACTIVE;
-
+
+ private QueueInfo info;
+ private TopologyCapabilities capabilities;
+ private PrintStream originalErr;
+ private ByteArrayOutputStream outContent;
+ private JobManagerConfiguration configuration;
+
+ private static final int LEVEL_DEBUG = 10;
+ private static final int LEVEL_INFO = 20;
+ private static final int LEVEL_WARN = 30;
+
+ @Before
+ public void init() throws IllegalAccessException {
+
+ configuration = mock(JobManagerConfiguration.class);
+ when(configuration.getUniquePath(any(), any(), any(),
any())).thenReturn("/");
+ when(configuration.getUniqueId(any())).thenReturn("1");
+ when(configuration.getAuditLogger()).thenReturn(mock(Logger.class));
+
+ QueueConfigurationManager queueConfigMgr =
mock(QueueConfigurationManager.class);
+ this.info = new QueueInfo();
+ info.queueConfiguration = mock(InternalQueueConfiguration.class);
+ when(queueConfigMgr.getQueueInfo(anyString())).thenReturn(info);
+
when(configuration.getQueueConfigurationManager()).thenReturn(queueConfigMgr);
+
+ this.capabilities = mock(TopologyCapabilities.class);
+ when(configuration.getTopologyCapabilities()).thenReturn(capabilities);
+
+ when(capabilities.detectTarget(eq("is/assigned"), any(),
any())).thenReturn("assigned");
+
+ ResourceResolver resolver = mock(ResourceResolver.class);
+
when(resolver.getResource(anyString())).thenReturn(mock(Resource.class));
+ when(configuration.createResourceResolver()).thenReturn(resolver);
+
+ this.outContent = new ByteArrayOutputStream();
+ this.originalErr = System.err;
+ System.setErr(new PrintStream(outContent));
+
+ }
+
// SLING-8413
@Test
public void testTopicEscaping() {
String baseQuery = JobManagerImpl.buildBaseQuery(QUERY_ROOT,
"randomNonQuotedTopic", QUERY_TYPE, false);
-
assertEquals("/jcr:root/var/eventing/foobar/element(*,slingevent:Job)[@event.job.topic
= "
- + "'randomNonQuotedTopic' and not(@slingevent:finishedState)
and @event.job.started.time",baseQuery);
+ assertEquals(
+
"/jcr:root/var/eventing/foobar/element(*,slingevent:Job)[@event.job.topic = "
+ + "'randomNonQuotedTopic' and
not(@slingevent:finishedState) and @event.job.started.time",
+ baseQuery);
String baseQuery2 = JobManagerImpl.buildBaseQuery(QUERY_ROOT,
"random'Topic", QUERY_TYPE, false);
assertEquals("/jcr:root/var/eventing/foobar/element(*,slingevent:Job)[@event.job.topic
= "
- + "'random''Topic' and not(@slingevent:finishedState) and
@event.job.started.time",baseQuery2);
-
+ + "'random''Topic' and not(@slingevent:finishedState) and
@event.job.started.time", baseQuery2);
+
}
-
+
+ @Test
+ public void wontLogAtWarn() throws IllegalAccessException, IOException,
NoSuchMethodException, SecurityException,
+ IllegalArgumentException, InvocationTargetException {
+ JobManagerImpl jobManager = getJobManager(LEVEL_WARN);
+
+ jobManager.addJob("not/assigned", null, null);
+ assertFalse(TestUtil.containsLine(this.outContent, line -> line
+ .contains("Persisting job Sling Job [topic=not/assigned] into
queue null with no assigned target")));
+
+ jobManager.addJob("is/assigned", null, null);
+ assertFalse(TestUtil.containsLine(this.outContent, line -> line
+ .contains("Persisting job Sling Job [topic=is/assigned] into
queue null with no assigned target")));
+ }
+
+ @Test
+ public void logsInfoForUnassigned() throws IllegalAccessException,
IOException, NoSuchMethodException,
+ SecurityException, IllegalArgumentException,
InvocationTargetException {
+ JobManagerImpl jobManager = getJobManager(LEVEL_INFO);
+ jobManager.addJob("not/assigned", null, null);
+ assertTrue(TestUtil.containsLine(this.outContent, line -> line
+ .contains("Persisting job Sling Job [topic=not/assigned] into
queue null with no assigned target")));
+
+ jobManager.addJob("is/assigned", null, null);
+ assertTrue(TestUtil.containsLine(this.outContent, line -> !line
+ .contains("Persisting job Sling Job [topic=is/assigned] into
queue null with no assigned target")));
+ }
+
+ @Test
+ public void logsDebugForAssigned() throws IllegalAccessException,
IOException, NoSuchMethodException,
+ SecurityException, IllegalArgumentException,
InvocationTargetException {
+ JobManagerImpl jobManager = getJobManager(LEVEL_DEBUG);
+
+ jobManager.addJob("is/assigned", null, null);
+ assertTrue(TestUtil.containsLine(this.outContent, line -> line
+ .contains("Persisting job Sling Job [topic=is/assigned] into
queue null, target=assigned")));
+ }
+
+ @After
+ public void after() throws NoSuchMethodException, IllegalAccessException,
InvocationTargetException {
+ System.setErr(originalErr);
+ }
+
+ private JobManagerImpl getJobManager(int level) throws
IllegalAccessException, NoSuchMethodException,
+ SecurityException, IllegalArgumentException,
InvocationTargetException {
+
+ JobManagerImpl jobManager = new JobManagerImpl();
+
+ Object logger = FieldUtils.readDeclaredField(jobManager, "logger",
true);
+ FieldUtils.writeDeclaredField(logger, "currentLogLevel", level, true);
+
+ FieldUtils.writeDeclaredField(jobManager, "configuration",
configuration, true);
+ return jobManager;
+ }
+
}
diff --git a/src/test/java/org/apache/sling/event/it/JobHandlingIT.java
b/src/test/java/org/apache/sling/event/it/JobHandlingIT.java
index 99a6bc4..d8abbca 100644
--- a/src/test/java/org/apache/sling/event/it/JobHandlingIT.java
+++ b/src/test/java/org/apache/sling/event/it/JobHandlingIT.java
@@ -18,16 +18,28 @@
*/
package org.apache.sling.event.it;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static
org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Predicate;
import org.apache.sling.event.impl.Barrier;
+import org.apache.sling.event.impl.TestUtil;
import org.apache.sling.event.impl.jobs.config.ConfigurationConstants;
import org.apache.sling.event.jobs.Job;
+import org.apache.sling.event.jobs.Job.JobState;
import org.apache.sling.event.jobs.JobManager;
import org.apache.sling.event.jobs.NotificationConstants;
import org.apache.sling.event.jobs.QueueConfiguration;
@@ -47,13 +59,6 @@ import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.ops4j.pax.exam.CoreOptions.options;
-import static
org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
-
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerMethod.class)
public class JobHandlingIT extends AbstractJobHandlingIT {
@@ -426,4 +431,26 @@ public class JobHandlingIT extends AbstractJobHandlingIT {
assertEquals("Unprocessed count", 0,
jobManager.getStatistics().getNumberOfJobs());
assertEquals("Finished count", COUNT / 2,
jobManager.getStatistics().getNumberOfFinishedJobs());
}
+
+ @Test(timeout = DEFAULT_TEST_TIMEOUT)
+ public void testNoJobProcessorLog() throws Exception {
+
+ ByteArrayOutputStream outContent = new ByteArrayOutputStream();
+ PrintStream originalOut = System.out;
+
+ try {
+ System.setOut(new PrintStream(outContent));
+
+ Job job = jobManager.addJob("no/consumer/registered", null);
+ assertEquals(JobState.QUEUED, job.getJobState());
+
+ Predicate<String> matcher = (line) -> line.contains(
+ "Persisting job Sling Job [topic=no/consumer/registered]
into queue <main queue> with no assigned target");
+ assertTrue(TestUtil.containsLine(outContent, matcher));
+
+ } finally {
+ System.setOut(originalOut);
+ }
+ }
+
}
\ No newline at end of file