/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠThe ĠB azel ĠAuthors . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġio . bazel . kotlin Ċ Ċ import Ġcom . google . common . hash . Hash ing Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . time . Instant Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Zone Id Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . jar . Jar Entry Ċ import Ġjava . util . jar . Jar File Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertNotNull Ċ import Ġkotlin . test . assertTrue Ċ import Ġkotlin . test . fail Ċ Ċ class ĠTestCase FailedException ( name : ĠString ? Ġ= Ġnull , Ġdescription : ĠString ? Ġ= Ġnull , Ġcause : ĠThrowable ) Ġ: ĊĠ ĠAssertionError (" """ ${ name ?. let Ġ{ Ġ" jar : Ġ$ it Ġ" Ġ} Ġ?: Ġ"" } Ġ"$ description " Ġfailed , Ġerror : Ġ${ cause . message } """, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcause ) Ċ Ċ abstract Ġclass ĠKotlin Assertion TestCase ( root : ĠString ) Ġ: ĠBasic Assertion TestCase () Ġ{ ĊĠ Ġprivate Ġlateinit Ġvar Ġcurrent File : ĠFile ĊĊĠ Ġprivate Ġval Ġtest Run file Root : ĠPath Ġ= ĠPaths . get ( root ). also Ġ{ ĊĠĠĠ Ġit . to File (). also Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠ Ġassert ( file . exists ()) Ġ{ Ġ" run file Ġdirectory Ġ$ root Ġdoes Ġnot Ġexist " Ġ} ĊĠĠĠĠĠ Ġassert ( file . isDirectory ) Ġ{ Ġ" run file Ġdirectory Ġ$ root Ġis Ġnot Ġa Ġdirectory " Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġinline Ġfun Ġrun TestCase ( name : ĠString , Ġdescription : ĠString ? Ġ= Ġnull , Ġop : Ġ() Ġ-> ĠUnit ) Ġ= ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġop () ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( t ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠAssertionError Ġ-> Ġthrow ĠTestCase FailedException ( name , Ġdescription , Ġt ) ĊĠĠĠĠĠĠĠ Ġis ĠException Ġ-> Ġthrow ĠTestCase FailedException ( name , Ġdescription , Ġt ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġt ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġprotected Ġfun Ġjar TestCase ( name : ĠString , Ġdescription : ĠString ? Ġ= Ġnull , Ġop : ĠJar File . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġcurrent File Ġ= Ġtest Run file Root . resolve ( name ). to File () ĊĠĠĠ Ġcheck ( current File . exists ()) Ġ{ ĊĠĠĠĠĠ Ġ" test File Ġ$ name Ġdid Ġnot Ġexist Ġin Ġtest Ġcase Ġroot Ġ$ test Run file Root " ĊĠĠĠ Ġ} ĊĠĠĠ Ġrun TestCase ( name , Ġdescription ) Ġ{ ĠJar File ( current File ). op () Ġ} ĊĠ Ġ} ĊĊĠ Ġprotected Ġfun ĠJar File . assertContains Entries ( var arg Ġentries : ĠString ) Ġ{ ĊĠĠĠ Ġentries . forEach Ġ{ ĊĠĠĠĠĠ Ġif Ġ( this . get Jar Entry ( it ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfail (" jar Ġ${ this . name } Ġdid Ġnot Ġcontain Ġentry Ġ$ it ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠValid ated Ġthe Ġentry Ġis Ġcompressed Ġand Ġhas Ġthe ĠD OS Ġepoch Ġfor Ġit 's Ġtimestamp . ĊĠĠ Ġ*/ ĊĠ Ġprotected Ġfun ĠJar File . assert Entry Compressed And Normalized Timestamp Year ( entry : ĠString ) Ġ{ ĊĠĠĠ ĠcheckNotNull ( this . get Jar Entry ( entry )). also Ġ{ ĊĠĠĠĠĠ Ġcheck (! it . isDirectory ) ĊĠĠĠĠĠ ĠassertTrue ("$ entry Ġis Ġnot Ġcompressed ") Ġ{ ĠJar Entry . DE FL ATED Ġ== Ġit . method Ġ} ĊĠĠĠĠĠ Ġval Ġmodified Timestamp Ġ= ĠLocalDateTime . of Instant ( ĊĠĠĠĠĠĠĠ ĠInstant . of Epoch Milli ( it . lastModified Time . to Millis ()), ĠZone Id . system Default () ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ ĠassertTrue (" normalized Ġmodification Ġtime Ġstamp s Ġshould Ġhave Ġyear Ġ 1 9 8 0 ") Ġ{ ĊĠĠĠĠĠĠĠ Ġmodified Timestamp . year Ġ== Ġ 1 9 8 0 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAssert Ġthe Ġmanifest Ġin Ġthe Ġjar Ġis Ġstamp ed . ĊĠĠ Ġ*/ ĊĠ Ġprotected Ġfun ĠJar File . assert Manifest Stamp ed () Ġ{ ĊĠĠĠ ĠassertNotNull ( ĊĠĠĠĠĠ Ġmanifest . main Attributes . getValue (" Target - Label "), Ġ" missing Ġmanifest Ġentry ĠTarget - Label " ĊĠĠĠ Ġ) ĊĠĠĠ ĠassertNotNull ( ĊĠĠĠĠĠ Ġmanifest . main Attributes . getValue (" Inject ing - Rule - Kind "), ĊĠĠĠĠĠ Ġ" missing Ġmanifest Ġentry ĠInject ing - Rule - Kind " ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprotected Ġfun Ġvalidate File Sha 2 5 6 ( expected : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠHash ing . sha 2 5 6 (). hash Bytes ( Files . read All Bytes ( current File . to Path ())). toString () ĊĠĠĠ ĠassertEquals ( expected , Ġresult , Ġ" file Ġ$ current File Ġdid Ġnot Ġhash Ġas Ġexpected ") ĊĠ Ġ} ĊĊĠ Ġprotected Ġfun ĠJar File . assert DoesNot Contain Entries ( var arg Ġentries : ĠString ) Ġ{ ĊĠĠĠ Ġentries . forEach Ġ{ ĊĠĠĠĠĠ Ġif Ġ( this . get Jar Entry ( it ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfail (" jar Ġ${ this . name } Ġcontained Ġentry Ġ$ it ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠString . resolve Directory (): ĠFile Ġ= ĊĠĠĠ Ġif Ġ( startsWith ("/ ")) ĊĠĠĠĠĠ Ġtrim Start ('/ '). split ("/ "). let Ġ{ ĠFile ( it . take ( it . size Ġ- Ġ 1 ). join ToString ( File . separator )) Ġ} ĊĠĠĠ Ġelse ĊĠĠĠĠĠ Ġtest Run file Root . to File () Ċ } Ċ Ċ abstract Ġclass ĠBasic Assertion TestCase Ġ{ ĊĠ Ġprotected Ġfun Ġassert Executable Run file Suc ceeds ( executable : ĠString , Ġdescription : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ ĠProcess Builder (). command (" bash ", Ġ"- c ", ĠPaths . get ( executable ). fileName . toString ()) ĊĠĠĠĠĠ Ġ. also Ġ{ Ġit . directory ( executable . resolve Directory ()) Ġ} ĊĠĠĠĠĠ Ġ. start (). let Ġ{ ĊĠĠĠĠĠĠĠ Ġit . waitFor ( 1 0 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġassert ( it . exit Value () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠTestCase FailedException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdescription , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcause Ġ= ĠRuntimeException (" non - zero Ġreturn Ġcode : Ġ${ it . exit Value () }") ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprotected Ġopen Ġfun ĠString . resolve Directory (): ĠFile Ġ= ĊĠĠĠ Ġtrim Start ('/ '). split ("/ "). let Ġ{ ĠFile ( it . take ( it . size Ġ- Ġ 1 ). join ToString ( File . separator )) Ġ} Ċ } Ċ