/*
* 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.ignite.spi.collision.priorityqueue;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.apache.ignite.GridTestJobContext;
import org.apache.ignite.spi.collision.CollisionJobContext;
import org.apache.ignite.spi.collision.GridCollisionTestContext;
import org.apache.ignite.spi.collision.GridTestCollisionJobContext;
import org.apache.ignite.spi.collision.GridTestCollisionTaskSession;
import org.apache.ignite.testframework.junits.spi.GridSpiAbstractTest;
import org.apache.ignite.testframework.junits.spi.GridSpiTest;
import org.jetbrains.annotations.Nullable;
import static org.apache.ignite.spi.collision.priorityqueue.PriorityQueueCollisionSpi.DFLT_JOB_PRIORITY_ATTRIBUTE_KEY;
import static org.apache.ignite.spi.collision.priorityqueue.PriorityQueueCollisionSpi.DFLT_PARALLEL_JOBS_NUM;
import static org.apache.ignite.spi.collision.priorityqueue.PriorityQueueCollisionSpi.DFLT_PRIORITY_ATTRIBUTE_KEY;
import static org.apache.ignite.spi.collision.priorityqueue.PriorityQueueCollisionSpi.DFLT_STARVATION_INCREMENT;
/**
* Priority queue collision SPI test.
*/
@GridSpiTest(spi = PriorityQueueCollisionSpi.class, group = "Collision SPI")
public class GridPriorityQueueCollisionSpiSelfTest extends GridSpiAbstractTest<PriorityQueueCollisionSpi> {
/** {@inheritDoc} */
@Override protected void afterTest() throws Exception {
getSpi().setParallelJobsNumber(DFLT_PARALLEL_JOBS_NUM);
}
/**
* @throws Exception If failed.
*/
@SuppressWarnings({"TooBroadScope"})
public void testCollisionAttributeName() throws Exception {
String taskAttrKey = "testTaskPriority";
String jobAttrKey = "testJobPriority";
List<CollisionJobContext> activeJobs = makeContextList(taskAttrKey);
List<CollisionJobContext> passiveJobs = makeContextList(taskAttrKey);
getSpi().setParallelJobsNumber(12);
getSpi().setPriorityAttributeKey(taskAttrKey);
getSpi().setJobPriorityAttributeKey(jobAttrKey);
getSpi().onCollision(new GridCollisionTestContext(activeJobs, passiveJobs));
int incVal = getSpi().getStarvationIncrement();
for (CollisionJobContext ctx : passiveJobs) {
if (((GridTestCollisionTaskSession)ctx.getTaskSession()).getPriority() >= 8) {
assert ((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
else {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
Integer p = ctx.getJobContext().getAttribute(jobAttrKey);
if (p != null)
assert p == incVal + ((GridTestCollisionTaskSession)ctx.getTaskSession()).getPriority();
}
for (CollisionJobContext ctx : activeJobs) {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
getSpi().setPriorityAttributeKey(DFLT_PRIORITY_ATTRIBUTE_KEY);
getSpi().setJobPriorityAttributeKey(DFLT_JOB_PRIORITY_ATTRIBUTE_KEY);
}
/**
* @throws Exception If failed.
*/
public void testCollision() throws Exception {
List<CollisionJobContext> activeJobs = makeContextList(null);
List<CollisionJobContext> passiveJobs = makeContextList(null);
getSpi().setParallelJobsNumber(20);
getSpi().onCollision(new GridCollisionTestContext(activeJobs, passiveJobs));
for (CollisionJobContext ctx : passiveJobs) {
assert ((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
for (CollisionJobContext ctx : activeJobs) {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
}
/**
* @throws Exception If failed.
*/
public void testCollision0() throws Exception {
List<CollisionJobContext> activeJobs = makeContextList(null);
List<CollisionJobContext> passiveJobs = makeContextList(null);
getSpi().setParallelJobsNumber(30);
getSpi().onCollision(new GridCollisionTestContext(activeJobs, passiveJobs));
for (CollisionJobContext ctx : passiveJobs) {
assert ((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
for (CollisionJobContext ctx : activeJobs) {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
}
/**
* @throws Exception If failed.
*/
@SuppressWarnings({"RedundantTypeArguments"})
public void testCollision1() throws Exception {
List<CollisionJobContext> activeJobs = makeContextList(null);
List<CollisionJobContext> passiveJobs = makeContextList(null);
getSpi().setParallelJobsNumber(12);
getSpi().onCollision(new GridCollisionTestContext(activeJobs, passiveJobs));
int incVal = getSpi().getStarvationIncrement();
String jobAttrKey = DFLT_JOB_PRIORITY_ATTRIBUTE_KEY;
for (CollisionJobContext ctx : passiveJobs) {
if (((GridTestCollisionTaskSession)ctx.getTaskSession()).getPriority() >= 8) {
assert ((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
else {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
Integer p = ctx.getJobContext().<String, Integer>getAttribute(jobAttrKey);
if (p != null)
assert p == incVal + ((GridTestCollisionTaskSession)ctx.getTaskSession()).getPriority();
}
for (CollisionJobContext ctx : activeJobs) {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
}
/**
* @throws Exception If failed.
*/
public void testCollision2() throws Exception {
List<CollisionJobContext> activeJobs = makeContextList(null);
List<CollisionJobContext> passiveJobs = makeContextList(null);
getSpi().setParallelJobsNumber(10);
getSpi().onCollision(new GridCollisionTestContext(activeJobs, passiveJobs));
for (CollisionJobContext ctx : passiveJobs) {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
for (CollisionJobContext ctx : activeJobs) {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
}
/**
* @throws Exception If failed.
*/
public void testCollision3() throws Exception {
List<CollisionJobContext> activeJobs = makeContextList(null);
List<CollisionJobContext> passiveJobs = makeContextList(null);
getSpi().setParallelJobsNumber(5);
getSpi().onCollision(new GridCollisionTestContext(activeJobs, passiveJobs));
for (CollisionJobContext ctx : passiveJobs) {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
for (CollisionJobContext ctx : activeJobs) {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
}
/**
* @throws Exception If failed.
*/
public void testCollisionEmpty() throws Exception {
Collection<CollisionJobContext> activeJobs = new ArrayList<>();
Collection<CollisionJobContext> passiveJobs = new ArrayList<>();
getSpi().onCollision(new GridCollisionTestContext(activeJobs, passiveJobs));
assert activeJobs.isEmpty();
assert passiveJobs.isEmpty();
}
/**
* @throws Exception If failed.
*/
public void testCollisionWithoutPriorityAttribute() throws Exception {
List<CollisionJobContext> activeJobs = makeContextList(null);
List<CollisionJobContext> passiveJobs = makeContextList(null);
for (CollisionJobContext ctx : passiveJobs) {
if (((GridTestCollisionTaskSession)ctx.getTaskSession()).getPriority() >= 8) {
((GridTestCollisionTaskSession)ctx.getTaskSession()).setPriorityAttributeKey("bad-attr-name");
((GridTestCollisionJobContext)ctx).setJobContext(new GridTestJobContext() {
@SuppressWarnings({"unchecked", "RedundantTypeArguments"})
@Override public <K, V> V getAttribute(K key) {
if (DFLT_JOB_PRIORITY_ATTRIBUTE_KEY.equals(key))
return null;
return super.<K, V>getAttribute(key);
}
});
}
}
getSpi().setParallelJobsNumber(12);
getSpi().setDefaultPriority(100);
getSpi().onCollision(new GridCollisionTestContext(activeJobs, passiveJobs));
for (CollisionJobContext ctx : passiveJobs) {
if (((GridTestCollisionTaskSession)ctx.getTaskSession()).getPriority() >= 8) {
assert ((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
else {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
}
for (CollisionJobContext ctx : activeJobs) {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
}
/**
* @throws Exception If failed.
*/
public void testCollisionWithWrongPriorityAttribute() throws Exception {
List<CollisionJobContext> activeJobs = makeContextList(null);
List<CollisionJobContext> passiveJobs = makeContextList(null);
for (CollisionJobContext ctx : passiveJobs) {
if (((GridTestCollisionTaskSession)ctx.getTaskSession()).getPriority() >= 8) {
((GridTestCollisionJobContext)ctx).setTaskSession(new GridTestCollisionTaskSession(100,
DFLT_PRIORITY_ATTRIBUTE_KEY) {
@SuppressWarnings("unchecked")
@Override public <K, V> V getAttribute(K key) {
if (getPriorityAttributeKey() != null && getPriorityAttributeKey().equals(key))
return (V)"wrong-attr";
return null;
}
});
((GridTestCollisionJobContext)ctx).setJobContext(new GridTestJobContext() {
@SuppressWarnings({"unchecked", "RedundantTypeArguments"})
@Override public <K, V> V getAttribute(K key) {
if (DFLT_JOB_PRIORITY_ATTRIBUTE_KEY.equals(key))
return (V)"wrong-attr";
return super.<K, V>getAttribute(key);
}
});
}
}
getSpi().setParallelJobsNumber(12);
getSpi().setDefaultPriority(100);
getSpi().onCollision(new GridCollisionTestContext(activeJobs, passiveJobs));
for (CollisionJobContext ctx : passiveJobs) {
if (((GridTestCollisionTaskSession)ctx.getTaskSession()).getPriority() >= 8) {
assert ((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
else {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
}
for (CollisionJobContext ctx : activeJobs) {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
}
/**
* @throws Exception If failed.
*/
@SuppressWarnings({"TooBroadScope"})
public void testCollision4() throws Exception {
List<CollisionJobContext> activeJobs = makeContextList(null, false);
List<CollisionJobContext> passiveJobs = makeContextList(null, false);
int incVal = 2;
getSpi().setParallelJobsNumber(12);
getSpi().setStarvationIncrement(incVal);
getSpi().onCollision(new GridCollisionTestContext(activeJobs, passiveJobs));
String jobAttrKey = DFLT_JOB_PRIORITY_ATTRIBUTE_KEY;
for (CollisionJobContext ctx : passiveJobs) {
int taskP = ((GridTestCollisionTaskSession)ctx.getTaskSession()).getPriority();
if (taskP >= 8) {
assert ((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
else {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
if (taskP < 5) {
Integer p = ctx.getJobContext().getAttribute(jobAttrKey);
assert p != null;
assert p == incVal + taskP;
}
}
for (CollisionJobContext ctx : activeJobs) {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
getSpi().setStarvationIncrement(DFLT_STARVATION_INCREMENT);
}
/**
* @throws Exception If failed.
*/
public void testCollision5() throws Exception {
List<CollisionJobContext> activeJobs = makeContextList(null, false);
List<CollisionJobContext> passiveJobs = makeContextList(null, false);
getSpi().setParallelJobsNumber(12);
getSpi().setStarvationPreventionEnabled(false);
getSpi().onCollision(new GridCollisionTestContext(activeJobs, passiveJobs));
String jobAttrKey = DFLT_JOB_PRIORITY_ATTRIBUTE_KEY;
for (CollisionJobContext ctx : passiveJobs) {
int taskP = ((GridTestCollisionTaskSession)ctx.getTaskSession()).getPriority();
if (taskP >= 8) {
assert ((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
else {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
assert ctx.getJobContext().<String, Integer>getAttribute(jobAttrKey) == null;
}
for (CollisionJobContext ctx : activeJobs) {
assert !((GridTestCollisionJobContext)ctx).isActivated();
assert !((GridTestCollisionJobContext)ctx).isCanceled();
}
}
/**
* @param attrKey Attribute key,
* @param shuffle Whether result list should be shuffle.
* @return List of job collision contexts.
*/
private List<CollisionJobContext> makeContextList(@Nullable String attrKey, boolean shuffle) {
if (attrKey == null)
attrKey = DFLT_PRIORITY_ATTRIBUTE_KEY;
List<CollisionJobContext> jobs = new ArrayList<>();
for (int i = 0; i < 10; i++)
jobs.add(new GridTestCollisionJobContext(new GridTestCollisionTaskSession(i, attrKey)));
if (shuffle)
Collections.shuffle(jobs);
return jobs;
}
/**
* @param attrKey Attribute key.
* @return List of job collision contexts.
*/
private List<CollisionJobContext> makeContextList(@Nullable String attrKey) {
return makeContextList(attrKey, true);
}
}