package test.retryAnalyzer;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
import java.util.concurrent.atomic.AtomicInteger;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
import org.testng.TestNG;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.google.common.collect.ConcurrentHashMultiset;
import com.google.common.collect.Multiset;
/**
* retryAnalyzer parameter unit tests.
* @author tocman@gmail.com (Jeremie Lenfant-Engelmann)
*
*/
public final class InvocationCountTest implements IRetryAnalyzer {
static final Multiset<String> invocations = ConcurrentHashMultiset.create();
private static final AtomicInteger retriesRemaining = new AtomicInteger(100);
private static final int MAX_RETRY = 2;
static int tcid1 = 0;
static int tcid2 = 0;
static int tcid3 = 0;
private int r1 = 0;
private int r2 = 1;
private int r3 = 0;
private int r7 = 0;
private static int value = 42;
private int executionNumber = 0;
@Test(retryAnalyzer = InvocationCountTest.class)
public void testAnnotationWithNoRetries() {
}
@Test(retryAnalyzer = InvocationCountTest.class)
public void testAnnotationWithOneRetry() {
if (r1++ < 1) {
fail();
}
}
@Test(retryAnalyzer = InvocationCountTest.class)
public void testAnnotationWithSevenRetries() {
if (r7++ < 7) {
fail();
}
}
@Test(retryAnalyzer = ThreeRetries.class, successPercentage = 0)
public void failAfterThreeRetries() {
fail();
}
@Test(dependsOnMethods = {
"testAnnotationWithNoRetries",
"testAnnotationWithOneRetry",
"testAnnotationWithSevenRetries",
"failAfterThreeRetries"
}, alwaysRun = true)
public void checkInvocationCounts() {
assertEquals(invocations.count("testAnnotationWithNoRetries"), 0);
assertEquals(invocations.count("testAnnotationWithOneRetry"), 1);
assertEquals(invocations.count("testAnnotationWithSevenRetries"), 7);
assertEquals(invocations.count("failAfterThreeRetries"), 4);
}
@Test (retryAnalyzer = InvocationCountTest.class,
dataProvider = "dataProvider3")
public void retryWithDataProvider(String tc) {
if ("tc1".equals(tc)) {
if (tcid1++ < MAX_RETRY) {
fail();
}
}
if ("tc2".equals(tc)) {
if (tcid2++ < MAX_RETRY) {
fail();
}
}
if ("tc3".equals(tc)) {
if (tcid3++ < MAX_RETRY) {
fail();
}
}
}
@Test (
dependsOnMethods = { "retryWithDataProvider" }, alwaysRun = true)
public void checkRetryCounts() {
assertEquals(tcid1, 3);
assertEquals(tcid2, 3);
assertEquals(tcid3, 3);
}
@DataProvider(name="dataProvider")
private Object[][] dataProvider() {
return new Object[][] { { 1, true }, { 2, false }, { 3, true },
{ 4, false } };
}
@DataProvider(name="dataProvider2")
private Object[][] dataProvider2() {
value = 42;
return new Object[][] { { true }, { true } };
}
@DataProvider (
name = "dataProvider3")
private Object[][] dataProvider3() {
return new Object[][] { {"tc1"}, {"tc2"}, {"tc3"} };
}
@Test(retryAnalyzer = InvocationCountTest.class, dataProvider = "dataProvider")
public void testAnnotationWithDataProvider(int paf, boolean test) {
executionNumber++;
if (paf == 2 && test == false) {
if (r2 >= 1) {
r2--;
fail();
}
}
if (paf == 4){
assertEquals(executionNumber,5);
}
}
@Test(retryAnalyzer = InvocationCountTest.class, dataProvider = "dataProvider2")
public void testAnnotationWithDataProviderAndRecreateParameters(boolean dummy) {
if (r3 == 1) {
this.value = 0;
r3--;
fail();
} else if (r3 == 0) {
assertEquals(this.value, 42);
}
}
@Test
public void withFactory() {
TestNG tng = new TestNG();
tng.setVerbose(0);
tng.setTestClasses(new Class[] { MyFactory.class});
FactoryTest.m_count = 0;
tng.run();
assertEquals(FactoryTest.m_count, 4);
}
@Override
public boolean retry(ITestResult result) {
invocations.add(result.getName());
return retriesRemaining.getAndDecrement() >= 0;
}
public static class ThreeRetries implements IRetryAnalyzer {
private final AtomicInteger remainingRetries = new AtomicInteger(3);
@Override
public boolean retry(ITestResult result) {
invocations.add(result.getName());
return remainingRetries.getAndDecrement() > 0;
}
}
public static class RetryCountTest implements IRetryAnalyzer {
private final AtomicInteger remainingRetries = new AtomicInteger(12);
@Override
public boolean retry(ITestResult result) {
return remainingRetries.getAndDecrement() > 0;
}
}
}