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

Reply via email to