package Ġco . ke . x ently . common Ċ Ċ import Ġjunit . framework . TestCase Ċ import Ġkotlin . time . Duration . Companion . seconds Ċ import Ġkotlinx . coroutines . test . run Test Ġas Ġrun Coroutine Test Ċ Ċ class ĠRetry Test Ġ: ĠTestCase () Ġ{ ĊĊĠĠĠ Ġfun Ġ` test Ġcan Ġretry Ġwhen Ġnumber Ġof Ġretries Ġis Ġgreater Ġthan Ġ 1 `() Ġ= Ġrun Coroutine Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġretry Ġ= ĠRetry ( number Ġ= Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( retry . can Retry ()) ĊĠĠĠĠĠĠĠ Ġ// ĠDefault Ġnumber ... ĊĠĠĠĠĠĠĠ ĠassertTrue ( Retry (). can Retry ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ` test Ġcan Ġretry Ġwhen Ġnumber Ġof Ġretries Ġis Ġ 1 `() Ġ= Ġrun Coroutine Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġretry Ġ= ĠRetry ( number Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( retry . can Retry ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ` test Ġcan Ġnot Ġretry Ġwhen Ġnumber Ġof Ġretries Ġis Ġ 0 `() Ġ= Ġrun Coroutine Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġretry Ġ= ĠRetry ( number Ġ= Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( retry . can Retry ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ` test Ġcan Ġnot Ġretry Ġwhen Ġnumber Ġof Ġretries Ġis Ġ- 1 `() Ġ= Ġrun Coroutine Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġretry Ġ= ĠRetry ( number Ġ= Ġ- 1 ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( retry . can Retry ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ` test Ġcan Ġretry Ġcalled Ġnumber Ġof Ġretry Ġtimes `() Ġ= Ġrun Coroutine Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġretry Ġ= ĠRetry () ĊĠĠĠĠĠĠĠ ĠassertTrue ( retry . can Retry ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( retry . can Retry ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( retry . can Retry ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ` test Ġcan Ġretry Ġcalled Ġmore Ġthan Ġnumber Ġof Ġretry Ġtimes `() Ġ= Ġrun Coroutine Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġretry Ġ= ĠRetry () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Attempt Count , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Wait Time Seconds . seconds , Ġ 3 . seconds ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( retry . can Retry ()) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Attempt Count , Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Wait Time Seconds . seconds , Ġ 6 . seconds ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( retry . can Retry ()) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Attempt Count , Ġ 3 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Wait Time Seconds . seconds , Ġ 1 2 . seconds ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( retry . can Retry ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠConfig ured Ġnumber Ġof Ġretries Ġexceeded ĊĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Attempt Count , Ġ 4 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Wait Time Seconds . seconds , Ġ 2 4 . seconds ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( retry . can Retry ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNeither Ġwait Ġtime Ġnor Ġattempt Ġcount Ġis Ġnot Ġincreased Ġonce Ġnumber Ġof Ġretries Ġis Ġreached ĊĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Attempt Count , Ġ 4 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Wait Time Seconds . seconds , Ġ 2 4 . seconds ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ` test Ġcan Ġretry Ġcalled Ġmore Ġthan Ġnumber Ġof Ġretry Ġtimes Ġwith Ġnon - default Ġbackoff Ġmultiplier `() Ġ= ĊĠĠĠĠĠĠĠ Ġrun Coroutine Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġretry Ġ= ĠRetry ( backoff Multiplier Ġ= Ġ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Attempt Count , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Wait Time Seconds . seconds , Ġ 3 . seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( retry . can Retry ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Attempt Count , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Wait Time Seconds . seconds , Ġ 9 . seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( retry . can Retry ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Attempt Count , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Wait Time Seconds . seconds , Ġ 2 7 . seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( retry . can Retry ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConfig ured Ġnumber Ġof Ġretries Ġexceeded ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Attempt Count , Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Wait Time Seconds . seconds , Ġ 8 1 . seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( retry . can Retry ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNeither Ġwait Ġtime Ġnor Ġattempt Ġcount Ġis Ġnot Ġincreased Ġonce Ġnumber Ġof Ġretries Ġis Ġreached ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Attempt Count , Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( retry . current Wait Time Seconds . seconds , Ġ 8 1 . seconds ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ` test Ġcan Ġretry Ġis Ġindependent Ġof Ġretry Ġclass Ġinstance `() Ġ= Ġrun Coroutine Test Ġ{ ĊĠĠĠĠĠĠĠ ĠRetry ( number Ġ= Ġ 2 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( is Default State ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( can Retry ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( is Default State ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( can Retry ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( can Retry ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( is Default State ) ĊĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( can Retry ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( is Default State ) ĊĠĠĠĠĠĠĠ Ġ}. copy ( number Ġ= Ġ 1 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( is Default State ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( can Retry ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( is Default State ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( can Retry ()) ĊĠĠĠĠĠĠĠ Ġ}. copy ( number Ġ= Ġ 3 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( is Default State ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( can Retry ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( is Default State ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( can Retry ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( can Retry ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( can Retry ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }