package com.schibsted.spain.barista.flakyespresso;
import android.util.Log;
import org.junit.runners.model.Statement;
import static com.schibsted.spain.barista.flakyespresso.FlakyUtil.finishAllActivitiesOnUiThread;
public class AllowFlakyStatement extends Statement {
private static final String TAG = "FLAKY";
private final int attempts;
private final Statement statement;
public AllowFlakyStatement(int attempts, Statement statement) {
this.attempts = attempts;
this.statement = statement;
}
@Override
@SuppressWarnings("PMD.AvoidCatchingThrowable")
public void evaluate() throws Throwable {
for (int i = 1; i <= attempts; i++) {
try {
Log.d(TAG, "--> Attempt #" + i);
statement.evaluate();
Log.d(TAG, "<-- Success at #" + i);
break;
} catch (Throwable e) {
if (i == attempts) {
Log.d(TAG, "<-- Attempt #" + i + " failed. No more attempts.");
throw e;
}
Log.d(TAG, "<-- Attempt #" + i + " failed. Repeating again");
// This is what JUnit and Espresso do after each test method:
finishAllActivitiesOnUiThread();
}
}
}
}