blob: 8c27b90145240a0d2be06db9164e6af77d288072 [file] [log] [blame]
/*
* 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.event.impl.jobs.console;
import org.apache.felix.inventory.Format;
import org.apache.sling.event.impl.JsonTestBase;
import org.apache.sling.event.impl.jobs.JobConsumerManager;
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.jobs.JobManager;
import org.apache.sling.event.jobs.Queue;
import org.apache.sling.event.jobs.QueueConfiguration;
import org.apache.sling.event.jobs.ScheduleInfo;
import org.apache.sling.event.jobs.ScheduledJobInfo;
import org.apache.sling.event.jobs.Statistics;
import org.apache.sling.event.jobs.TopicStatistics;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.jayway.jsonpath.matchers.JsonPathMatchers.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
public class InventoryPluginTest extends JsonTestBase {
@Mock
private JobManager jobManager;
@Mock
private JobManagerConfiguration configuration;
@Mock
private JobConsumerManager jobConsumerManager;
@InjectMocks
private InventoryPlugin inventoryPlugin;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
Mockito.when(jobManager.getStatistics()).thenReturn(Mockito.mock(Statistics.class));
Queue mockQueue = Mockito.mock(Queue.class);
Mockito.when(mockQueue.getStatistics()).thenReturn(Mockito.mock(Statistics.class));
ScheduledJobInfo mockScheduledJobInfo = Mockito.mock(ScheduledJobInfo.class);
Mockito.when(mockScheduledJobInfo.getJobTopic()).thenReturn("topic");
ScheduleInfo mockScheduleInfo1 = Mockito.mock(ScheduleInfo.class);
Mockito.when(mockScheduleInfo1.getType()).thenReturn(ScheduleInfo.ScheduleType.HOURLY);
Mockito.when(mockScheduleInfo1.getMinuteOfHour()).thenReturn(40);
ScheduleInfo mockScheduleInfo2 = Mockito.mock(ScheduleInfo.class);
Mockito.when(mockScheduleInfo2.getType()).thenReturn(ScheduleInfo.ScheduleType.CRON);
Mockito.when(mockScheduleInfo2.getExpression()).thenReturn("0 * * * *");
Mockito.when(mockScheduledJobInfo.getSchedules()).thenReturn(new ArrayList<>(Arrays.asList(mockScheduleInfo1,
mockScheduleInfo2)));
Mockito.when(jobManager.getScheduledJobs()).thenReturn(new ArrayList<>(Arrays.asList(mockScheduledJobInfo)));
QueueConfiguration mockConfiguration = Mockito.mock(QueueConfiguration.class);
Mockito.when(mockConfiguration.getType()).thenReturn(QueueConfiguration.Type.ORDERED);
Mockito.when(mockConfiguration.getTopics()).thenReturn(new String[]{"topic-1", "topic-2"});
Mockito.when(mockQueue.getConfiguration()).thenReturn(mockConfiguration);
Mockito.when(jobManager.getQueues()).thenReturn(new ArrayList<>(Arrays.asList(mockQueue)));
TopicStatistics topicStatistics = Mockito.mock(TopicStatistics.class);
Mockito.when(jobManager.getTopicStatistics()).thenReturn(new ArrayList<>(Arrays.asList(topicStatistics)));
QueueConfigurationManager mockQueueConfigurationManager = Mockito.mock(QueueConfigurationManager.class);
InternalQueueConfiguration mockMainInternalQueueConfiguration = Mockito.mock(InternalQueueConfiguration.class);
Mockito.when(mockMainInternalQueueConfiguration.getType()).thenReturn(QueueConfiguration.Type.ORDERED);
Mockito.when(mockQueueConfigurationManager.getMainQueueConfiguration()).thenReturn(mockMainInternalQueueConfiguration);
InternalQueueConfiguration mockConfigInternalQueueConfiguration =
Mockito.mock(InternalQueueConfiguration.class);
Mockito.when(mockConfigInternalQueueConfiguration.getType()).thenReturn(QueueConfiguration.Type.ORDERED);
Mockito.when(mockQueueConfigurationManager.getConfigurations()).thenReturn(new InternalQueueConfiguration[]{mockConfigInternalQueueConfiguration});
Mockito.when(configuration.getQueueConfigurationManager()).thenReturn(mockQueueConfigurationManager);
}
@Test
public void printTextFormat() {
StringWriter writerOutput = new StringWriter();
PrintWriter printWriter = new PrintWriter(writerOutput);
inventoryPlugin.print(printWriter, Format.TEXT, false);
List<String> outputContains = new ArrayList<String>() {{
add("Apache Sling Job Handling");
add("Overall Statistics");
add("Local topic consumers:");
add("Queued Jobs : 0");
add("Active Jobs : 0");
add("Jobs : 0");
add("Finished Jobs : 0");
add("Failed Jobs : 0");
add("Cancelled Jobs : 0");
add("Processed Jobs : 0");
add("Topology Capabilities");
add("No topology information available");
add("Scheduled Jobs");
add("Job Topic< : topic");
add("Schedules : HOURLY 40, CRON 0 * * * *");
add("Apache Sling Job Handling - Job Queue Configurations");
add("Valid : false");
add("Type : Ordered");
add("Max Parallel : 0");
add("Max Retries : 0");
add("Retry Delay : 0 ms");
add("Ranking : 0");
}};
String text = writerOutput.toString();
outputContains.forEach((e) -> {
assertThat(text, containsString(e));
});
}
@Test
public void printJsonFormat() {
try {
final String json = queryInventoryJSON(inventoryPlugin);
Map<String, Object> expectedJsonPaths = new HashMap<String, Object>(){{
put("$.statistics", null);
put("$.statistics.startTime", 0);
put("$.statistics.lastActivatedJobTime", 0);
put("$.statistics.lastFinishedJobTime", 0);
put("$.statistics.numberOfQueuedJobs", 0);
put("$.statistics.numberOfActiveJobs", 0);
put("$.statistics.numberOfJobs", 0);
put("$.statistics.numberOfFinishedJobs", 0);
put("$.statistics.numberOfFailedJobs", 0);
put("$.statistics.numberOfCancelledJobs", 0);
put("$.statistics.numberOfProcessedJobs", 0);
put("$.statistics.averageProcessingTime", 0);
put("$.statistics.averageWaitingTime", 0);
put("$.scheduledJobs", null);
put("$.scheduledJobs[0].jobTopic", "topic");
put("$.scheduledJobs[0].schedules", null);
put("$.scheduledJobs[0].schedules[0].type", "HOURLY");
put("$.scheduledJobs[0].schedules[0].schedule", "40");
put("$.scheduledJobs[0].schedules[1].type", "CRON");
put("$.scheduledJobs[0].schedules[1].schedule", "0 * * * *");
put("$.queues", null);
put("$.queues[0].suspended", false);
put("$.queues[0].statistics", null);
put("$.queues[0].statistics.startTime", 0);
put("$.queues[0].statistics.lastActivatedJobTime", 0);
put("$.queues[0].statistics.lastActivatedJobTime", 0);
put("$.queues[0].statistics.lastFinishedJobTime", 0);
put("$.queues[0].statistics.numberOfQueuedJobs", 0);
put("$.queues[0].statistics.numberOfActiveJobs", 0);
put("$.queues[0].statistics.numberOfJobs", 0);
put("$.queues[0].statistics.numberOfFinishedJobs", 0);
put("$.queues[0].statistics.numberOfFailedJobs", 0);
put("$.queues[0].statistics.numberOfCancelledJobs", 0);
put("$.queues[0].statistics.numberOfProcessedJobs", 0);
put("$.queues[0].statistics.averageProcessingTime", 0);
put("$.queues[0].statistics.averageWaitingTime", 0);
put("$.queues[0].configuration", null);
put("$.queues[0].configuration.type", "ORDERED");
put("$.queues[0].configuration.topics", new String[]{"topic-1", "topic-2"});
put("$.queues[0].configuration.maxParallel", 0);
put("$.queues[0].configuration.maxRetries", 0);
put("$.queues[0].configuration.retryDelayInMs", 0);
put("$.topicStatistics", null);
put("$.topicStatistics[0].lastActivatedJobTime", 0);
put("$.topicStatistics[0].lastFinishedJobTime", 0);
put("$.topicStatistics[0].numberOfFinishedJobs", 0);
put("$.topicStatistics[0].numberOfFailedJobs", 0);
put("$.topicStatistics[0].numberOfCancelledJobs", 0);
put("$.topicStatistics[0].numberOfProcessedJobs", 0);
put("$.topicStatistics[0].averageProcessingTime", 0);
put("$.topicStatistics[0].averageWaitingTime", 0);
put("$.configurations", null);
put("$.configurations[0].valid", false);
put("$.configurations[0].type", "ORDERED");
put("$.configurations[0].maxParallel", 0);
put("$.configurations[0].maxRetries", 0);
put("$.configurations[0].retryDelayInMs", 0);
put("$.configurations[0].ranking", 0);
put("$.configurations[1].valid", false);
put("$.configurations[1].type", "ORDERED");
put("$.configurations[1].maxParallel", 0);
put("$.configurations[1].maxRetries", 0);
put("$.configurations[1].retryDelayInMs", 0);
put("$.configurations[1].ranking", 0);
}};
expectedJsonPaths.forEach((k, v) -> {
if (v != null) {
if (v instanceof String[]) {
for (String val : (String[]) v) {
assertThat(json, isJson(withJsonPath(k, hasItem(val))));
}
} else {
assertThat(json, hasJsonPath(k, equalTo(v)));
}
} else {
assertThat(json, hasJsonPath(k));
}
});
} catch (Exception e) {
Assert.fail("Should not catch any exception. JSON format might be wrong. Error thrown: " + e.getMessage());
}
}
}