blob: 948d953d6e0fd0eb3a19afd081900ec9f824418c [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.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.lang.annotation.Annotation;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class InternalQueueConfigurationTest {
private InternalQueueConfiguration.Config createConfig(final double maxParallel) {
return createConfig(null, "QueueConfigurationTest", maxParallel);
}
private InternalQueueConfiguration.Config createConfig(final String[] topics) {
return createConfig(topics, "QueueConfigurationTest", ConfigurationConstants.DEFAULT_MAX_PARALLEL);
}
private InternalQueueConfiguration.Config createConfig(final String[] topics, final String name) {
return createConfig(topics, name, ConfigurationConstants.DEFAULT_MAX_PARALLEL);
}
private InternalQueueConfiguration.Config createConfig(final String[] topics,
final String name,
final double maxParallel) {
return new InternalQueueConfiguration.Config() {
@Override
public Class<? extends Annotation> annotationType() {
return InternalQueueConfiguration.Config.class;
}
@Override
public String queue_name() {
return name;
}
@Override
public String[] queue_topics() {
return topics;
}
@Override
public String queue_type() {
return "UNORDERED";
}
@Override
public String queue_priority() {
return ConfigurationConstants.DEFAULT_PRIORITY;
}
@Override
public int queue_retries() {
return ConfigurationConstants.DEFAULT_RETRIES;
}
@Override
public long queue_retrydelay() {
return ConfigurationConstants.DEFAULT_RETRY_DELAY;
}
@Override
public double queue_maxparallel() {
return maxParallel;
}
@Override
public boolean queue_keepJobs() {
return false;
}
@Override
public boolean queue_preferRunOnCreationInstance() {
return false;
}
@Override
public int queue_threadPoolSize() {
return 0;
}
@Override
public int service_ranking() {
return 0;
}
@Override
public String webconsole_configurationFactory_nameHint() {
return null;
}
};
}
@org.junit.Test public void testMaxParallel() {
InternalQueueConfiguration c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(-1));
assertEquals(Runtime.getRuntime().availableProcessors(), c.getMaxParallel());
// Edge cases 0.0 and 1.0 (treated as int numbers)
c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(0.0));
assertEquals(0, c.getMaxParallel());
c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(1.0));
assertEquals(1, c.getMaxParallel());
// percentage (50%)
c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(0.5));
assertEquals((int) Math.round(Runtime.getRuntime().availableProcessors() * 0.5), c.getMaxParallel());
// rounding
c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(0.90));
assertEquals((int) Math.round(Runtime.getRuntime().availableProcessors() * 0.9), c.getMaxParallel());
c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(0.99));
assertEquals((int) Math.round(Runtime.getRuntime().availableProcessors() * 0.99), c.getMaxParallel());
// Percentages can't go over 99% (0.99)
c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(1.01));
assertEquals(Runtime.getRuntime().availableProcessors(), c.getMaxParallel());
// Treat negative values same a -1 (all cores)
c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(-0.5));
assertEquals(Runtime.getRuntime().availableProcessors(), c.getMaxParallel());
c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(-2));
assertEquals(Runtime.getRuntime().availableProcessors(), c.getMaxParallel());
}
@org.junit.Test public void testTopicMatchersDot() {
InternalQueueConfiguration c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(new String[] {"a."}));
assertTrue(c.isValid());
assertNotNull(c.match("a/b"));
assertNotNull(c.match("a/c"));
assertNull(c.match("a"));
assertNull(c.match("a/b/c"));
assertNull(c.match("t"));
assertNull(c.match("t/x"));
}
@org.junit.Test public void testTopicMatchersStar() {
InternalQueueConfiguration c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(new String[] {"a*"}));
assertTrue(c.isValid());
assertNotNull(c.match("a/b"));
assertNotNull(c.match("a/c"));
assertNull(c.match("a"));
assertNotNull(c.match("a/b/c"));
assertNull(c.match("t"));
assertNull(c.match("t/x"));
}
@org.junit.Test public void testTopicMatchers() {
InternalQueueConfiguration c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(new String[] {"a"}));
assertTrue(c.isValid());
assertNull(c.match("a/b"));
assertNull(c.match("a/c"));
assertNotNull(c.match("a"));
assertNull(c.match("a/b/c"));
assertNull(c.match("t"));
assertNull(c.match("t/x"));
}
@org.junit.Test public void testTopicMatcherAndReplacement() {
InternalQueueConfiguration c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(new String[] {"a."}, "test-queue-{0}"));
assertTrue(c.isValid());
final String b = "a/b";
assertNotNull(c.match(b));
assertEquals("test-queue-b", c.match(b));
final String d = "a/d";
assertNotNull(c.match(d));
assertEquals("test-queue-d", c.match(d));
}
@org.junit.Test public void testTopicMatchersDotAndSlash() {
InternalQueueConfiguration c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(new String[] {"a/."}));
assertTrue(c.isValid());
assertNotNull(c.match("a/b"));
assertNotNull(c.match("a/c"));
assertNull(c.match("a"));
assertNull(c.match("a/b/c"));
assertNull(c.match("t"));
assertNull(c.match("t/x"));
}
@org.junit.Test public void testTopicMatchersStarAndSlash() {
final Map<String, Object> p = new HashMap<>();
p.put(ConfigurationConstants.PROP_TOPICS, new String[] {"a/*"});
p.put(ConfigurationConstants.PROP_NAME, "test");
InternalQueueConfiguration c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(new String[] {"a/*"}));
assertTrue(c.isValid());
assertNotNull(c.match("a/b"));
assertNotNull(c.match("a/c"));
assertNull(c.match("a"));
assertNotNull(c.match("a/b/c"));
assertNull(c.match("t"));
assertNull(c.match("t/x"));
}
@org.junit.Test public void testTopicMatcherAndReplacementAndSlash() {
InternalQueueConfiguration c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(new String[] {"a/."}, "test-queue-{0}"));
assertTrue(c.isValid());
final String b = "a/b";
assertNotNull(c.match(b));
assertEquals("test-queue-b", c.match(b));
final String d = "a/d";
assertNotNull(c.match(d));
assertEquals("test-queue-d", c.match(d));
}
@org.junit.Test public void testNoTopicMatchers() {
final Map<String, Object> p = new HashMap<>();
p.put(ConfigurationConstants.PROP_NAME, "test");
InternalQueueConfiguration c = InternalQueueConfiguration.fromConfiguration(Collections.<String, Object>emptyMap(), createConfig(null));
assertFalse(c.isValid());
}
}