package Ġcom . kin vey . android Test . store . file Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Message Ċ import Ġandroid . util . Log Ċ import Ġandroidx . test . filters . Small Test Ċ import Ġandroidx . test . platform . app . Instrumentation Registry Ċ import Ġandroidx . test . runner . Android JUnit 4 Ċ import Ġcom . kin vey . android . Client Ċ import Ġcom . kin vey . android . Client . Builder Ċ import Ġcom . kin vey . android . callback . Async Downloader Progress Listener Ċ import Ġcom . kin vey . android . callback . Async Uploader Progress Listener Ċ import Ġcom . kin vey . android . callback . Kin vey Delete Callback Ċ import Ġcom . kin vey . android . model . User Ċ import Ġcom . kin vey . android . store . User Store . Companion . login Ċ import Ġcom . kin vey . android Test . Looper Thread Ċ import Ġcom . kin vey . android Test . Test Manager . Companion . PASSWORD Ċ import Ġcom . kin vey . android Test . Test Manager . Companion . USERNAME Ċ import Ġcom . kin vey . java . Abstract Client Ċ import Ġcom . kin vey . java . Query Ċ import Ġcom . kin vey . java . cache . Kin vey Cached Client Callback Ċ import Ġcom . kin vey . java . core .* Ċ import Ġcom . kin vey . java . model . File MetaData Ċ import Ġcom . kin vey . java . model . Kin vey MetaData . AccessControl List Ċ import Ġcom . kin vey . java . query . Mongo Query Filter . Mongo Query Filter Builder Ċ import Ġcom . kin vey . java . store . Store Type Ċ import Ġjunit . framework . Assert . assertFalse Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Argument Matchers . any Ċ import Ġorg . mockito . Mockito . do Throw Ċ import Ġorg . mockito . Mockito . spy Ċ import Ġjava . io .* Ċ import Ġjava . util . concurrent . Count DownLatch Ċ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ @ Small Test Ċ class ĠFile Store Test Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġclient : ĠClient < *> ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsuccess Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġstore Type Result : ĠStore Type ? Ġ= Ġnull ĊĊĠĠĠ Ġopen Ġclass ĠDefault Upload Progress Listener ( private Ġval Ġl atch : ĠCount DownLatch ) Ġ: ĠAsync Uploader Progress Listener < File MetaData > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġfile MetaData Result : ĠFile MetaData ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġerror : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġis Cancelled : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġon Cancelled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġprogress Changed Counter Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprogress Changed ( uploader : ĠMedia Http Uploader ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Changed Counter ++ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" UPLOAD ĠTAG : Ġ", ĠString . valueOf ( uploader . get Progress ())); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Cancelled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠFile MetaData ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile MetaData Result Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( error : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . error Ġ= Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġclass ĠResume Upload Progress Listener ( private Ġval Ġl atch : ĠCount DownLatch ) Ġ: ĠMeta Upload Progress Listener (), ĠU plo ader Progress Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġprogress Changed Counter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġupload Metadata : ĠFile MetaData ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠmetaData Retrie ved ( meta : ĠFile MetaData ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Metadata Ġ= Ġmeta ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprogress Changed ( uploader : ĠMedia Http Uploader ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Changed Counter ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( progress Changed Counter Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġclass ĠDefault Download Progress Listener ( private Ġval Ġl atch : ĠCount DownLatch ) Ġ: ĠAsync Downloader Progress Listener < File MetaData > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġfile MetaData Result : ĠFile MetaData ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġerror : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġis Cancelled : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġon Cancelled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġprogress Changed Counter Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprogress Changed ( downloader : ĠMedia Http Downloader ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Changed Counter ++ Ċ // ĠĠĠĠĠĠĠĠĠ ĠLog . d (" DOWNLOAD ĠTAG : Ġ", ĠString . valueOf ( downloader . get Progress ())); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Cancelled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠFile MetaData ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile MetaData Result Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( error : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . error Ġ= Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠDefault Delete Listener ( private Ġval Ġl atch : ĠCount DownLatch ) Ġ: ĠKin vey Delete Callback Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġerror : ĠThrowable ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . result Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( error : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . error Ġ= Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠDefault Download Cached Listener () Ġ: ĠKin vey Cached Client Callback < File MetaData > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġl atch : ĠCount DownLatch ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠFile MetaData ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġerror : ĠThrowable ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconstructor ( latch : ĠCount DownLatch ?): Ġthis () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . latch Ġ= Ġl atch ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠFile MetaData ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . result Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( error : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . error Ġ= Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl atch ?. count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠDefault Download Callback () Ġ: ĠKin vey Client Callback < File MetaData > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġl atch : ĠCount DownLatch ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠFile MetaData ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġerror : ĠThrowable ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġconstructor ( latch : ĠCount DownLatch ): Ġthis () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . latch Ġ= Ġl atch ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠFile MetaData ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . result Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( error : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . error Ġ= Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl atch ?. count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class ) ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġm Mock Context Ġ= ĠInstrument ation Registry . get Instrumentation (). target Context ĊĠĠĠĠĠĠĠ Ġclient Ġ= ĠBuilder < User >( m Mock Context ). build () ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġvar Ġlo oper Thread : ĠL ooper Thread ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( client ?. is User LoggedIn Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin ( USERNAME , ĠPASSWORD , Ġclient Ġas ĠAbstract Client < User >, Ġobject Ġ: ĠKin vey Client Callback < User > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠUser ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( error : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread ?. m Handler ?. sendMessage ( Message ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Metadata (): ĠFile MetaData Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile MetaData Ġ= ĠFile MetaData () ĊĠĠĠĠĠĠĠ Ġfile MetaData . fileName Ġ= ĠTEST _ FILENAME ĊĠĠĠĠĠĠĠ Ġreturn Ġfile MetaData ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġnull FileUpload ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( store Type , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . error ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listener . error ?. message , Ġ" file Ġmust Ġnot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// " Parameter Ġspecified Ġas Ġnon - null Ġis Ġnull : Ġmethod Ġkotlin . jvm . internal . Intr insics . check Parameter IsNotNull , Ġparameter Ġfile ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġnull Metadata Upload ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( store Type , Ġfile , Ġnull ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . error ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listener . error ?. message , Ġ" metadata Ġmust Ġnot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// " Parameter Ġspecified Ġas Ġnon - null Ġis Ġnull : Ġmethod Ġkotlin . jvm . internal . Intr insics . check Parameter IsNotNull , Ġparameter Ġmetadata ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġnull Upload ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull FileUpload ( store Type ) ĊĠĠĠĠĠĠĠ Ġnull Metadata Upload ( store Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload File Network Null Check () Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Upload ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload File Cache Null Check () Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Upload ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload File AUT ON ull Check () Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Upload ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload FileSync Null Check () Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Upload ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġupload File With Metadata ( store Type : ĠStore Type , Ġf : ĠFile ?, ĠmetaData : ĠFile MetaData ?): ĠDefault Upload Progress Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠDefault Upload Progress Listener ( latch ) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. upload ( f , ĠmetaData , Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġnull Download ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġdownload File ( store Type , Ġnull ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . error ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listener . error ?. message , Ġ" Parameter Ġspecified Ġas Ġnon - null Ġis Ġnull : Ġmethod Ġkotlin . jvm . internal . Intr insics . check Parameter IsNotNull , Ġparameter Ġmetadata ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download File Network Null Check () Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Download ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download File Cache Null Check () Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Download ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download File Auto Null Check () Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Download ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download FileSync Null Check () Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Download ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġdownload File ( type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( type , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġcached Listener Ġ= ĠDefault Download Cached Listener () ĊĠĠĠĠĠĠĠ Ġval Ġdownload Listener Ġ= Ġdownload File ( type , Ġcached Listener , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( download Listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ=== ĠStore Type . CACHE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( cached Listener . result ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( cached Listener . result !!. path ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( cached Listener . error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertNull ( download Listener . error ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġremove File ( type , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġdownload Cached OutputStream File ( type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( type , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġcached Listener Ġ= ĠDefault Download Cached Listener () ĊĠĠĠĠĠĠĠ Ġval Ġdownload Listener Ġ= Ġdownload Cached OutputStream File ( type , Ġcached Listener , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( download Listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ=== ĠStore Type . CACHE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( cached Listener . result ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( cached Listener . error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertNull ( download Listener . error ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġremove File ( type , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Download Cached File _ Type Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Download File No Cached Callback ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Download Cached File _ Type Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Download File No Cached Callback ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Download Cached File _ Type Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Download File No Cached Callback ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Download Cached File _ Type Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Download File No Cached Callback ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Download File No Cached Callback ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File () ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( store Type , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdownload Listener Ġ= Ġdownload Cached OutputStream File ( store Type , Ġnull , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( download Listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNull ( download Listener . error ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġremove File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download File Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownload File ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download File Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownload File ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download File Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownload File ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download FileSync () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownload Cached OutputStream File ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download File With Cached OutputStream Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownload Cached OutputStream File ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download File With Cached OutputStream Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownload Cached OutputStream File ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download File With Cached OutputStream Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownload Cached OutputStream File ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download File With Cached OutputStream Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownload File ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate OutputStream (): ĠFileOutputStream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( create File (" new _ file . txt ")) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Cached Client Callback (): ĠKin vey Cached Client Callback < File MetaData >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠKin vey Cached Client Callback < File MetaData > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠFile MetaData ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( Test :: class . java . name , Ġ" ĠKin vey Cached Client Callback ĠonSuccess ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( error : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( Test :: class . java . name , Ġ" ĠKin vey Cached Client Callback Ġon Failure ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Array Cached Client Callback (): ĠKin vey Cached Client Callback < Array < File MetaData >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠKin vey Cached Client Callback < Array < File MetaData >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠArray < File MetaData > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( Test :: class . java . name , Ġ" ĠKin vey Cached Client Callback ĠonSuccess ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( error : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( Test :: class . java . name , Ġ" ĠKin vey Cached Client Callback Ġon Failure ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġdownload File ( store Type : ĠStore Type , Ġmeta File : ĠFile MetaData ?): ĠDefault Download Progress Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdownload Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠDefault Download Progress Listener ( download Latch ) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( create File ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. download ( meta File , Ġf os , Ġlistener , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store Type Ġ=== ĠStore Type . CACHE ) Ġcreate Cached Client Callback () Ġelse Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġdownload Latch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġdownload File ( store Type : ĠStore Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Listener : ĠDefault Download Cached Listener , Ġmeta File : ĠFile MetaData ?) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠDefault Download Progress Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdownload Latch Ġ= ĠCount DownLatch ( if Ġ( store Type Ġ=== ĠStore Type . CACHE ) Ġ 2 Ġelse Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠDefault Download Progress Listener ( download Latch ) ĊĠĠĠĠĠĠĠ Ġcached Listener . latch Ġ= Ġdownload Latch ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( create File ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient !!. getFile Store ( store Type ). download ( meta File , Ġf os , Ġlistener , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store Type Ġ=== ĠStore Type . CACHE ) Ġcached Listener Ġelse Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġdownload Latch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġdownload Cached OutputStream File ( store Type : ĠStore Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Listener : ĠDefault Download Cached Listener ?, Ġmeta File : ĠFile MetaData ?) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠDefault Download Progress Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdownload Latch Ġ= ĠCount DownLatch ( if Ġ( store Type Ġ=== ĠStore Type . CACHE ) Ġ 2 Ġelse Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠDefault Download Progress Listener ( download Latch ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cached Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Listener . latch Ġ= Ġdownload Latch ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( store Type Ġ=== ĠStore Type . CACHE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Latch . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( create File ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cached Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. download ( meta File , Ġf os , Ġlistener , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store Type Ġ=== ĠStore Type . CACHE ) Ġcreate OutputStream () Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store Type Ġ=== ĠStore Type . CACHE ) Ġcached Listener Ġelse Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. download ( meta File , Ġf os , Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġdownload Latch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġexecute Remove File ( type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( type , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdelete Listener Ġ= Ġremove File ( type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( delete Listener . result ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( delete Listener . result Ġ?: Ġ 0 Ġ> Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Remove File Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Remove File ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Remove FileSync () Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Remove File ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Remove File Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Remove File ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Remove File Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Remove File ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġremove File ( store Type : ĠStore Type , Ġfile MetaData : ĠFile MetaData ?): ĠDefault Delete Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelete Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġdelete Listener Ġ= ĠDefault Delete Listener ( delete Latch ) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. remove ( file MetaData , Ġdelete Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Listener . on Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġdelete Latch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġdelete Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Refresh File Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Refresh File ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Refresh File Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Refresh File ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Refresh File Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Refresh File ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Refresh FileSync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Refresh File ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Refresh File ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( store Type , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġrefresh ( store Type , Ġlistener . file MetaData Result , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġremove File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġrefresh ( store Type : ĠStore Type , Ġfile MetaData : ĠFile MetaData ?, Ġis Create Cached Callback : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= ĠDefault Download Callback ( latch ) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Create Cached Callback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. refresh ( file MetaData , Ġcallback , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store Type Ġ=== ĠStore Type . CACHE ) Ġcreate Cached Client Callback () Ġelse Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. refresh ( file MetaData , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( callback . result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Refresh File _ Type Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Refresh File No Cached Callback ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Refresh File _ Type Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Refresh File No Cached Callback ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Refresh File _ Type Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Refresh File No Cached Callback ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Refresh File _ Type Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Refresh File No Cached Callback ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Refresh File No Cached Callback ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File () ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( store Type , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġrefresh ( store Type , Ġlistener . file MetaData Result , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġremove File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Find File Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Find File ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Find File Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Find File ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Find File Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Find File ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Find FileSync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Find File ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Find File ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( store Type , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġfind ( store Type , Ġlistener . file MetaData Result , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġremove File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġfind ( store Type : ĠStore Type , Ġfile MetaData : ĠFile MetaData ?, Ġis Cache Clean ing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĠQuery ( Mongo Query Filter Builder ()). equals ( ID , Ġfile MetaData ?. id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. find ( query , Ġobject Ġ: ĠKin vey Client Callback < Array < File MetaData >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠArray < File MetaData > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Cache Clean ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( result Ġ!= Ġnull Ġ&& Ġresult . size Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( result Ġ!= Ġnull Ġ&& Ġresult . size Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( error : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Cache Clean ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfinish ( result : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġif Ġ( store Type Ġ=== ĠStore Type . CACHE ) Ġcreate Array Cached Client Callback () Ġelse Ġnull ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( success ) ĊĠĠĠĠĠĠĠ Ġstore Type Result Ġ= Ġif Ġ(! is Cache Clean ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore Type ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Find File _ Type Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Find File No Cached Callback ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Find File _ Type Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Find File No Cached Callback ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Find File _ Type Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Find File No Cached Callback ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Find File _ Type Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Find File No Cached Callback ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Find File No Cached Callback ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File () ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( store Type , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġfind ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġremove File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġfind ( store Type : ĠStore Type , Ġfile MetaData : ĠFile MetaData ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĠQuery (). equals ( ID , Ġfile MetaData ?. id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. find ( query , Ġobject Ġ: ĠKin vey Client Callback < Array < File MetaData >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠArray < File MetaData > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( result Ġ!= Ġnull Ġ&& Ġresult . size Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( error : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfinish ( result : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( success ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun ĠtestGet Cache File _ Type Sync () Ġ{ ĊĠĠĠĠĠĠĠ ĠtestGet Cache File ById ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun ĠtestGet Cache File _ Type Network () Ġ{ ĊĠĠĠĠĠĠĠ ĠtestGet Cache File ById ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun ĠtestGet Cache File _ Type Cache () Ġ{ ĊĠĠĠĠĠĠĠ ĠtestGet Cache File ById ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun ĠtestGet Cache File _ Type Auto () Ġ{ ĊĠĠĠĠĠĠĠ ĠtestGet Cache File ById ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun ĠtestGet Cache File ById ( store Type : ĠStore Type ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File () ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( Store Type . SYNC , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġfile MetaData Ġ= Ġclient ?. getFile Store ( store Type )?. cached File ( listener . file MetaData Result ?. id Ġ?: Ġ"") ĊĠĠĠĠĠĠĠ ĠassertNotNull ( file MetaData ) ĊĠĠĠĠĠĠĠ Ġremove File ( Store Type . SYNC , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun ĠtestGet Cache File By File Metadata _ Type Sync () Ġ{ ĊĠĠĠĠĠĠĠ ĠtestGet Cache File By File Metadata ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun ĠtestGet Cache File By File Metadata _ Type Network () Ġ{ ĊĠĠĠĠĠĠĠ ĠtestGet Cache File By File Metadata ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun ĠtestGet Cache File By File Metadata _ Type Cache () Ġ{ ĊĠĠĠĠĠĠĠ ĠtestGet Cache File By File Metadata ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun ĠtestGet Cache File By File Metadata _ Type Auto () Ġ{ ĊĠĠĠĠĠĠĠ ĠtestGet Cache File By File Metadata ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun ĠtestGet Cache File By File Metadata ( store Type : ĠStore Type ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File () ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( Store Type . SYNC , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġfile MetaData Ġ= Ġclient ?. getFile Store ( store Type )?. cached File ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( file MetaData ) ĊĠĠĠĠĠĠĠ Ġremove File ( Store Type . SYNC , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Clear Cache Store Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( Store Type . CACHE , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( Store Type . CACHE )?. clear Cache () ĊĠĠĠĠĠĠĠ Ġfind ( Store Type . CACHE , Ġlistener . file MetaData Result , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġremove File ( Store Type . CACHE , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Clear Cache Store Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( Store Type . SYNC , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( Store Type . SYNC )?. clear Cache () ĊĠĠĠĠĠĠĠ Ġfind ( Store Type . SYNC , Ġlistener . file MetaData Result , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġremove File ( Store Type . SYNC , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Clear Cache Store Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( Store Type . AUTO , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( Store Type . AUTO )?. clear Cache () ĊĠĠĠĠĠĠĠ Ġfind ( Store Type . AUTO , Ġlistener . file MetaData Result , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġremove File ( Store Type . AUTO , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtes Upload File Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload File With Metadata ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtes Upload File Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload File With Metadata ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtes Upload File Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload File With Metadata ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtes Upload FileSync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload File With Metadata ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Upload File With Metadata ( type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( type , Ġfile , Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdelete Listener Ġ= Ġremove File ( type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( delete Listener . result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload InputStream With Metadata Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload InputStream With Metadata ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload InputStream With Metadata Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload InputStream With Metadata ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload InputStream With Metadata Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload InputStream With Metadata ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload InputStream With Metadata Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload InputStream With Metadata ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Upload InputStream With Metadata ( type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload InputStream With Metadata ( type , ĠFileInputStream ( file ), Ġtest Metadata ()) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdelete Listener Ġ= Ġremove File ( type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( delete Listener . result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġupload InputStream With Metadata ( store Type : ĠStore Type , Ġ` is `: ĠInputStream , ĠmetaData : ĠFile MetaData ): ĠDefault Upload Progress Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠDefault Upload Progress Listener ( latch ) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. upload (` is `, ĠmetaData , Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtes Upload File With Out Metadata Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload File With Out Metadata ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtes Upload File With Out Metadata Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload File With Out Metadata ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtes Upload File With Out Metadata Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload File With Out Metadata ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtes Upload File With Out Metadata Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload File With Out Metadata ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Upload File With Out Metadata ( type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Out Metadata ( type , Ġfile ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdelete Listener Ġ= Ġremove File ( type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( delete Listener . result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġupload File With Out Metadata ( store Type : ĠStore Type , Ġf : ĠFile ): ĠDefault Upload Progress Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠDefault Upload Progress Listener ( latch ) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. upload ( f , Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload InputStream With FileName Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload InputStream With FileName ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload InputStream With FileName Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload InputStream With FileName ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload InputStream With FileName Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload InputStream With FileName ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload InputStream With FileName Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload InputStream With FileName ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Upload InputStream With FileName ( type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload InputStream With Filename ( type , ĠFileInputStream ( file ), ĠTEST _ FILENAME ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdelete Listener Ġ= Ġremove File ( type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( delete Listener . result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġupload InputStream With Filename ( store Type : ĠStore Type , Ġ` is `: ĠInputStream , ĠfileName : ĠString ): ĠDefault Upload Progress Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠDefault Upload Progress Listener ( latch ) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. upload ( fileName , Ġ` is `, Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Cancel File Up loading Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Cancel File Up loading ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Cancel File Up loading Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Cancel File Up loading ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Cancel File Up loading Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Cancel File Up loading ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Cancel File Up loading Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Cancel File Up loading ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Cancel File Up loading ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( CUSTOM _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġcancel File Up loading ( store Type , Ġfile ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertTrue ( listener . on Cancelled ) ĊĠĠĠĠĠĠĠ ĠassertNull ( listener . error ) ĊĠĠĠĠĠĠĠ ĠassertNull ( listener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Cancel And Resume File Up loading Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Cancel And Resume File Up loading ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Cancel And Resume File Up loading ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( CUSTOM _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġtest Metadata () ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġcancel And Resume File Up loading ( store Type , Ġmetadata , Ġfile ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNull ( listener . error ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcancel File Up loading ( store Type : ĠStore Type , Ġf : ĠFile ): ĠDefault Upload Progress Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠDefault Upload Progress Listener ( latch ) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. upload ( f , Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. is Cancelled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. cancel Up loading () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcancel And Resume File Up loading ( store Type : ĠStore Type , Ġmetadata : ĠFile MetaData ?, Ġf : ĠFile ?): ĠDefault Upload Progress Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Cancel Listener Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġl atch Upload Listener Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġcancel Listener Ġ= ĠResume Upload Progress Listener ( latch Cancel Listener ) ĊĠĠĠĠĠĠĠ Ġval Ġupload Listener Ġ= ĠDefault Upload Progress Listener ( latch Upload Listener ) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. upload ( f , Ġmetadata , Ġcancel Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfile MetaData With Upload Url Ġ= Ġcancel Listener . upload Metadata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file MetaData With Upload Url Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile MetaData With Upload Url Ġ= Ġmetadata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. upload ( f Ġas ĠFile , Ġfile MetaData With Upload Url Ġas ĠFile MetaData , Ġupload Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġl atch Cancel Listener . await () ĊĠĠĠĠĠĠĠ Ġl atch Upload Listener . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġupload Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Cancel File Downloading Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Cancel File Downloading ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Cancel File Downloading Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Cancel File Downloading ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Cancel File Downloading Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Cancel File Downloading ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Cancel File Downloading Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Cancel File Downloading ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Cancel File Downloading ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Out Metadata ( store Type , Ġcreate File ( 1 5 )) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdownload Listener Ġ= Ġcancel File Downloading ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( download Listener . on Cancelled ) ĊĠĠĠĠĠĠĠ ĠassertNull ( download Listener . error ) ĊĠĠĠĠĠĠĠ ĠassertNull ( download Listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdelete Listener Ġ= Ġremove File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( delete Listener . result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcancel File Downloading ( store Type : ĠStore Type , Ġmeta File : ĠFile MetaData ?): ĠDefault Download Progress Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdownload Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠDefault Download Progress Listener ( download Latch ) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( create File ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. download ( meta File , Ġf os , Ġlistener , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store Type Ġ=== ĠStore Type . CACHE ) Ġcreate OutputStream () Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( store Type Ġ=== ĠStore Type . CACHE ) Ġcreate Cached Client Callback () Ġelse Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . is Cancelled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( store Type )?. cancel Downloading () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġdownload Latch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate File ( mb : ĠInt ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File () ĊĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠRandom Access File ( create File (), Ġ" rw ") ĊĠĠĠĠĠĠĠ Ġf . set Length ( mb Ġ* ĠMB . to Long ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Small File (): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File () ĊĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠRandom Access File ( create File (), Ġ" rw ") ĊĠĠĠĠĠĠĠ Ġf . set Length ( 1 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate File ( fileName : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( client ?. context ?. files Dir , ĠfileName ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . createNew File () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate File (): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( client ?. context ?. files Dir , ĠTEST _ FILENAME ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . createNew File () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Public ly Readable File Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Public ly Readable File ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Public ly Readable File Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Public ly Readable File ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Public ly Readable File Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Public ly Readable File ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Public ly Readable FileSync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Public ly Readable File ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Upload Public ly Readable File ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile MetaData Ġ= Ġtest Metadata () ĊĠĠĠĠĠĠĠ Ġfile MetaData . is Public Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( store Type , Ġfile , Ġfile MetaData ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdownload Listener Ġ= Ġdownload File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNull ( download Listener . error ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( download Listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( download Listener . file MetaData Result ?. is Public Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠ Ġremove File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Private ly Readable File Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Private ly Readable File ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Private ly Readable File Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Private ly Readable File ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Private ly Readable File Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Private ly Readable File ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Private ly Readable FileSync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Private ly Readable File ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Upload Private ly Readable File ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile MetaData Ġ= Ġtest Metadata () ĊĠĠĠĠĠĠĠ Ġfile MetaData . is Public Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( store Type , Ġfile , Ġfile MetaData ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdownload Listener Ġ= Ġdownload File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNull ( download Listener . error ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( download Listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġremove File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( download Listener . file MetaData Result ?. is Public Ġ== Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Progress Changing Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Progress Changing ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Progress Changing Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Progress Changing ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Progress Changing Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Progress Changing ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Progress Changing Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Progress Changing ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Upload Progress Changing ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( CUSTOM _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Out Metadata ( store Type , Ġfile ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġif Ġ( store Type Ġ=== ĠStore Type . SYNC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( listener . progress Changed Counter Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( listener . progress Changed Counter Ġ>= ĠCUSTOM _ FILE _ SIZE _ MB Ġ/ ĠUP LOAD _ CHUNK _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdelete Listener Ġ= Ġremove File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( delete Listener . result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download Progress Changing Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Download Progress Changing ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download Progress Changing Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Download Progress Changing ( Store Type . CACHE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download Progress Changing Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Download Progress Changing ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Download Progress Changing Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Download Progress Changing ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Download Progress Changing ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( CUSTOM _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Out Metadata ( store Type , Ġfile ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdownload Listener Ġ= Ġdownload File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( download Listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġif Ġ( store Type Ġ=== ĠStore Type . SYNC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( download Listener . progress Changed Counter Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( download Listener . progress Changed Counter Ġ>= ĠCUSTOM _ FILE _ SIZE _ MB Ġ/ ĠDOWN LOAD _ CHUNK _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdelete Listener Ġ= Ġremove File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( delete Listener . result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Download Progress Changing Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate Small File () ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Out Metadata ( Store Type . NETWORK , Ġfile ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( file . delete ()) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdownload Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġdownload Progress Listener : ĠDefault Download Progress Listener Ġ= Ġspy ( Default Download Progress Listener ( download Latch )) ĊĠĠĠĠĠĠĠ Ġdo Throw ( IOException ()). ` when `( download Progress Listener ). progress Changed ( any ( Media Http Downloader :: class . java )) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( create File ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( Store Type . NETWORK )?. download ( listener . file MetaData Result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf os , Ġdownload Progress Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Progress Listener . on Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġdownload Latch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( download Progress Listener . error ) ĊĠĠĠĠĠĠĠ Ġval Ġdelete Listener Ġ= Ġremove File ( Store Type . NETWORK , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( delete Listener . result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Progress Changing Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate Small File () ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener : ĠDefault Upload Progress Listener Ġ= Ġspy ( Default Upload Progress Listener ( latch )) ĊĠĠĠĠĠĠĠ Ġdo Throw ( IOException ()). ` when `( listener ). progress Changed ( any ( Media Http Uploader :: class . java )) ĊĠĠĠĠĠĠĠ Ġval Ġlo oper Thread Ġ= ĠL ooper Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. getFile Store ( Store Type . NETWORK )?. upload ( file , Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlo oper Thread . start () ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠĠĠ Ġlo oper Thread . m Handler ?. sendMessage ( Message ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( file . delete ()) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Glob ally Readable File ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile MetaData Ġ= Ġtest Metadata () ĊĠĠĠĠĠĠĠ Ġfile MetaData . is Public Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfile MetaData . acl Ġ= ĠAccess Control List (). set Glob ally Readable ( true ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( store Type , Ġfile , Ġfile MetaData ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ Ġval Ġdownload Listener Ġ= Ġdownload File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNull ( download Listener . error ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( download Listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( download Listener . file MetaData Result ?. is Public Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( download Listener . file MetaData Result ?. acl ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( download Listener . file MetaData Result ?. acl ?. is Glob ally Readable Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠ Ġremove File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Glob ally Readable File Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Glob ally Readable File ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Glob ally Readable FileSync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Glob ally Readable File ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġtest Upload Glob ally Readable File Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Glob ally Readable File ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload File Check Upload Url Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload Public ly Readable File ( Store Type . NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload File Check Upload Url Auto () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload File Check Upload Url ( Store Type . AUTO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġtest Upload File Check Upload Url Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Upload File Check Upload Url ( Store Type . SYNC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtest Upload File Check Upload Url ( store Type : ĠStore Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile MetaData Ġ= Ġtest Metadata () ĊĠĠĠĠĠĠĠ Ġfile MetaData . is Public Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File ( DEFAULT _ FILE _ SIZE _ MB ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġupload File With Metadata ( store Type , Ġfile , Ġfile MetaData ) ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNull ( listener . file MetaData Result ?. upload Url ) ĊĠĠĠĠĠĠĠ Ġval Ġdownload Listener Ġ= Ġdownload File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertNull ( download Listener . error ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( download Listener . file MetaData Result ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( download Listener . file MetaData Result ?. is Public Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠ ĠassertNull ( listener . file MetaData Result ?. upload Url ) ĊĠĠĠĠĠĠĠ Ġremove File ( store Type , Ġlistener . file MetaData Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġclient ?. perform Lock Down () ĊĠĠĠĠĠĠĠ Ġif Ġ( Client . kin vey Handler Thread Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. stop Kin vey Handler Thread () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠID Ġ= Ġ"_ id " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTEST _ FILENAME Ġ= Ġ" test . xml " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMB Ġ= Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ FILE _ SIZE _ MB Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCUSTOM _ FILE _ SIZE _ MB Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUP LOAD _ CHUNK _ SIZE _ MB Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDOWN LOAD _ CHUNK _ SIZE _ MB Ġ= Ġ 2 ĊĠĠĠ Ġ} Ċ }