package Ġcom . as app . ch ur ros . rx Ċ Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . schedul ers . Test Scheduler Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠRetry With Delay UnitTest Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtest Scheduler : ĠTest Scheduler ĊĠĠĠ Ġprivate Ġval Ġtime Unit Ġ= ĠTimeUnit . SECONDS ĊĠĠĠ Ġprivate Ġval Ġmon otonic Delay List Ġ= ĠlistOf ( 1 0 0 , Ġ 2 5 0 , Ġ 5 0 0 0 ) ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Scheduler Ġ= ĠTest Scheduler () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Single ( numberOf Errors : ĠInt , Ġsuccess : ĠInt ): ĠSingle < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= ĠnumberOf Errors ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount -- ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Fail ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Successful Without Retries () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Value Ġ= Ġ 1 5 5 7 ĊĠĠĠĠĠĠĠ Ġval Ġexponential Delay List Ġ= ĠlistOf ( 1 , Ġ 2 , Ġ 4 , Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĠSingle . just ( success Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. retry With Delay ( exponent ial Delay List , Ġtime Unit , Ġtest Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġtest Scheduler Ġis ĠNE VER Ġset Ġto Ġanything Ġso Ġthe Ġretry Ġwas Ġnot Ġneeded . ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value ( success Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Successful Retry With Delay () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconstant Delay Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Errors Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġconstant Delay List Ġ= Ġgenerate Sequence Ġ{ Ġconstant Delay Ġ}. take ( numberOf Errors ). toList () ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Value Ġ= Ġ 4 2 ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġcreate Single ( numberOf Errors , Ġsuccess Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. retry With Delay ( constant Delay List , Ġtime Unit , Ġtest Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĊĠĠĠĠĠĠĠ Ġrepeat ( numberOf Errors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer . assert Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Scheduler . advance Time By ( constant Delay . to Long (), Ġtime Unit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Value ( success Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Too Many Retries () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Errors Ġ= Ġ 4 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġcreate Single ( numberOf Errors , Ġ 2 0 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. retry With Delay ( mon otonic Delay List , Ġtime Unit , Ġtest Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( delay Ġin Ġmon otonic Delay List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer . assert Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Scheduler . advance Time By ( delay . to Long (), Ġtime Unit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtest Observer . assert Error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . message Ġ== Ġ" Too Ġmany Ġretries " Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . cause Ġis ĠIllegalStateException Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . cause ?. message Ġ== Ġ" Fail " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġthrowable Ġ= ĠThrowable (" Fail ") ĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= ĠSingle . error < Int >( throwable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. retry With Delay ( mon otonic Delay List , Ġtime Unit , Ġtest Scheduler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġthrowable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . assert Error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . message Ġ== Ġ" Too Ġmany Ġretries " Ġ&& Ġit . cause Ġ== Ġthrowable ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }