// ĠCopyright Ġ 2 0 1 9 ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ // ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ċ package Ġsoftware . aws . tool k its . jetbrains . utils . test Ċ Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġkotlin . math . round To Long Ċ Ċ fun Ġretry able Assert ( ĊĠĠĠ Ġtimeout : ĠDuration ? Ġ= Ġnull , ĊĠĠĠ Ġmax Attempts : ĠInt ? Ġ= Ġnull , ĊĠĠĠ Ġinterval : ĠDuration Ġ= ĠDuration . of Millis ( 1 0 0 ), ĊĠĠĠ Ġassertion : Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġcalculated Timeout Ġ= Ġtimeout Ġ?: Ġmax Attempts ?. let Ġ{ ĠDuration . of Millis ( it Ġ* Ġ( interval . to Millis () Ġ* Ġ 1 . 5 ). round To Long ()) Ġ} Ġ?: ĠDuration . of Seconds ( 1 ) ĊĠĠĠ Ġval Ġexpiry Ġ= ĠInstant . now (). plus ( calculated Timeout ) ĊĠĠĠ Ġval Ġattempts Ġ= ĠAtomicInteger ( 0 ) ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassertion () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠAssertionError ) Ġ{ Ġ// Ġdeli ber ately Ġnarrow ed Ġto Ġan ĠAssertionError Ġ- Ġthis Ġis Ġintended Ġto Ġbe Ġused Ġin Ġa Ġtest Ġassertion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstant . now (). is After ( expiry ) Ġ-> Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Attempts Ġ!= Ġnull Ġ&& Ġattempts . increment AndGet () Ġ>= Ġmax Attempts Ġ-> Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠThread . sleep ( interval . to Millis ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }