com.groupbyinc.common.test.CircleCIParallelRule Maven / Gradle / Ivy
package com.groupbyinc.common.test;
import org.apache.commons.lang3.StringUtils;
import org.junit.Assume;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class CircleCIParallelRule implements TestRule {
private static final transient Logger LOG = LoggerFactory.getLogger(CircleCIParallelRule.class);
private Statement skipTest(int currentNode, int targetNode) {
return new Statement() {
@Override
public void evaluate() {
Assume.assumeTrue("Skipping test, currentNode: " + currentNode + ", targetNode: " + targetNode, false);
}
};
}
@Override
public Statement apply(Statement statement, Description description) {
String circleNodeTotal = System.getenv("CIRCLE_NODE_TOTAL");
String circleNodeIndex = System.getenv("CIRCLE_NODE_INDEX");
if (StringUtils.isBlank(circleNodeIndex) || StringUtils.isBlank(circleNodeTotal)) {
LOG.trace("Running locally, so skipping");
return statement;
} else {
String testName = description.getClassName() + "#" + description.getMethodName();
int currentNode = Integer.parseInt(circleNodeIndex);
int targetNode = Math.abs(testName.hashCode()) % Integer.parseInt(circleNodeTotal);
return currentNode == targetNode ? statement : skipTest(currentNode, targetNode);
}
}
}