package Ġio . s our cy . retention Ċ Ċ import Ġarrow . core . Either Ċ import Ġarrow . core . getOrElse Ċ import Ġorg . assertj . core . api . Abstract Object Assert Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . opent est 4 j . Test Abort ed Exception Ċ import Ġjava . io . File Ċ import Ġjava . time . format . DateTime ParseException Ċ Ċ class ĠRet ention Logic Test Ġ: ĠAbstract Base Test () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġretention Logic Ġ= ĠRet ention Logic ( build Arguments ( default Test Arguments ), Ġtest Settings ) ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` d ail ies Ġcalculation ` Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` keep s Ġcurrent Ġdaily `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 1 8 - 0 1 - 1 8 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Info ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches Ġ{ Ġit . is Daily Ġ&& Ġ! it . is Expired Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` keep s Ġ 7 Ġd ail ies `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 1 8 - 0 1 - 1 2 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Info ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches Ġ{ Ġit . is Daily Ġ&& Ġ! it . is Expired Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` expires Ġ 8 th Ġdaily `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 1 8 - 0 1 - 1 1 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Info ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches Ġ{ Ġit . is Daily Ġ&& Ġit . is Expired Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` week lies Ġcalculation ` Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` keep s Ġcurrent Ġweekly `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 1 8 - 0 1 - 1 4 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Info ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches Ġ{ Ġit . is Week ly Ġ&& Ġ! it . is Expired Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` keep s Ġ 8 Ġweek lies `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 1 7 - 1 1 - 2 6 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Info ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches Ġ{ Ġit . is Week ly Ġ&& Ġ! it . is Expired Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` expires Ġ 9 th Ġweekly `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 1 7 - 1 1 - 1 9 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Info ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches Ġ{ Ġit . is Week ly Ġ&& Ġit . is Expired Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` month lies Ġcalculation ` Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` keep s Ġcurrent Ġmonthly `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 1 8 - 0 1 - 0 1 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Info ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches Ġ{ Ġit . is Monthly Ġ&& Ġ! it . is Expired Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` keep s Ġ 3 6 Ġmonth lies `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 1 5 - 0 2 - 0 1 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Info ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches Ġ{ Ġit . is Monthly Ġ&& Ġ! it . is Expired Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` expires Ġ 3 7 th Ġmonthly `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 1 5 - 0 1 - 0 1 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Info ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches Ġ{ Ġit . is Monthly Ġ&& Ġit . is Expired Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` expiry Ġcalculation Ġwith Ġfile Ġin Ġmultiple Ġretention Ġsets Ġ( daily , Ġweekly , Ġmonthly )` Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` near Ġfuture Ġ+ Ġall Ġsets Ġ= Ġnot Ġexpired `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 1 7 - 1 0 - 0 1 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Info ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches Ġ{ Ġit . is Daily Ġ&& Ġit . is Week ly Ġ&& Ġit . is Monthly Ġ&& Ġ! it . is Expired Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` far Ġfuture Ġ+ Ġall Ġsets Ġ= Ġexpired `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 0 9 - 1 1 - 0 1 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Info ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches Ġ{ Ġit . is Daily Ġ&& Ġit . is Week ly Ġ&& Ġit . is Monthly Ġ&& Ġit . is Expired Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` near Ġfuture Ġ+ Ġno Ġset Ġ= Ġexpired `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 1 7 - 1 2 - 2 8 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Info ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches Ġ{ Ġit . is Daily Ġ&& Ġ! it . is Week ly Ġ&& Ġ! it . is Monthly Ġ&& Ġit . is Expired Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` date Ġparser ` Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` gener ates Ġerror Ġon Ġinvalid Ġdate `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some _ 2 0 1 7 - 1 0 - 9 9 _ 0 5 - 0 7 - 5 9 . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Error ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isInstanceOf ( DateTime ParseException :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` gener ates Ġerror Ġon Ġmissing Ġdate `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate File ( File (" some . tar . gz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat File Retention Error ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isInstanceOf ( DateTime ParseException :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` keep Ġminimum Ġnumber Ġof Ġfiles Ġin Ġa Ġdirectory `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpired Directory Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList ( 1 5 ) Ġ{ ĠFile (" some dir / some _ 0 0 0 1 - 0 1 -${ String . format ("% 0 2 d ", Ġit Ġ+ Ġ 1 )} _ some . tar . gz ") Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate Directory ( expired Directory ) ĊĠĠĠĠĠĠĠ ĠassertThat Num Min Keep ( result ). isEqualTo ( 1 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` keep Ġminimum Ġnumber Ġof Ġfiles Ġper Ġdirectory `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpired Directories Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList ( 1 5 ) Ġ{ ĠFile (" some dir / some _ 0 0 0 1 - 0 1 -${ String . format ("% 0 2 d ", Ġit Ġ+ Ġ 1 )} _ some . tar . gz ") Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList ( 2 0 ) Ġ{ ĠFile (" some dir / subdir 1 / some _ 0 0 0 1 - 0 1 -${ String . format ("% 0 2 d ", Ġit Ġ+ Ġ 1 )} _ some . tar . gz ") Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList ( 7 ) Ġ{ ĠFile (" some dir / subdir 2 / some _ 0 0 0 1 - 0 1 -${ String . format ("% 0 2 d ", Ġit Ġ+ Ġ 1 )} _ some . tar . gz ") Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretention Logic . calculate ( expired Directories ) ĊĠĠĠĠĠĠĠ ĠassertThat Num Min Keep ( result ). isEqualTo ( 2 7 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠassertThat File Retention Info ( result : ĠEither < Retention Logic . Error , ĠRet ention Logic . File Only Info >): ĠAbstract Object Assert < *, ĠRet ention Logic . File Only Info > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get FileInfo ( result )) ĊĊĠĠĠ Ġprivate Ġfun ĠassertThat File Retention Error ( result : ĠEither < Retention Logic . Error , ĠRet ention Logic . File Only Info >): ĠAbstract Object Assert < *, Ġout ĠThrowable > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( getFile Error ( result ). exception ) ĊĊĠĠĠ Ġprivate Ġfun ĠassertThat Num Min Keep ( result : ĠList < Either < Retention Logic . Error , ĠRet ention Logic . Info >>) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map (:: get Directory Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . is Min Keep Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . is Expired Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġget FileInfo ( result : ĠEither < Retention Logic . Error , ĠRet ention Logic . File Only Info >): ĠRet ention Logic . File Only Info Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . getOrElse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTest Abort ed Exception (" Retention Info . Error Ġ$ result Ġinstead Ġof ĠRet ention Info . File Only Info ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Directory Info ( result : ĠEither < Retention Logic . Error , ĠRet ention Logic . Info >): ĠRet ention Logic . Info Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . getOrElse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTest Abort ed Exception (" Retention Info . Error Ġ$ result Ġinstead Ġof ĠRet ention Info . Info ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetFile Error ( result : ĠEither < Retention Logic . Error , ĠRet ention Logic . File Only Info >): ĠRet ention Logic . Error Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . swap (). getOrElse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTest Abort ed Exception (" Retention Info . File Only Info Ġ$ result Ġinstead Ġof ĠRet ention Info . Error ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }