package test.thread;
import org.testng.Assert;
import org.testng.TestNG;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.testng.collections.Lists;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
import test.BaseTest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ParallelTestTest extends BaseTest {
@DataProvider
private static Object[][] verifyParallelDp() {
return new Object[][]{
// isCommandLine, parallelMode, expectedThreadCount
{true, XmlSuite.ParallelMode.NONE, 1},
{false, XmlSuite.ParallelMode.NONE, 1},
{true, XmlSuite.ParallelMode.TESTS, 2},
{false, XmlSuite.ParallelMode.TESTS, 2},
{true, XmlSuite.ParallelMode.METHODS, 4},
{false, XmlSuite.ParallelMode.METHODS, 4},
{true, XmlSuite.ParallelMode.CLASSES, 2},
{false, XmlSuite.ParallelMode.CLASSES, 2},
{true, XmlSuite.ParallelMode.INSTANCES, 2},
{false, XmlSuite.ParallelMode.INSTANCES, 2}
};
}
@Test(dataProvider = "verifyParallelDp")
public void verifyParallel(boolean isCommandLine, XmlSuite.ParallelMode parallelMode, int expectedThreadCount) {
verifyExpected(isCommandLine, parallelMode, expectedThreadCount, Test1Test.class, Test2Test.class);
}
@DataProvider
private static Object[][] verifyParallelWithFactoryDp() {
return new Object[][]{
// isCommandLine, parallelMode, expectedThreadCount
{true, XmlSuite.ParallelMode.NONE, 1},
{false, XmlSuite.ParallelMode.NONE, 1},
{true, XmlSuite.ParallelMode.INSTANCES, 2},
{false, XmlSuite.ParallelMode.INSTANCES, 2}
};
}
@Test(dataProvider = "verifyParallelWithFactoryDp") // TODO use "verifyParallelDp"
public void verifyParallelWithFactory(boolean isCommandLine, XmlSuite.ParallelMode parallelMode, int expectedThreadCount) {
verifyExpected(isCommandLine, parallelMode, expectedThreadCount, ParallelWithFactorySampleTest.class);
}
private void createTest(XmlSuite xmlSuite, Class<?> clazz) {
XmlTest result = new XmlTest(xmlSuite);
List<XmlClass> classes = result.getXmlClasses();
XmlClass xmlClass = new XmlClass(clazz);
classes.add(xmlClass);
}
private void verifyExpected(boolean isCommandLine, XmlSuite.ParallelMode parallelMode, int expectedThreadCount,
Class<?>... classes) {
XmlSuite xmlSuite = new XmlSuite();
xmlSuite.setName("ParallelTestTest");
xmlSuite.setParallel(parallelMode);
for (Class<?> clazz : classes) {
createTest(xmlSuite, clazz);
}
TestNG tng = new TestNG();
tng.setVerbose(0);
if (isCommandLine) {
tng.setCommandLineSuite(xmlSuite);
} else {
tng.setXmlSuites(Arrays.asList(xmlSuite));
}
Helper.reset();
tng.run();
List<Map<Long, Long>> maps = Lists.newArrayList();
for (Class<?> clazz : classes) {
maps.add(Helper.getMap(clazz.getName()));
}
Map<Long, Long> mergedMap = new HashMap<>();
for (Map<Long, Long> m : maps) {
mergedMap.putAll(m);
}
Assert.assertEquals(mergedMap.size(), expectedThreadCount);
}
}