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