net.thucydides.core.batches.TestCountBasedBatchManager Maven / Gradle / Ivy
package net.thucydides.core.batches;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import net.thucydides.core.util.EnvironmentVariables;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
@Singleton
public class TestCountBasedBatchManager extends SystemVariableBasedBatchManager {
private Map batchNumberTestCount = new HashMap();
private Map testCaseNumberBatchNumber = new HashMap();
@Inject
public TestCountBasedBatchManager(EnvironmentVariables environmentVariables) {
super(environmentVariables);
for (int i=0; i< batchCount; i++) {
batchNumberTestCount.put(i, new AtomicInteger(0));
}
}
public boolean shouldExecuteThisTest(int testCount) {
return (batchCount > 0) ? shouldExecuteThisTestInCurrentBatch(testCount) : true;
}
private synchronized boolean shouldExecuteThisTestInCurrentBatch(int testCount) {
if (!testCaseNumberBatchNumber.containsKey(getCurrentTestCaseNumber())) {
addTestCaseToOptimalBatch();
}
incTestMethodsSizeInBatch(testCount);
return (testCaseNumberBatchNumber.get(getCurrentTestCaseNumber()) == getActualBatchNumber());
}
private void addTestCaseToOptimalBatch() {
testCaseNumberBatchNumber.put(getCurrentTestCaseNumber(), getOptimalBatchForNewTestCase());
}
private int getOptimalBatchForNewTestCase() {
int batchNumber = 0;
AtomicInteger testMethodsSize = batchNumberTestCount.get(batchNumber);
for (Map.Entry entry : batchNumberTestCount.entrySet()) {
if (testMethodsSize.get() > entry.getValue().get()) {
batchNumber = entry.getKey();
testMethodsSize = entry.getValue();
}
}
return batchNumber;
}
private void incTestMethodsSizeInBatch(int testCount) {
int batchNumber = testCaseNumberBatchNumber.get(getCurrentTestCaseNumber());
batchNumberTestCount.get(batchNumber).getAndAdd(testCount);
}
}