package Ġio . kot est Ċ Ċ import Ġio . kot est . assertions . Failures Ċ import Ġkotlinx . coroutines . delay Ċ import Ġjava . time . Duration Ċ Ċ /** Ċ Ġ* ĠRetry Ġthe Ġgiven Ġlambda Ġ[ f ] Ġin Ġcase Ġof Ġassertion Ġerror [ AssertionError ] Ġand Ġexception Ġ[ Exception ]. Ċ Ġ* ĠSto ps Ġtrying Ġwhen Ġ[ max Retry ] Ġor Ġ[ timeout ] Ġis Ġreached . Ċ Ġ* Ġ*/ Ċ suspend Ġfun Ġ< T > Ġretry ( ĊĠĠ Ġmax Retry : ĠInt , ĊĠĠ Ġtimeout : ĠDuration , ĊĠĠ Ġdelay : ĠDuration Ġ= Ġtimeout , ĊĠĠ Ġmultiplier : ĠInt Ġ= Ġ 1 , ĊĠĠ Ġf : Ġ() Ġ-> ĠT Ċ ): ĠT Ġ= Ġretry ( max Retry , Ġtimeout , Ġdelay , Ġmultiplier , ĠException :: class . java , Ġf ) ĊĊ Ċ /** Ċ Ġ* ĠRetry Ġthe Ġgiven Ġlambda Ġ[ f ] Ġin Ġcase Ġof Ġassertion Ġerror [ AssertionError ] Ġand Ġexception Ġof Ġtype Ġ[ exception Class ]. Ċ Ġ* ĠSto ps Ġtrying Ġwhen Ġ[ max Retry ] Ġor Ġ[ timeout ] Ġis Ġreached . ĠOr Ġan Ġexception Ġother Ġthan Ġ[ exception Class ] Ġis Ġthrown Ċ Ġ* Ġ*/ Ċ suspend Ġfun Ġ< T , ĠE Ġ: ĠThrowable > Ġretry ( ĊĠĠ Ġmax Retry : ĠInt , ĊĠĠ Ġtimeout : ĠDuration , ĊĠĠ Ġdelay : ĠDuration Ġ= Ġtimeout , ĊĠĠ Ġmultiplier : ĠInt Ġ= Ġ 1 , ĊĠĠ Ġexception Class : ĠClass < E >, ĊĠĠ Ġf : Ġ() Ġ-> ĠT Ċ ): ĠT Ġ{ ĊĠĠ Ġval Ġend Ġ= ĠSystem . currentTimeMillis () Ġ+ Ġtimeout . to Millis () ĊĠĠ Ġvar Ġretry So Far Ġ= Ġ 0 ĊĠĠ Ġvar Ġnext Await Duration Ġ= Ġdelay . to Millis () ĊĠĠ Ġvar Ġlast Error : ĠThrowable ? Ġ= Ġnull ĊĊĠĠ Ġwhile Ġ( System . currentTimeMillis () Ġ< Ġend Ġ&& Ġretry So Far Ġ< Ġmax Retry ) Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġf () ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġif Ġ(! exception Class . isAssignableFrom ( e . java Class ) Ġ&& Ġ! AssertionError :: class . java . isAssignableFrom ( e . java Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġthe Ġkind Ġof Ġexception Ġwe Ġwere Ġprepared Ġto Ġtol erate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġlast Error Ġ= Ġe ĊĠĠĠĠĠĠĠĠ Ġ// Ġelse Ġignore Ġand Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġretry So Far ++ ĊĠĠĠĠĠ Ġdelay ( next Await Duration ) ĊĠĠĠĠĠ Ġnext Await Duration Ġ*= Ġmultiplier ĊĠĠ Ġ} ĊĠĠ Ġval Ġunderlying Cause Ġ= Ġif Ġ( last Error Ġ== Ġnull ) Ġ"" Ġelse Ġ"; Ġunderlying Ġcause Ġwas Ġ${ last Error . localized Message }" ĊĠĠ Ġthrow ĠFail ures . failure ( ĊĠĠĠĠĠ Ġ" Test Ġfailed Ġafter Ġ${ delay . seconds } Ġseconds ; Ġattempted Ġ$ retry So Far Ġtimes $ underlying Cause ", ĊĠĠĠĠĠ Ġlast Error ĊĠĠ Ġ) Ċ } ĊĊ