1*21373fa4SWill Schurman package host.exp.exponent.utils 2*21373fa4SWill Schurman 3*21373fa4SWill Schurman import org.junit.rules.TestRule 4*21373fa4SWill Schurman import org.junit.runner.Description 5*21373fa4SWill Schurman import org.junit.runners.model.Statement 6*21373fa4SWill Schurman 7*21373fa4SWill Schurman class RetryTestRule(private val retryCount: Int) : TestRule { applynull8*21373fa4SWill Schurman override fun apply(base: Statement, description: Description): Statement { 9*21373fa4SWill Schurman return statement(base, description) 10*21373fa4SWill Schurman } 11*21373fa4SWill Schurman statementnull12*21373fa4SWill Schurman private fun statement(base: Statement, description: Description): Statement { 13*21373fa4SWill Schurman return object : Statement() { 14*21373fa4SWill Schurman @Throws(Throwable::class) 15*21373fa4SWill Schurman override fun evaluate() { 16*21373fa4SWill Schurman var caughtThrowable: Throwable? = null 17*21373fa4SWill Schurman for (i in 0 until retryCount) { 18*21373fa4SWill Schurman try { 19*21373fa4SWill Schurman base.evaluate() 20*21373fa4SWill Schurman return 21*21373fa4SWill Schurman } catch (t: Throwable) { 22*21373fa4SWill Schurman caughtThrowable = t 23*21373fa4SWill Schurman System.err.println(description.displayName + ": run " + (i + 1) + " failed") 24*21373fa4SWill Schurman } 25*21373fa4SWill Schurman } 26*21373fa4SWill Schurman System.err.println(description.displayName + ": giving up after " + retryCount + " failures") 27*21373fa4SWill Schurman throw caughtThrowable!! 28*21373fa4SWill Schurman } 29*21373fa4SWill Schurman } 30*21373fa4SWill Schurman } 31*21373fa4SWill Schurman } 32