package Ġcom . mem fault . cloud . sdk . internal Ċ Ċ import Ġcom . mem fault . cloud . sdk . Chunk Error Tracker Ċ import Ġcom . mem fault . cloud . sdk . Send Chunks Callback Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . spy k Ċ import Ġio . mock k . verify Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ Ċ private Ġconst Ġval ĠTEST _ MAX _ CH UN KS _ PER _ REQUEST Ġ= Ġ 2 Ċ Ċ class ĠPost Chunks Task Test Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtask : ĠPost Chunks Task ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmem fault Http Api : ĠMem fault Http Api ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġchunk Queue : ĠTemporary Chunk Queue ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcallback : ĠSend Chunks Callback ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġerror Tracker : ĠChunk Error Tracker ĊĠĠĠ Ġprivate Ġvar Ġnow Millis : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġmem fault Http Api Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġchunk Queue Ġ= ĠTemporary Chunk Queue () ĊĠĠĠĠĠĠĠ Ġcallback Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġerror Tracker Ġ= Ġspy k ( Chunk Error Tracker ( get Elapsed Realtime Millis Ġ= Ġ{ Ġnow Millis Ġ})) ĊĠĠĠĠĠĠĠ Ġtask Ġ= ĠPost Chunks Task ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem fault Http Api Ġ= Ġmem fault Http Api , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor Ġ= ĠDirect Executor (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Serial Ġ= Ġ" DEVICE _ SERIAL ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Queue Ġ= Ġchunk Queue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Ġ= Ġcallback , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Chunks Per Request Ġ= ĠTEST _ MAX _ CH UN KS _ PER _ REQUEST , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Tracker Ġ= Ġerror Tracker ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Chunks ( count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchunk Queue . add Chunks (( 1 .. count ). map Ġ{ ĠByteArray ( 1 ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġempty Queue () Ġ{ ĊĠĠĠĠĠĠĠ Ġtask . run () ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġcallback . on Queue Empty ( 0 ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnot Res pect ing Delay () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Chunks ( 1 ) ĊĠĠĠĠĠĠĠ Ġerror Tracker . track Error () ĊĠĠĠĠĠĠĠ Ġval Ġconsecutive Error Count Ġ= Ġerror Tracker . con secutive Error Count ĊĊĠĠĠĠĠĠĠ Ġtask . run () ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġerror Tracker . next Delay () Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġcallback . on Retry After Delay ( 1 , Ġ 0 , Ġany ()) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( con secutive Error Count , Ġerror Tracker . con secutive Error Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpost Success () Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem fault Http Api . post Chunks ( any (), Ġany ()) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns ĠHttpResponse ( 2 0 2 , Ġ" Accepted ", Ġ"". byte InputStream (), ĠHttp Header Map ( empty Map ()), ĠDummy Connection ) ĊĊĠĠĠĠĠĠĠ Ġadd Chunks ( 1 ) ĊĠĠĠĠĠĠĠ Ġtask . run () ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmem fault Http Api . post Chunks ( any (), Ġany ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġcallback . on Queue Empty ( 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġcallback . on Retry After Delay ( any (), Ġany (), Ġany ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġerror Tracker . track Success () Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġerror Tracker . con secutive Error Count ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( emptyList < ByteArray >(), Ġchunk Queue . peek ( 1 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpost Up To Max Chunks () Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem fault Http Api . post Chunks ( any (), Ġany ()) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns ĠHttpResponse ( 2 0 2 , Ġ" Accepted ", Ġ"". byte InputStream (), ĠHttp Header Map ( empty Map ()), ĠDummy Connection ) ĊĊĠĠĠĠĠĠĠ Ġadd Chunks ( TEST _ MAX _ CH UN KS _ PER _ REQUEST Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġtask . run () ĊĠĠĠĠĠĠĠ Ġval Ġchunks Slot Ġ= Ġmutable ListOf < List < ByteArray >>() ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 2 ) Ġ{ Ġmem fault Http Api . post Chunks ( any (), Ġcapture ( chunks Slot )) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġcallback . on Queue Empty ( TEST _ MAX _ CH UN KS _ PER _ REQUEST Ġ+ Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġcallback . on Retry After Delay ( any (), Ġany (), Ġany ()) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġchunks Slot . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( TEST _ MAX _ CH UN KS _ PER _ REQUEST , Ġchunks Slot [ 0 ]. size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġchunks Slot [ 1 ]. size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpost Failed With Retry After Header () Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem fault Http Api . post Chunks ( any (), Ġany ()) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns ĠHttpResponse ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 2 9 , Ġ" Too ĠMany ĠRequests ", Ġ"". byte InputStream (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Header Map ( map Of (" retry - after " Ġto Ġ" 1 2 3 ")), ĠDummy Connection ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġadd Chunks ( 1 ) ĊĠĠĠĠĠĠĠ Ġtask . run () ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmem fault Http Api . post Chunks ( any (), Ġany ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġcallback . on Retry After Delay ( 1 2 3 , Ġ 0 , Ġany ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġcallback . on Queue Empty ( any ()) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 2 3 , Ġerror Tracker . next Delay ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpost Failed No Retry After Header () Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem fault Http Api . post Chunks ( any (), Ġany ()) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns ĠHttpResponse ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 2 9 , Ġ" Too ĠMany ĠRequests ", Ġ"". byte InputStream (), ĠHttp Header Map ( empty Map ()), ĠDummy Connection ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġadd Chunks ( 1 ) ĊĠĠĠĠĠĠĠ Ġtask . run () ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmem fault Http Api . post Chunks ( any (), Ġany ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġcallback . on Retry After Delay ( DEFAULT _ RETRY _ BASE _ DELAY _ SECONDS , Ġ 0 , Ġany ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġcallback . on Queue Empty ( any ()) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( DEFAULT _ RETRY _ BASE _ DELAY _ SECONDS , Ġerror Tracker . next Delay ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠDummy Connection Ġ: ĠClose able Connection Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdisconnect () Ġ= ĠUnit ĊĠĠĠ Ġ} Ċ } Ċ